USER namespace有什么能力?
提供用戶隔離能力,隔離用戶的用戶ID與用戶組ID
使用場景
在宿主機(jī)上以一個非root用戶運行創(chuàng)建一個User namespace,然后在User namespace里面卻映射成root用戶
這樣意味著,這個進(jìn)程在User namespace里面有root權(quán)限,但是在User namespace外面卻沒有root的權(quán)限
重映射容器內(nèi)用戶Uid至宿主機(jī)
啟動
nginx
docker run -itd --name nginx nginx
獲取
nginx容器pid
$ ps -ef|grep nginx
root 46991 46971 0 07:58 pts/0 00:00:00 nginx: master process nginx -g daemon off;
101 47051 46991 0 07:58 pts/0 00:00:00 nginx: worker process
101 47052 46991 0 07:58 pts/0 00:00:00 nginx: worker process
101 47053 46991 0 07:58 pts/0 00:00:00 nginx: worker process
101 47054 46991 0 07:58 pts/0 00:00:00 nginx: worker process
root 48582 4609 0 07:59 pts/0 00:00:00 grep --color=auto nginx
進(jìn)入
nginx容器進(jìn)程空間
$ cd /proc/46991
查看
uid_map屬性
$ cat uid_map
0 0 4294967295
- 第一列字段表示在容器顯示的
UID或GID - 第二列字段表示容器外映射的真實的
UID或GID - 第三個字段表示映射的范圍
- 如果為
1,表示一一對應(yīng)(內(nèi)部與外部uid一一對應(yīng)) - 如果為
4294967295,表示把namespace內(nèi)部從0開始的uid映射到外部從0開始的uid,
其最大范圍是無符號32位整形
- 如果為
上述nginx進(jìn)程表示,容器內(nèi)的nginx: master用戶為root權(quán)限,即在容器外部也有root權(quán)限
docker啟用用戶命名空間
由上述步驟我們可知,默認(rèn)docker未啟用用戶命名空間,容器內(nèi)的uid與宿主機(jī)一致
如容器內(nèi)使用root(uid=0)啟動服務(wù),有安全風(fēng)險(宿主機(jī)視角也是root用戶)
修改系統(tǒng)參數(shù)
$ sed -i "/user.max_user_namespaces/d" /etc/sysctl.conf
$ echo "user.max_user_namespaces=15511" >> /etc/sysctl.conf
$ sysctl -p
編輯配置文件
$ vi /etc/docker/daemon.json
添加參數(shù)"userns-remap": "default",
參考配置:
{
"log-opts": {
"max-size": "5m",
"max-file":"3"
},
"userns-remap": "default",
"exec-opts": ["native.cgroupdriver=systemd"]
}
重載服務(wù)
$ systemctl daemon-reload
$ systemctl restart docker
啟動一個容器
$ docker rm -f nginx
$ docker run -itd --name nginx nginx
查看容器內(nèi)進(jìn)程用戶
$ ps -p $(docker inspect --format='{{.State.Pid}}' $(docker ps |grep ccc|awk '{print $1}')) -o pid,user
PID USER
2535 100000