gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:29 27 4
gpt4 key购买 nike

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

  • 它使用 root 用户 处理一切(在 root 下运行的容器内生成的进程)。
  • 它使用root 用户,做一些事情,然后降级到非root 用户(所以主进程在非root 用户下运行,即使pid 1仍然是根)。例如,官方 nginx 容器会发生这种情况:
    PID 用户时间指令
    1 root 0:00 nginx: master process nginx -g daemon off;
    5 nginx 0:00 nginx:工作进程
  • 一切都使用非根用户

我知道,一般来说,如果没有必要,应该避免在 Docker 容器中使用 root 用户(尽管似乎这个建议被大量忽略,但这是另一个主题)。

但是从安全的角度来看,第二个和第三个选项有什么区别吗?

最佳答案

对于选项 1,一切都以 root 身份运行,这对于多用户环境是不利的,因为使用彼此不分离。它还为每个用户提供系统管理员级别的访问权限。然而在一个容器内,这不是一个问题,因为应该只有一个用户(单个应用程序)并且 root 的能力受到限制,所以他们不能突破容器。因此,大多数人忽略了以用户身份运行容器,因为与他们可能遇到的端口限制或卷中文件权限等问题相比,安全性的附加值微乎其微。也就是说,以用户身份运行有一定的值(value),因为这是攻击者必须突破的又一个限制。

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

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

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

关于linux - 以非 root 用户身份启动容器与以 root 用户身份启动然后降级为非 root 用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43705122/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com