描述
在Docker守護程序中啟用用戶命名空間支持,可對用戶進行重新映射。該建議對鏡像中沒有指定用戶是有幫助的。
如果在容器鏡像中已經(jīng)定義了非root運行,可跳過此建議。
隱患分析
Docker守護程序中對Linux內核用戶命名空間支持為Docker主機系統(tǒng)提供了額外的安全性。
它允許容器具有獨特的用戶和組ID,這些用戶和組ID在主機系統(tǒng)所使用的傳統(tǒng)用戶和組范圍之外。
例如,root用戶希望有容器內的管理權限,可映射到主機系統(tǒng)上的非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
修復建議
修改系統(tǒng)參數(shù)
$ 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添加參數(shù)--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官方文檔