有许多站点鼓吹我们不应该以根用户的身份运行docker容器。
默认情况下,Docker对容器中的进程授予根权限,这意味着它们对容器和主机环境具有完全的管理访问权限。
我不理解容器如何访问主机环境&如果我不执行卷/端口映射,就会造成安全漏洞。
有人能给出这样的安全风险的例子吗?
发布于 2022-05-01 17:57:41
发布于 2022-05-03 13:10:52
docker和其他容器化技术建立在Linux内核的命名空间特性的基础上,限制和隔离进程,限制它们对文件系统、对其他进程或网络的访问等可用资源的看法。
默认情况下,docker使用非常强的进程隔离,将其访问限制在最低限度。这使许多人相信,在容器中运行任何不受信任的进程/docker映像都是完全安全的--,而不是!
因为尽管这些进程具有很强的隔离性,但它们仍然直接在主机系统的内核上运行。当它们作为根用户在容器中运行时(而不使用用户命名空间 ),它们实际上也是主机上的根用户。唯一防止恶意容器完全超过主机系统的是,它没有直接/直接的访问关键资源的权限。但是,如果它以某种方式控制了名称空间之外的资源的句柄,那么它可能被用来打破隔离。
对于不知情的用户来说,很容易无意中向容器提供外部资源的句柄。例如:
# DON'T DO THIS
# the user intends to share the mapping of user names to ids with the container
docker run -v /etc/passwd:/etc/passwd untrusted/image当容器中的进程以根用户的身份运行时,容器不仅能够读取/etc/passwd中的所有用户,而且还可以编辑该文件,因为它在主机上也具有根访问权限。在这种情况下-如果你真的需要这样的东西-最好的做法是绑定挂载/etc/passwd只读。
另一个例子:一些应用程序需要扩展对系统功能的访问,这需要放松默认情况下应用的一些严格隔离docker,例如:
# DON'T DO THIS
docker run --privileged --cap-add=CAP_ALL untrusted/image这将消除大多数限制,尤其是允许容器加载新的内核模块,即向内核中注入和执行任意代码,这显然是不好的。
但是,除了错误地提供外部资源访问之外,Linux内核中也可能存在错误,可以利用这些漏洞来逃避容器的隔离--当进程已经在容器中拥有根权限时,这些漏洞更容易使用。
因此,docker的最佳做法是尽可能限制容器的访问:
虽然在docker中以根用户身份启动容器是默认的,但大多数应用程序实际上并不需要以根用户身份启动。那么,在不需要根特权的情况下,为什么要授予它们呢?
https://stackoverflow.com/questions/72078975
复制相似问题