这里主要是rootless的方案。
在以 root 用户身份运行 Docker 会带来一些潜在的危害和安全风险,这些风险包括:
容器逃逸:如果一个容器以 root 权限运行,并且它包含了漏洞或者被攻击者滥用,那么攻击者可能会成功逃出容器,并在宿主系统上执行恶意操作。这会导致宿主系统的安全性受到威胁。
特权升级:在以 root 用户身份运行 Docker 的情况下,容器内的进程可能会尝试特权升级,获取宿主系统的 root 权限。这可能会导致严重的安全问题,因为攻击者可能会利用这些权限来控制宿主系统。
文件系统访问:以 root 用户身份运行的容器可以访问宿主系统上的文件系统,这可能会导致机密文件的泄漏或文件的损坏。
网络权限:容器以 root 权限运行时,可能会滥用网络权限,例如进行端口扫描、DDoS 攻击等恶意行为。
为了减少这些风险,推荐采取以下做法:
以非root用户身份运行容器:最佳实践是在容器中以非root用户的身份运行应用程序。这可以通过在容器中指定普通用户来实现,并避免使用
USER
指令将容器进程切换到 root 用户。限制容器的权限:使用 Docker 的安全配置选项,如
--security-opt
,可以限制容器的能力,例如禁止容器访问宿主系统的特定目录、文件和设备。更新和监控容器:定期更新容器的基础镜像和应用程序,以确保安全漏洞得到修复。同时,使用容器监控和审计工具来检测不寻常的活动。
限制容器能力:使用 Docker 的能力(capabilities)设置来限制容器的权限,仅提供所需的最小权限来运行应用程序。
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 中已经存在很长时间了
Rootless 模式在用户名称空间内执行Docker守护程序和容器。这与userns-remap
mode非常相似,除了模式之外,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 ,实则不然
• 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 身份运行。