在Linux系统中有一部分知识非常重要,就是关于权限的管理控制;Linux系统的权限管理是由uid和gid负责,Linux系统会检查创建进程的uid和gid,以确定它是否有足够的权限修改文件,而非是通过用户名和用户组来确认。同样,在docker容器中主机上运行的所有容器共享同一个内核也可以理解为共享权限管理方式。

Docker容器的权限管理方式分为了三种情况:
1.默认使用的root权限
不管是以root用户还是以普通用户(有启动docker容器的权限)启动docker容器,容器进程和容器内的用户权限都是root!
新建了sleep用户,以sleep用户权限启动容器并在有root权限的磁盘进行权限测试。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
docker run -v /data/sleep:/sleep  -d --name sleep-1 ubuntu sleep infinity

在宿主机中/data/sleep路径新建了leo_zhou文件并在文件写入“docker”,然后进入sleep-1容器

docker exec -it sleep-1 bash

Docker容器中用户权限管理 Cloud 第1张
依然可以正常操作拥有root权限的文件。

2.限制Docker容器启动的用户
新增--user参数,使容器启动用户变成指定的sleep用户,发现并不能操作拥有root权限的文件了。会发现容器中的uid号和实际主机中的uid号一样,也验证了docker容器使用宿主机的内核。可以一定程度进行权限管理。
Docker容器中用户权限管理 Cloud 第2张

3.使用namespace隔离技术
namespace是一种隔离技术,docker就是使用隔离技术开启特定的namespace创建出一些特殊的进程,不过使用namespace是有条件的。系统会创建dockremap,通过/etc/subuid/etc/subuid对应的id值,映射到容器中去;实际情况还是使用的是dockremap普通权限,达到自动隔离的效果。
①开启Centos内核中关闭的user namespace的功能。

grubby --args="namespace.unpriv_enable=1 user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
echo "user.max_user_namespaces=15076" >> /etc/sysctl.conf

②修改/etc/docker/daemon.json配置,新增"userns-remap": "default"选项,default默认就是docker自动创建的用户dockremap,然后重启docker。
修改此项配置需要慎重,如果是已经部署了一套docker环境,启用此选项后,会切换到隔离环境,以前的docker容器将无法使用!
Docker容器中用户权限管理 Cloud 第3张
③Centos需要手动输入id值映射范围
Docker容器中用户权限管理 Cloud 第4张

最后systemctl restart docker后再次测试效果,发现文件权限已经变成nobody,但docker容器内部依然是以"root"的权限管理,但实际只有普通用户的权限,从而达到权限隔离的效果。
Docker容器中用户权限管理 Cloud 第5张

Docker容器中用户权限管理 Cloud 第6张

Docker容器中用户权限管理 Cloud 第7张

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄