怎么对码头工人容器中的用户进行隔离

  介绍

怎么对码头工人容器中的用户进行隔离?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强>用户名称空间的用户映射

在配置码头工人守护进程启用用户名称空间前,我需要先来了解一些关于从属(下属)用户/组和映射(重新映射)的概念。从属用户和组的映射由两个配置文件来控制,分别是/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 的用户:

怎么对docker容器中的用户进行隔离

然后查看/etc/subuid 和/etc/subgid 文件中是否添加了新用户 dockremap 相关的项:

怎么对docker容器中的用户进行隔离

接下来我们发现在/var/lib/docker 目录下新建了一个目录: 165536.165536,查看该目录的权限:

怎么对docker容器中的用户进行隔离

165536 是由用户 dockremap 映射出来的一个 uid。查看 165536.165536 目录的内容:

怎么对docker容器中的用户进行隔离

与/var/lib/docker 目录下的内容基本一致,说明启用用户隔离后文件相关的内容都会放在新建的 165536.165536 目录下。

通过上面的检查,我们可以确认 docker daemon 已经启用了用户隔离的功能。

宿主机中的 uid 与容器中 uid

在 docker daemon 启用了用户隔离的功能后,让我们看看宿主机中的 uid 与容器中 uid 的变化。

$ docker run -d --name sleepme ubuntu sleep infinity

怎么对docker容器中的用户进行隔离

uid 165536 是用户 dockremap 的一个从属 ID,在宿主机中并没有什么特殊权限。然而容器中的用户却是 root,这样的结果看上去很完美:

怎么对码头工人容器中的用户进行隔离