天天看点

使用Docker Rootless模式,运行容器服务

作者:神奇的工程师

之前,介绍了如何使用User Namespaces来隔离Docker容器应用,实现以普通用户权限运行容器应用,保障宿主机的安全。

应该说,这种方式已经比较安全。

只不过此时Docker守护进程(Dockerd)依然是以root身份运行。为了解决Docker使用root用户身份运行的安全风险,Docker给出了Rootless mode方案:Run the Docker daemon as a non-root user (Rootless mode)。

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           
使用Docker Rootless模式,运行容器服务
sysctl user.max_user_namespaces=28633           

第二步,从官方下载rootless脚本,并运行。

curl -fsSL https://get.docker.com/rootless | sh           
使用Docker Rootless模式,运行容器服务

运行成功后,会在用户目录下创建bin目录,包含了dockerd-rootless.sh等文件。

使用Docker Rootless模式,运行容器服务

​根据提示需要设置一些环境变量。可以把环境变量配置写入~/.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的身份运行。

使用Docker Rootless模式,运行容器服务

​使用rootless模式后,从安全角度考虑,也就没必要再使用root以及其他用户操作docker了。

效果

在rootless模式下启动nginx容器后。

容器内,依然可以看到root身份的master进程和nginx身份的worker进程。此时容器内应用以为自己使用的是root用户身份。

使用Docker Rootless模式,运行容器服务

实际上,宿主机上,因为user namespaces机制的缘故,这些进程也只是普通用户身份。

使用Docker Rootless模式,运行容器服务

总结

Docker Rootless模式是官方提供的一种安全解决方案,可以让Docker守护进程以普通用户身份运行,从而避免容器应用利用Docker漏洞获得宿主机root权限的风险。

另外,要注意的是因为Docker作为容器本身需要利用很多系统高级特性,因此Docker守护进程以非Root身份运行实际上也会导致一些功能受限。这点可以参与官方文档详细了解。

介绍完Docker Rootless,也对容器的用户安全机制有了一定的了解。只要清楚地掌握容器的安全机制,做好日常安全管理和风险响应,可以为容器应用化提供较好的安全保障。