以下文章来源于运维自习室 ,作者运维自习室
Rootless模式的目的是让Docker守护进程以非root用户身份运行。该方案以实验特性的方式在v19.03版本引入,并在v20.10版本成为正式功能。
实践
官方文档已经做了详细的介绍,这里仅仅做一下实践复现。
具体实践环境为:
CentOS 7.2
docker-ce 23.0.0
详细安装升级过程就略过了。CentOS 7.2上默认安装的docker 是1.13版本,需要升级到v20.10以上版本。
第一步,用户准备。
准备一个普通用户u,后续就使用它来运行docker了。配置subuid、subgid、max_user_namespaces等信息,做好准备工作。
useradd rootless
sysctl user.max_user_namespaces=28633
第二步,从官方下载rootless脚本,并运行。
curl -fsSL https://get.docker.com/rootless | sh
运行成功后,会在用户目录下创建bin目录,包含了dockerd-rootless.sh等文件。
根据提示需要设置一些环境变量。可以把环境变量配置写入~/.bashrc,并执行source ~/.bashrc
命令使之生效。
export XDG_RUNTIME_DIR=/home/u/.docker/run
export PATH=/home/u/bin:$PATH
export DOCKER_HOST=unix:///home/u/.docker/run/docker.sock
第三步,启动docker服务。
一般情况下,可以使用systemctl方式运行,在后台启动docker服务。
$ systemctl --user restart docker
但是 CentOS 7 不支持这种方式,可以直接运行dockerd-rootless.sh脚本来启动docker服务。
$ dockerd-rootless.sh
运行后,可以看到docker的服务都是以普通用户u的身份运行。
使用rootless模式后,从安全角度考虑,也就没必要再使用root以及其他用户操作docker了。
效果
在rootless模式下启动nginx容器后。
容器内,依然可以看到root身份的master进程和nginx身份的worker进程。此时容器内应用以为自己使用的是root用户身份。
实际上,宿主机上,因为user namespaces机制的缘故,这些进程也只是普通用户身份。
总结
Docker Rootless模式是官方提供的一种安全解决方案,可以让Docker守护进程以普通用户身份运行,从而避免容器应用利用Docker漏洞获得宿主机root权限的风险。
另外,要注意的是因为Docker作为容器本身需要利用很多系统高级特性,因此Docker守护进程以非Root身份运行实际上也会导致一些功能受限。这点可以参与官方文档详细了解。
至此Docker的用户安全机制,基本了解完毕。只要清楚地掌握容器的安全机制,做好日常安全管理和风险响应,可以为容器应用化提供较好的安全保障。