怎么对码头工人容器中的用户进行隔离?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
<强>用户名称空间的用户映射强>
在配置码头工人守护进程启用用户名称空间前,我需要先来了解一些关于从属(下属)用户/组和映射(重新映射)的概念。从属用户和组的映射由两个配置文件来控制,分别是/etc/subuid和/etc/subgid。看下它们的默认内容:在配置码头工人守护进程启用用户名称空间前,我需要先来了解一些关于从属(下属)用户/组和映射(重新映射)的概念:
对于subuid,这一行记录的含义为:
用户尼克,在当前的用户名称空间中具有65536个从属用户,用户ID为100000 - 165535,在一个用户子名称空间中,这些从属用户被映射成ID为0 - 65535的用户.subgid的含义和subuid相同。
比如说用户尼克在宿主机上只是一个具有普通权限的用户。我们可以把他的一个从属ID(比如100000)分配给容器所属的用户名称空间,并把ID 100000映射到该用户名称空间中的uid 0。此时即便容器中的进程具有根权限,但也仅仅是在容器所在的用户名称空间中,一旦到了宿主机中,你顶多也就有尼克用户的权限而已。
当开启码头工人对用户名称空间的支持时(码头工人的userns-remap功能),我们可以指定不同的用户映射到容器中。比如我们专门创建一个用户dockeruser,然后手动设置其subuid和subgid:
尼克:100000:65536 dockeruser: 165536:65536
并把它指定给码头工人守护进程:
{ ,“userns-remap":“dockeruser" }
请注意subuid的设置信息,我们为dockeruser设置的从属ID和尼克用户是不重叠的,实际上任何用户的从属ID设置都是不能重叠的。
或者一切从简,让码头工人为我们包办这些繁琐的事情,直接把码头工人守护进程的userns-rempa参数指定为“default":
{ ,“userns-remap":“default" }
这时,码头工人会自动完成其它的配置。
<强>配置码头工人守护进程启用用户隔离强>
这里笔者采取简单的方式,让码头工人创建默认的用户用于用户名称空间。我们需要先创建/etc/docker/daemon.json文件:
,美元sudo touch /etc/码头工人/daemon.json
然后编辑其内容如下(如果该文件已经存在,仅添加下面的配置项即可),并重启码头工人服务:
{ ,“userns-remap":“default" }
,美元sudo systemctl restart 码头工人。service
下面我们来验证几个关于用户隔离的几个点。
首先验证 docker 创建了一个名为 dockremap 的用户:
然后查看/etc/subuid 和/etc/subgid 文件中是否添加了新用户 dockremap 相关的项:
接下来我们发现在/var/lib/docker 目录下新建了一个目录: 165536.165536,查看该目录的权限:
165536 是由用户 dockremap 映射出来的一个 uid。查看 165536.165536 目录的内容:
与/var/lib/docker 目录下的内容基本一致,说明启用用户隔离后文件相关的内容都会放在新建的 165536.165536 目录下。
通过上面的检查,我们可以确认 docker daemon 已经启用了用户隔离的功能。
宿主机中的 uid 与容器中 uid
在 docker daemon 启用了用户隔离的功能后,让我们看看宿主机中的 uid 与容器中 uid 的变化。
$ docker run -d --name sleepme ubuntu sleep infinity
uid 165536 是用户 dockremap 的一个从属 ID,在宿主机中并没有什么特殊权限。然而容器中的用户却是 root,这样的结果看上去很完美: