Voy*_*Voy 8 linux security containers docker docker-volume
以 root 权限运行ENTRYPOINT ["/bin/sh", entrypoint.sh"],然后在运行应用程序之前切换到非 root 用户,这是否被认为是一种安全的做法?
更多背景:
有许多文章(1、2、3 )建议以非 root 用户身份运行容器是安全性方面的最佳实践。这可以使用命令来实现,但是在某些情况下(4、5 ),当以 root 身份运行容器时,只有在脚本中切换到非 root是唯一的解决方法,例如:USER appuserentrypoint.sh
#!/bin/sh
chown -R appuser:appgroup /path/to/volume
exec runuser -u appuser "$@"
Run Code Online (Sandbox Code Playgroud)
在 Dockerfile 中:
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/bin/sh", "entrypoint.sh"]
CMD ["/usr/bin/myapp"]
Run Code Online (Sandbox Code Playgroud)
调用时docker top container我可以看到两个进程,一个是根进程,一个是非根进程
PID USER TIME COMMAND
5004 root 0:00 runuser -u appuser /usr/bin/myapp
5043 1000 0:02 /usr/bin/myapp
Run Code Online (Sandbox Code Playgroud)
这是否意味着我的容器运行时存在根进程的漏洞,或者它被认为是安全的?
我发现关于这个主题的讨论很少(6、7 ),而且似乎没有一个是明确的。我在 StackOverflow 上查找了类似的问题,但找不到任何可以解决安全问题的相关问题(8、9、10)。
我只是浏览了相关文献(Adrian Mouat 的Docker,Liz Rice 的Container Security)对这个主题的看法,并添加了我自己的想法:
被广泛引用的以非 root 身份运行容器的最佳实践背后的主要目的是避免由于应用程序代码中的漏洞而导致容器崩溃。当然,如果您的应用程序以 root 身份运行,然后您的容器可以访问主机(例如通过绑定安装卷),则可能会发生容器突破。同样,如果您的应用程序有权执行容器文件系统上存在漏洞的系统库,则可能会出现拒绝服务攻击。
使用 的方法可以保护您免受这些风险的影响runuser,因为您的应用程序不具有主机根文件系统的权限。同样,您的应用程序不能被滥用来调用容器文件系统上的系统库,甚至在主机内核上执行系统调用。
但是,如果有人使用 附加到您的容器exec,他将是 root,因为容器主进程属于 root。对于 Kubernetes 等具有复杂访问权限概念的系统来说,这可能会成为一个问题。在这里,某些用户组可能被授予集群的只读视图,包括执行容器的权限。然后,作为 root,他们将拥有比必要的更多的权限,包括主机上可能的权限。
总之,我对您的方法没有强烈的安全担忧,因为它通过以非 root 身份运行应用程序来降低通过应用程序漏洞进行攻击的风险。事实上,您以 root 身份运行容器主进程,我认为这是一个小缺点,它只会在利基访问控制设置中产生问题,其中不完全受信任的主体只能对您的系统进行只读访问。