以非root用户身份启动容器vs以root身份启动,然后降级为非root用户

时间:2017-04-30 09:53:53

标签: linux security nginx docker root

我正在创建一些Docker镜像,我正在阅读其他人如何做这件事。当涉及到在容器内运行进程的用户时,我已经确定了三种通用模式:

  • 它使用 root用户来处理所有内容(在root下的容器运行中生成的进程)。
  • 它使用 root用户,执行一些操作,然后降级到非root用户(因此主进程在非root用户下运行,即使pid 1仍然是根)。例如,使用官方nginx容器会发生这种情况: PID USER TIME COMMAND 1 root 0:00 nginx: master process nginx -g daemon off; 5 nginx 0:00 nginx: worker process
  • 它使用非root用户来处理所有事情。

我理解,一般情况下,如果不需要,可以避免在Docker容器中使用 root用户(虽然看起来这个建议被大量忽略,但那是其他一些主题)。

但从安全角度来看,第二个和第三个选项之间是否存在差异?

1 个答案:

答案 0 :(得分:2)

使用选项1,所有内容都以root身份运行,这对多用户环境不利,因为使用不会相互分离。它还为每个用户提供系统管理员级别的访问权限。但是在容器内部,这不是问题,因为应该只有一个用户(单个应用程序)和root的功能受到限制,因此它们不会突破容器。因此,大多数人忽略了将容器作为用户运行,因为与他们可能遇到的问题相比,安全性的附加值是最小的,例如端口限制或卷中文件的权限。也就是说,作为用户运行有一些价值,因为它是攻击者必须突破的另一个限制。

如果您的容器具有要运行的初始化代码,或者应用程序的一部分需要root用于打开端口80之类的东西,则需要选项2.缺点是在初始化期间可以运行的任何漏洞都具有容器根访问权限。这也意味着docker exec或覆盖docker命令,以root身份在容器内运行该命令。对于那些寻求安全性的人来说,这会改进选项1,他们可能无法执行选项3。

选项3是更改容器的默认用户。容器内部没有任何关系,应用程序具有root权限,因此攻击面减少了,但这也意味着您不能使用1024以下的端口,并且主机用户和容器用户之间主机卷内文件的权限可能不匹配。默认情况下,覆盖docker命令或使用docker exec也将作为受限用户运行。

最大的警告是,您可以使用容器启动脚本覆盖映像中的默认用户。因此,作为用户运行的容器可以使用docker run -u root ...切换到root。反过来也适用于使用默认root用户定义的所有容器。您可以按原样使用这些上游映像,只需在启动命令中更改用户即可从选项1切换到选项3。