Rootless 模式允许以非 root 用户身份运行 Docker 守护进程(dockerd)和容器,以缓解 Docker 守护进程和容器运行时中潜在的漏洞。Rootless 模式是在 Docker v19.03 版本作为实验性功能引入的,在 Docker v20.10 版本 GA。
Rootless 模式目前对 Cgroups 资源控制,Apparmor 安全配置,Overlay 网络,存储驱动等还有一定的限制,暂时还不能完全取代 “Rootful” Docker。关于 Docker Rootless 的详细信息参见 Docker 官方文档 https://docs.docker.com/engine/security/rootless/
Rootless 模式利用 user namespaces 将容器中的 root 用户和 Docker 守护进程(dockerd)用户映射到宿主机的非特权用户范围内。Docker 此前已经提供了 --userns-remap 标志支持了相关能力,提升了容器的安全隔离性。Rootless 模式在此之上,让 Docker 守护进程也运行在重映射的用户名空间中。
具体步骤如下(centOS):
创建non-root用户并设置密码:
用户名:rootless 密码:123456
useradd rootless
echo 123456 | passwd rootless --stdin
安装 newuidmap和newgidmap 工具
cat <<EOF | sudo sh -x
curl -o /etc/yum.repos.d/vbatts-shadow-utils-newxidmap-epel-7.repo https://copr.fedorainfracloud.org/coprs/vbatts/shadow-utils-newxidmap/repo/epel-7/vbatts-shadow-utils-newxidmap-epel-7.repo
yum install -y shadow-utils46-newxidmap
cat <<EOT >/etc/sysctl.conf
user.max_user_namespaces = 28633
EOT
sysctl --system
EOF
官方文档里有说明:需要为用户创建至少65536个从属用户的组和映射,使用以下命令创建:
echo "rootless:100000:65536" | tee /etc/subuid
echo "rootless:100000:65536" | tee /etc/subgid
对于 subuid,这一行记录的含义为: 用户 rootless,在当前的 user namespace 中具有 65536 个从属用户,用户 ID 为 100000-165535,在一个子 user namespace 中,这些从属用户被映射成 ID 为 0-65535 的用户。subgid 的含义和 subuid 相同。
比如说用户 rootless 在宿主机上只是一个具有普通权限的用户。我们可以把他的一个从属 ID (比如 100000 )分配给容器所属的 user namespace,并把 ID 100000 映射到该 user namespace 中的 uid 0。此时即便容器中的进程具有 root 权限,但也仅仅是在容器所在的 user namespace 中,一旦到了宿主机中,顶多也就有 rootless 用户的权限而已。
官方文档推荐安装:
sudo dnf install -y fuse-overlayfs
sudo dnf install -y iptables
暂停主机docker服务:
sudo systemctl disable --now docker.service docker.socket
进入/usr/bin,目录下有两个脚本:
dockerd-rootless-setuptool.sh
dockerd-rootless.sh
切换用户:
su - rootless
首先运行./dockerd-rootless-setuptool.sh install
接下来也许会出现报错信息,需要切换到root用户按照提示进行操作,之后切换回rootless用户
成功执行之后会出现安装成功的信息,然后根据提示将部分变量导入~/.bashrc,然后执行source ~/.bashrc
执行./dockerd-rootless.sh
在root用户下启用docker服务
sudo systemctl enable --now docker.service docker.socket
实践中出现的问题
执行./dockerd-rootless.sh时出现问题,显示如下信息后自动退出
failed to start containerd: timeout waiting for containerd to start
在网上搜索无果。
使用ps aux|grep docker,查看本账号进程和其他成功执行账号进程的区别,发现本账号containerd进程以错误配置文件启动
具体信息如下:
本账号containerd进程运行命令:
containerd -- config /run/user/2006/docker/containerd/containerd.toml
根据其他用户成功运行的情况,正确的进程启动命令应当是:
containerd --config /home/zenghui_wang/.docker/run/docker/containerd/containerd.toml
1.使用kill命令杀死本账号下所有docker进程
2.删除/home/zenghui_wang/.docker/run/docker/containerd/目录下的containerd.pid
3.重新执行命令/usr/bin/dockerd-rootless.sh
评论讨论