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

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

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

我知道,一般来说,如果没有必要,应该避免在 Docker 容器中使用 root 用户 (尽管看起来这个建议是大规模的忽略了,但那是其他主题)。

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

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

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

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

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