美文网首页
容器学习笔记之用户命名空间

容器学习笔记之用户命名空间

作者: 微凉哇 | 来源:发表于2023-07-31 14:12 被阅读0次

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

参考文献

相关文章

  • 给网络命名空间增加或删除网卡(容器通用)

    上次学习了网络命名空间,那么如何进入容器的命名空间呢? 运行的容器都对应一个PID,每个PID都有自己的命名空间。...

  • nsenter命令

    作用: 进入其他linux命名空间执行操作。如从主机进入容器的命名空间,或者从容器进入主机的命名空间。一般情况下,...

  • 十三、docker网络的命名空间

    查看当前电脑的全名空间 查看docker容器中的网络命名空间 查看本机有的网络命名空间 删除网络命名空间 添加网络...

  • kubernetes flannel 网络流程熟练

    pod IPdocker 把容器网络命名空间隐藏起来了,查看容器网络需要把对应的网络命名空间显示出来:容器Id:1...

  • 容器安全之命名空间加固

    不共享主机的UTS命令空间 描述 UTS命名空间提供两个系统标识符的隔离:主机名和NIS域名。它用于设置在该名称空...

  • linux内核的命名空间

    命名空间是linux内核针对实现容器虚拟化映入的一个特性。 命名空间的作用:它让我们创建的每个容器都有自己的命名空...

  • STL容器之字符串

    STL容器之字符串 STL容器字符串的简单介绍   #include 作为头文件引入, 需要使用std的命名空间...

  • iptables和netfilter

    前段时间学习了docker容器网络中bridge模式,linux下端口转发(iptables)和网络命名空间ip ...

  • 十三、docker命名空间二

    创建一个docker网络 查看docker 的网络空间 查看命名空间连接情况 启动一个新的容器连接新的命名空间--...

  • TypeScript基础入门之命名空间(二)

    转载 # TypeScript基础入门之命名空间(二) 继续上篇文章[TypeScript基础入门之命名空间(一)...

网友评论

      本文标题:容器学习笔记之用户命名空间

      本文链接:https://www.haomeiwen.com/subject/umtyaltx.html