Docker容器内用户与宿主机用户之间的关系

在未指定Docker容器内用户时,Docker容器内部用户默认是root用户,即使是普通用户执行的命令也是以root用户的身份。可以通过“--user”或“-u”参数指定容器内用户:如:

docker run -it --user 1001:1001 ubuntu /bin/bash

指定了容器内用户为UID为1001的用户。

可以使用命令:“id”或者“echo $UID”显示当前登录用户的ID。

Linux中只有一个内核,也就是Docker中的内核同样为宿主机的内核,而内核管理用户是通过用户ID的,而不是用户名,所以容器中和宿主机的用户可以通过UID来关联,只要UID相同,用户名不同也是同一个用户。

另外,Linux中有两种用户权限管理方法:

  1. DAC。在没有使用 SELinux 的操作系统中,决定一个资源是否能被访问的因素是:某个资源是否拥有对应用户的权限(读、写、执行)。
    只要访问这个资源的进程符合以上的条件就可以被访问。

而最致命问题是,root 用户不受任何管制,系统上任何资源都可以无限制地访问。
这种权限管理机制的主体是用户,也称为自主访问控制(DAC)。

  1. MAC。在使用了 SELinux 的操作系统中,决定一个资源是否能被访问的因素除了上述因素之外,还需要判断每一类进程是否拥有对某一类资源的访问权限。
    这样一来,即使进程是以 root 身份运行的,也需要判断这个进程的类型以及允许访问的资源类型才能决定是否允许访问某个资源。进程的活动空间也可以被压缩到最小。

即使是以 root 身份运行的服务进程,一般也只能访问到它所需要的资源。即使程序出了漏洞,影响范围也只有在其允许访问的资源范围内。安全性大大增加。
这种权限管理机制的主体是进程,也称为强制访问控制(MAC)。
而 MAC 又细分为了两种方式,一种叫类别安全(MCS)模式,另一种叫多级安全(MLS)模式。

在2.6及以上版本的Linux内核中都集成了SELinux,所以都是采用的MAC方式,所以有时容器虽然是以root身份执行的,但是依然没有一些文件的权限。此时可以将该文件的访问权限设为777,或将该容器以特权模式运行。

如有不同见解,请指教!