繁体   English   中英

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

[英]Starting container as a non-root user vs starting as root and then downgrade to non-root

我正在创建一些Docker映像,并且正在阅读其他人如何做到这一点。 对于在容器内运行进程的用户,我已经确定了三种通用模式:

  • 它使用root用户进行所有操作(在root下运行的容器内生成的进程)。
  • 它使用root用户 ,执行一些操作,然后降级为非root用户 (因此,即使pid 1仍然是root,主进程仍在非root用户下运行)。 例如,在正式的nginx容器中会发生这种情况: PID USER TIME COMMAND 1 root 0:00 nginx: master process nginx -g daemon off; 5 nginx 0:00 nginx: worker process 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,所有内容都以root身份运行,这对于多用户环境是不利的,因为用途不会彼此分开。 它还为每个用户提供sysadmin级别的访问权限。 但是,在容器内部,这不是问题,因为应该只有一个用户(单个应用程序),并且root的功能受到限制,因此他们不能脱离容器。 因此,大多数人会忽略以用户身份运行容器,因为与端口可能遇到的问题(例如端口限制或卷中文件的权限)相比,安全性的附加值很小。 也就是说,以用户身份运行具有一定的价值,因为这是攻击者必须突破的又一个限制。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM