不,Docker 容器并不比 VM 更安全。
引用丹尼尔·夏皮拉的话:
仅在 2017 年,就发现了 434 个 linux 内核漏洞,正如您在这篇文章中所看到的,内核漏洞对于容器化环境可能是毁灭性的。这是因为容器与主机共享相同的内核,因此仅信任内置的保护机制是不够的。
1. 来自容器的内核漏洞利用
如果有人利用容器内的内核漏洞,他们就会在主机操作系统上利用它。如果此漏洞允许代码执行,它将在主机操作系统上执行,而不是在容器内。
如果此漏洞允许任意内存访问,则攻击者可以更改或读取任何其他容器的任何数据。
在虚拟机上,这个过程更长:攻击者必须同时利用虚拟机内核、管理程序和主机内核(这可能与虚拟机内核不同)。
2. 资源匮乏
由于所有容器共享相同的内核和相同的资源,如果对某些资源的访问不受限制,则一个容器可以将其全部用完,从而使主机操作系统和其他容器处于饥饿状态。
在 VM 上,资源由管理程序定义,因此没有 VM 可以拒绝主机操作系统使用任何资源,因为管理程序本身可以配置为限制使用资源。
3. 集装箱突围
如果容器内的任何用户能够使用某种漏洞利用或错误配置逃离容器,他们将有权访问主机上运行的所有容器。发生这种情况是因为运行 docker 引擎的用户就是运行容器的用户。如果任何exploit在主机上执行代码,它将在docker引擎的权限下执行,因此它可以访问任何容器。
4.数据分离
在 docker 容器上,有一些资源没有命名空间:
- SELinux
- Cgroups
/sys
, /proc/sys
,下的文件系统
/proc/sysrq-trigger
, /proc/irq
,/proc/bus
/dev/mem
,/dev/sd*
文件系统
- 内核模块
如果任何攻击者可以利用这些元素中的任何一个,他们将拥有主机操作系统。
虚拟机操作系统将无法直接访问任何这些元素。它将与管理程序对话,管理程序将对主机操作系统进行适当的系统调用。它将过滤掉无效调用,增加一层安全性。
5. 原始套接字
/var/run/docker.sock
如果没有正确保护,任何容器都可以安装默认的 Docker Unix 套接字 ( )。如果某个容器挂载了这个套接字,它可以关闭、启动或创建新的镜像。
如果正确配置和保护它,您可以使用 docker 容器实现高级别的安全性,但它会低于正确配置的 VM。无论使用多少加固工具,VM 总是更安全。裸机隔离甚至比虚拟机更安全。一些裸机实现(例如 IBM PR/SM)可以保证分区是分开的,就好像它们在单独的硬件上一样。据我所知,没有办法逃避 PR/SM 虚拟化。