运行 root 特权 ENTRYPOINT ["/bin/sh", entrypoint.sh"]
是否被认为是一种安全的做法? ,在运行应用程序之前切换到非root用户?
更多背景:
有许多文章(1、2、3)建议以非 root 用户身份运行容器是安全方面的最佳实践。这可以使用 USER appuser
来实现命令,但是在某些情况下( 4 , 5 )以 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 和一个非 rootPID USER TIME COMMAND
5004 root 0:00 runuser -u appuser /usr/bin/myapp
5043 1000 0:02 /usr/bin/myapp
这是否意味着我的容器在给定根进程的情况下运行时存在漏洞,或者它被认为是安全的?我发现关于这个主题的讨论很少( 6 , 7 )并且没有一个似乎是确定的。我在 StackOverflow 上寻找过类似的问题,但找不到任何可以解决安全问题的相关问题(8、9、10)。
最佳答案
我只是浏览了有关该主题的相关文献(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/