linux - Docker - 在 ENTRYPOINT 中切换到非 root 用户是否安全?

标签 linux docker security containers docker-volume

运行 root 特权 ENTRYPOINT ["/bin/sh", entrypoint.sh"] 是否被认为是一种安全的做法? ,在运行应用程序之前切换到非root用户?

更多背景:
有许多文章(123)建议以非 root 用户身份运行容器是安全方面的最佳实践。这可以使用 USER appuser 来实现命令,但是在某些情况下( 45 )以 root 身份运行容器并且仅在 entrypoint.sh 中切换到非 root脚本是唯一的方法,例如:

#!/bin/sh

chown -R appuser:appgroup /path/to/volume
exec runuser -u appuser "$@"
在 Dockerfile 中:
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/bin/sh", "entrypoint.sh"]
CMD ["/usr/bin/myapp"]

调用docker top container时我可以看到两个进程,一个 root 和一个非 root
PID                 USER                TIME                COMMAND
5004                root                0:00                runuser -u appuser /usr/bin/myapp
5043                1000                0:02                /usr/bin/myapp
这是否意味着我的容器在给定根进程的情况下运行时存在漏洞,或者它被认为是安全的?
我发现关于这个主题的讨论很少( 67 )并且没有一个似乎是确定的。我在 StackOverflow 上寻找过类似的问题,但找不到任何可以解决安全问题的相关问题(8910)。

最佳答案

我只是浏览了有关该主题的相关文献(Adrian Mouat 的 Docker,Liz Rice 的 Container Security),并添加了我自己的想法:
以非 root 身份运行容器的很多引用的最佳实践背后的主要目的是通过应用程序代码中的漏洞避免容器突破。自然,如果您的应用程序以 root 身份运行,然后您的容器可以访问主机,例如通过绑定(bind)挂载卷,容器突破是可能的。同样,如果您的应用程序有权在您的容器文件系统上执行存在漏洞的系统库,那么就会出现拒绝服务攻击。
面对这些风险,您 受您使用 runuser 的方法保护,因为您的应用程序对主机的根文件系统没有权限。同样,您的应用程序不能被滥用来调用容器文件系统上的系统库,甚至不能在主机内核上执行系统调用。
但是,如果有人使用 exec 连接到您的容器, 他 是root,因为容器主进程属于root。这可能会成为具有复杂访问权概念(如 Kubernetes)的系统的问题。在这里,某些用户组可能被授予集群的只读 View ,包括在容器中执行的权限。然后,作为 root,他们将拥有比必要更多的权限,包括主机上的可能权限。
总之 ,我对您的方法没有强烈的安全顾虑,因为它通过以非 root 身份运行应用程序来降低通过应用程序漏洞进行攻击的风险。事实上,您以 root 身份运行到容器主进程,我认为这是一个小缺点,它只会在利基访问控制设置中产生问题,在这些设置中,不完全受信任的主体获得对您系统的只读访问权限。

关于linux - Docker - 在 ENTRYPOINT 中切换到非 root 用户是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65574334/

相关文章:

linux - 无法为特定内核版本构建 Linux 内核模块

docker - iOS 11 设备无法访问由 LetsEncrypt 保护的 nginx HTTPS 站点(协议(protocol)错误)

asp.net - 你知道有什么工具可以从我的网站上删除谷歌阻止的恶意软件吗?

security - 最佳密码盐长度

c - vfork 永无止境

regex - 使用 awk 匹配一个单词,然后找到另一个单词第一次出现的位置

linux - 如何在 WSL 中添加自定义起始目录

docker - Docker-仅包含操作系统的镜像吗?

configuration - Kubernetes 相当于 Docker 中的 env-file

c# - WCF 调试记录敏感信息