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
  • 第一列字段表示在容器显示的UIDGID
  • 第二列字段表示容器外映射的真实的UIDGID
  • 第三个字段表示映射的范围
    • 如果为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

参考文献

Copyright © weiliang 2021 all right reserved,powered by Gitbook本书发布时间: 2024-04-22 16:03:41

results matching ""

    No results matching ""