启用用户命名空间
描述
在Docker
守护程序中启用用户命名空间支持,可对用户进行重新映射。该建议对镜像中没有指定用户是有帮助的。如果在容器镜像中已经
定义了非root
运行,可跳过此建议。
隐患分析
Docker
守护程序中对Linux
内核用户命名空间支持为Docker
主机系统提供了额外的安全性。
它允许容器具有独特的用户和组ID
,这些用户和组ID
在主机系统所使用的传统用户和组范围之外。
例如,root
用户希望有容器内的管理权限,可映射到主机系统上的非root
的UID
上
审计
如果容器进程以root
身份运行,则不符合安全要求
[root@localhost ~]# ps -ef|grep 15eebdabbb8b
root 80060 73608 0 04:03 ? 00:00:00 containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/15eebdabbb8bd59366348ae95a89d79100370b9c9381b070fdfbb0119b516400 -address /var/run/docker/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc -systemd-cgroup
root 111259 1482 0 07:08 pts/0 00:00:00 grep --color=auto 15eebdabbb8b
修复建议
修改系统参数
$ sed -i "/user.max_user_namespaces/d" /etc/sysctl.conf
$ echo "user.max_user_namespaces=15000" >> /etc/sysctl.conf
$ sysctl -p
编辑配置文件
$ vi /etc/systemd/system/docker.service
ExecStart=/usr/bin/dockerd
添加参数--userns-remap=default
重载服务
$ systemctl daemon-reload
$ systemctl restart docker
启动一个容器
[root@localhost ~]# docker run -idt --name ccc alpine
查看容器内进程用户
[root@localhost ~]# ps -p $(docker inspect --format='{{.State.Pid}}' $(docker ps |grep ccc|awk '{print $1}')) -o pid,user
PID USER
2535 100000
参考文档
- Docker容器最佳安全实践白皮书(V1.0)
- Docker官方文档