USER命名空间
USER namespace
有什么能力?
提供用户隔离能力,隔离用户的用户ID
与用户组ID
使用场景
在宿主机上以一个非root
用户运行创建一个User namespace
,然后在User namespace
里面却映射成root
用户
这样意味着,这个进程在User namespace
里面有root
权限,但是在User namespace
外面却没有root
的权限
重映射容器内用户Uid至宿主机
启动
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
进入
nginx
容器进程空间
$ cd /proc/46991
查看
uid_map
属性
$ cat uid_map
0 0 4294967295
- 第一列字段表示在容器显示的
UID
或GID
- 第二列字段表示容器外映射的真实的
UID
或GID
- 第三个字段表示映射的范围
- 如果为
1
,表示一一对应(内部与外部uid
一一对应) - 如果为
4294967295
,表示把namespace
内部从0
开始的uid
映射到外部从0
开始的uid
, 其最大范围是无符号32
位整形
- 如果为
上述nginx
进程表示,容器内的nginx: master
用户为root
权限,即在容器外部也有root
权限
docker启用用户命名空间
由上述步骤我们可知,默认docker
未启用用户命名空间,容器内的uid
与宿主机一致
如容器内使用root
(uid=0)启动服务,有安全风险(宿主机视角也是root用户)
修改系统参数
$ 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
添加参数"userns-remap": "default",
参考配置:
{
"log-opts": {
"max-size": "5m",
"max-file":"3"
},
"userns-remap": "default",
"exec-opts": ["native.cgroupdriver=systemd"]
}
重载服务
$ systemctl daemon-reload
$ systemctl restart docker
启动一个容器
$ docker rm -f nginx
$ docker run -itd --name nginx nginx
查看容器内进程用户
$ ps -p $(docker inspect --format='{{.State.Pid}}' $(docker ps |grep ccc|awk '{print $1}')) -o pid,user
PID USER
2535 100000