在以 root 用户身份运行 docker 会带来一些潜在的危害和安全风险,这些风险包括:
1. 容器逃逸:如果一个容器以 root 权限运行,并且它包含了漏洞或者被攻击者滥用,那么攻击者可能会成功逃出容器,并在宿主系统上执行恶意操作。这会导致宿主系统的安全性受到威胁。
2. 特权升级:在以 root 用户身份运行 docker 的情况下,容器内的进程可能会尝试特权升级,获取宿主系统的 root 权限。这可能会导致严重的安全问题,因为攻击者可能会利用这些权限来控制宿主系统。
3. 文件系统访问:以 root 用户身份运行的容器可以访问宿主系统上的文件系统,这可能会导致机密文件的泄漏或文件的损坏。
4. 网络权限:容器以 root 权限运行时,可能会滥用网络权限,例如进行端口扫描、ddos 攻击等恶意行为。
为了减少这些风险,推荐采取以下做法:
• 以非root用户身份运行容器:最佳实践是在容器中以非root用户的身份运行应用程序。这可以通过在容器中指定普通用户来实现,并避免使用 user 指令将容器进程切换到 root 用户。
• 限制容器的权限:使用 docker 的安全配置选项,如 --security-opt,可以限制容器的能力,例如禁止容器访问宿主系统的特定目录、文件和设备。
• 更新和监控容器:定期更新容器的基础镜像和应用程序,以确保安全漏洞得到修复。同时,使用容器监控和审计工具来检测不寻常的活动。
• 限制容器能力:使用 docker 的能力(capabilities)设置来限制容器的权限,仅提供所需的最小权限来运行应用程序。
什么东西看似rootless ,实则不然
• docker run --user foo:它允许你以非 root 身份在容器中执行进程。值得注意的是,你无法执行包安装等特权活动。runc、containerd 等仍以 root 身份运行。
• usermod -ag docker foo:允许非root用户连接到docker套接字。相当于允许用户以 root 身份运行。
• sudo docker和chmod +s dockerd: 无需解释
• dockerd --userns-remap:它允许你以非 root 身份运行容器。runc、containerd 等仍然以 root 身份运行。
docker rootless 基本概念
docker rootless 是一种在非特权模式下运行 docker 的方式,允许以非root用户身份来管理 docker 守护进程和容器,以降低潜在的安全漏洞风险。在这种模式下,即使在 docker 安装期间,也无需使用root权限。这有助于提高容器的安全性,因为以非特权用户身份运行容器可以限制容器内部的特权操作。对于特权模式的 docker 容器,攻击者可能会利用宿主机文件读写权限等漏洞来逃逸,因此非特权模式更为安全。
同时,在 docker 中,容器可以选择是否以特权模式运行,通过设置 --privileged=false 可以将容器切换为非特权模式。总的来说,docker rootless 模式提供了一种更加安全的方式来运行 docker 容器,降低了潜在的安全风险,特别是在多租户环境中或需要更严格的容器隔离时,这种模式非常有用。
rootless 模式允许以非 root 用户身份运行 docker 守护进程(dockerd)和容器,以缓解 docker 守护进程和容器运行时中潜在的漏洞。
rootless 模式是在 docker v19.03 版本作为实验性功能引入的,在 docker v20.10 版本 ga。
rootless 模式如何运作
rootless 模式利用 user namespaces 将容器中的 root 用户和 docker 守护进程(dockerd)用户映射到宿主机的非特权用户范围内。docker 此前已经提供了 --userns-remap 标志支持了相关能力,提升了容器的安全隔离性。rootless 模式在此之上,让 docker 守护进程也运行在重映射的用户名空间中。
用户命名空间自 linux 内核 v3.8 以来就已存在,因此该功能在 docker 中已经存在很长时间了 。
img
rootless 模式在用户名称空间内执行docker守护程序和容器。这与userns-remapmode非常相似,除了模式之外,userns-remap守护进程本身以root特权运行,而在rootless 模式下,守护程序和容器都在没有root特权的情况下运行。
rootless 模式不使用具有setuid位或文件功能的二进制文件,除了newuidmap和newgidmap,它们是允许在用户名称空间中使用多个uid / gid所必需的。
rootless 模式已知限制
• 仅支持以下存储驱动程序:
• overlay2 (仅在以5.11或更高版本的内核,ubuntu风格的内核或debian风格的内核运行时)
• fuse-overlayfs(仅在与内核4.18或更高版本一起运行且fuse-overlayfs已安装的情况下)
• btrfs(仅在使用内核4.18或更高版本运行,或~/.local/share/docker通过user_subvol_rm_allowedmount选项安装时)
• vfs
• 仅当与cgroup v2和systemd一起运行时,才支持cgroup。请参阅限制资源。
• 不支持以下功能:
• apparmor
• 检查站
• 叠加网络
• 暴露sctp端口
• 要使用该ping命令,请参阅路由ping数据包。
• 要公开特权tcp / udp端口(<1024),请参阅公开特权端口。
• ipaddress显示在中,docker inspect并在rootlesskit的网络名称空间中命名。这意味着如果不nsenter进入网络名称空间,则无法从主机访问ip地址。
• 主机网络(docker run --net=host)。
rootless 模式实践
实践环境
本文使用 centos 7.5 操作系统的虚拟机进行实验。
$ cat /etc/redhat-releasecentos linux release 7.5.1804 (core)
创建普通用户
$ useradd rootless$ echo 123456 | passwd rootless --stdin
安装依赖
rootless 模式可以在没有 root 权限的情况下运行 docker 守护进程和容器, 但是需要安装 newuidmap和newgidmap 工具,以便在用户命名空间下创建从属(subordinate)用户和组的映射(remapping)。通过以下命令安装 newuidmap 和 newgidmap 工具。
cat <
80/tcp bold_stonebraker
访问容器。
$ curl http://localhost:8080# 返回结果 nginx 欢迎界面welcome to nginx!welcome to nginx!if you see this page, the nginx web server is successfully installed andworking. further configuration is required.
for online documentation and support please refer tonginx.org.
commercial support is available atnginx.com.
thank you for using nginx.
rootless 模式调试技巧
进入dockerd名称空间
dockerd-rootless.sh脚本,会在其自己的user,mount和network 名称空间中执行dockerd。
为了进行调试,你可以通过以下明立进入名称空间rootless 模式
nsenter -u --preserve-credentials -n -m -t $(cat $xdg_runtime_dir/docker.pid)
rootless 模式卸载
要删除docker守护程序的systemd服务,请运行dockerd-rootless-setuptool.sh uninstall:
dockerd-rootless-setuptool.sh 默认位置:/home/rootless/bin/dockerd-rootless-setuptool.sh
$ dockerd-rootless-setuptool.sh uninstall+ systemctl --user stop docker.service+ systemctl --user disable docker.serviceremoved /home/testuser/.config/systemd/user/default.target.wants/docker.service.[info] uninstalled docker.service[info] this uninstallation tool does not remove docker binaries and data.[info] to remove data, run: `/usr/bin/rootlesskit rm -rf /home/testuser/.local/share/docker`
要删除数据目录,请运行rootlesskit rm -rf ~/.local/share/docker。
要删除二进制文件,docker-ce-rootless-extras请在软件包管理器中安装了docker的情况下删除软件包。如果你使用https://get.docker.com/rootless安装了docker,请删除以下二进制文件`~/bin`:
$ cd ~/bin$ rm -f containerd containerd-shim containerd-shim-runc-v2 ctr docker docker-init docker-proxy dockerd dockerd-rootless-setuptool.sh dockerd-rootless.sh rootlesskit rootlesskit-docker-proxy runc vpnkit
rootless docker 与 podman
redhat inc 的 podman 是另一种流行的容器引擎,用于运行和管理容器。它被誉为以rootless 运行是其相对于 docker 引擎的功能之一。通过rootless docker ,弥合了差距,现在它们具有几乎相同的功能和几乎相同的性能。他们之间还使用大量相同的代码。
rootless docker 不支持指定 docker run --net=host 。但如果你确实需要使用 docker run --net=host,podman 可能是你更好的选择。
总结
docker rootless模式是官方提供的一种安全解决方案,可以让docker守护进程以普通用户身份运行,从而避免容器应用利用docker漏洞获得宿主机root权限的风险。
另外,要注意的是因为docker作为容器本身需要利用很多系统高级特性,因此docker守护进程以非root身份运行实际上也会导致一些功能受限。这点可以参与官方文档详细了解。
FTTH光网络技术及应用
破局重构 加速向新 | FCS 2022第六届中国银行数字科技年会正式启动!邀您一同相聚北京
微软云服务使用量暴增775% 没有出现严重服务中断
华为公布“基于人体通信的电子设备、通信装置和系统”专利
满足智能手机应用要求的安森美半导体音频放大器方案
Docker Rootless的基本概念 Rootless模式如何运作
三星折叠手机设计通过法国技术耐用性测试
连续供墨系统常识
帮助监测森林火灾无线传感器网络设计
技术分析:开关电源用新型零功耗AC/DC转换器
手机无线充电标准之争或在2014见分晓
高频疲劳试验机,常见故障问题有哪些?又该如何解决?
MCS51和8051一样吗?有什么区别
AI大咖齐聚上海外国语大学 共同研讨“人工智能生态链”
DNS劫持的工作原理和解决方案
威盛电子打造人工智能嵌入式平台,专注于计算机视觉和无人驾驶
比特币勒索病毒再放大招,这些人要注意了!怎样在勒索病毒的攻击下保护好文档?
未来大有可为的智能家居
SPMC65P2408A在空调中的应用
BrainChip与MYWAI建立合作,助力边缘人工智能解决方案