首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是什么使码头工人比越野车或裸金属更安全?

是什么使码头工人比越野车或裸金属更安全?
EN

Security用户
提问于 2017-09-17 22:08:37
回答 7查看 52.9K关注 0票数 308

最近我和一位码头专家讨论了Docker与虚拟机的安全性问题。当我从不同的来源得知,在Docker容器中运行的代码比运行在虚拟机中的代码容易逃离时,这位专家解释说,我完全错了,与虚拟机或裸金属相比,Docker机器在防止恶意代码影响其他机器方面实际上更安全。

虽然他试图解释为什么码头集装箱更安全,但他的解释对我来说太技术性了。

据我所知,“OS级虚拟化重用虚拟机之间的内核空间”,在本站点的不同的答案中解释了这一点。换句话说,来自Docker容器的代码可以利用内核漏洞,这在虚拟机上是不可能的。

因此,与VM或裸金属隔离相比,在容器/机器中运行的代码会故意试图逃避和感染/损坏其他容器/机器时,使用Docker的安全性如何?让我们假设Docker配置正确,这可以防止描述这里的四类攻击中的三种。

EN

回答 7

Security用户

回答已采纳

发布于 2017-09-18 02:13:48

不,Docker容器并不比VM更安全。

引用丹尼尔·夏皮拉

仅在2017年,发现了434个linux内核漏洞,正如您在这篇文章中所看到的,内核利用对于容器化环境来说是毁灭性的。这是因为容器与主机共享相同的内核,因此仅信任内置的保护机制是不够的。

1.内核从容器

中利用

如果有人利用容器内的内核错误,他们就会在主机操作系统上利用它。如果此漏洞允许代码执行,则它将在主机操作系统上执行,而不是在容器内执行。

如果此漏洞允许任意访问内存,则攻击者可以更改或读取任何其他容器的任何数据。

在VM上,处理时间更长:攻击者必须同时利用VM内核、虚拟机管理程序和主机内核(这可能与VM内核不同)。

2.资源饥饿

由于所有容器共享相同的内核和相同的资源,如果对某些资源的访问不受限制,一个容器可以全部使用它,从而使主机操作系统和其他容器挨饿。

在VM上,资源是由管理程序定义的,因此没有VM可以拒绝主机OS的任何资源,因为虚拟机管理程序本身可以配置为对资源的限制使用。

3.集装箱突破

如果容器中的任何用户能够使用某种漏洞或错误配置来转义容器,他们将有权访问在主机上运行的所有容器。这是因为运行停靠引擎的同一个用户是运行容器的用户。如果有任何漏洞在主机上执行代码,则它将以码头引擎的权限执行,因此它可以访问任何容器。

4.数据分离

在码头容器上,有一些资源不是名称空间的:

  • SELinux
  • C组
  • /sys/proc/sys下的文件系统
  • /proc/sysrq-trigger/proc/irq/proc/bus
  • /dev/mem/dev/sd*文件系统
  • 核模

如果任何攻击者能够利用这些元素中的任何一个,他们将拥有主机操作系统。

VM将不能直接访问任何这些元素。它将与系统管理程序对话,管理程序将对主机OS进行适当的系统调用。它将过滤出无效的调用,增加一层安全性。

5.原始套接字

默认的Docker (/var/run/docker.sock)可以由任何容器安装,如果没有正确的保护。如果某些容器安装了这个套接字,它可以关闭、启动或创建新映像。

如果它被正确地配置和保护,那么您可以使用一个码头容器来实现高度的安全性,但是它将小于一个正确配置的VM。无论使用多少强化工具,VM总是更安全。裸金属隔离甚至比VM更安全。一些裸金属实现(例如IBM/SM)可以保证分区是分开的,就像它们在单独的硬件上一样。据我所知,没有办法避免PR/SM虚拟化。

票数 460
EN

Security用户

发布于 2017-09-18 01:39:35

说一个VM或Docker比另一个更安全是一个巨大的过度简化。

VM提供硬件虚拟化;虚拟机管理程序模拟硬件,以便来宾内核认为它在自己的机器上运行。这种类型的虚拟化更容易彼此隔离。如果您对虚拟化的主要关注是隔离(您并不真正需要虚拟机来相互交互),那么VM的安全就会大大简化。

Docker提供内核/操作系统虚拟化,Docker使用内核名称空间来虚拟化内核和操作系统,这样客户就会认为它在自己的操作系统实例上运行。操作系统虚拟化为如何保护容器之间的互连提供了更大的灵活性。如果您对虚拟化的主要关注要求您互连容器,那么Docker提供了定义这些共享规则的能力,这种方式在虚拟机中是不可能的或太麻烦的。

具有很大的灵活性带来了巨大的风险;与VM相比,更容易错误地配置docker,而且码头资源共享的灵活性也为实现和配置缺陷创造了更多的机会。但是,如果您能够正确配置共享权限,并且假定Docker或内核中没有实现错误,那么Docker提供的细粒度共享要比硬件虚拟化好得多,并且可能为您提供更好的总体安全性。

例如,套接字共享。使用Docker,您可以通过共享套接字文件在两个容器之间创建一个共享的命名套接字,并且可以定义安全权限(使用任何现有的安全模块:传统Unix权限、功能、SELinux、AppArmor、seccomp等等)。在套接字端点之间,使对接者/内核强制应用程序访问套接字端点。通过虚拟机,您可以通过设置一系列套接字来通过TCP将数据输送到套接字,从而共享一个套接字更麻烦一些。但是,hypervisor的可见性非常有限,无法控制对套接字端点的访问,因为这些套接字端点的权限是由客户内核应用的。

另一个例子是文件夹共享。对于容器,您可以通过设置共享挂载来共享文件夹,而且由于Docker/内核强制执行容器使用的文件权限,所以来宾系统无法绕过这些限制。对于VM,如果您想要共享文件夹,就必须让一台机器运行网络文件服务器、Samba服务器或FTP服务器,而虚拟机管理程序对共享几乎没有可见性,不能强制执行共享权限。这里附加的移动部件(文件服务器)也可能有自己的漏洞和错误配置问题需要考虑。

TL;DR:使用VM进行隔离,使用容器进行受控共享。

票数 83
EN

Security用户

发布于 2017-09-18 00:49:03

正如您正确地指出的,Docker使用“操作系统级虚拟化”。您可以将此(如果您是*nix迷)看作是chroot的一种奇特形式。

通过利用操作系统中内置的特性和功能,Docker充当容器的主管。这个软件对操作系统的看法是由Docker决定的。

所有容器都使用相同的内核。因此,例如,如果我能够在一个容器中引起内核恐慌(比如“死亡的蓝屏”),那么所有其他容器都会受到影响。

配置似乎比基于硬件的解决方案更关键。所有的东西实际上都在同一个共享空间中。想象一下把野生食肉动物放在它的天然食物来源旁边。如果你没有在捕食者周围放置一个足够强大的围栏,或者每次你离开它时都忘记关闭大门,你很可能会想象会发生什么。

虽然这是一个轻量级的解决方案,但我肯定不会在可信代码的旁边运行任何未知的代码。

恶意代码必须确定将其权限提升到根/管理员级别的方法,以便以任何有意义的方式转义容器。

在虚拟机中,系统管理程序将受到攻击,而不是内核。这可能被证明更安全,因为“容器”之间有更高的隔离级别,但是引入了更高的管理开销。

根据我的理解,没有什么比“裸金属”或基于硬件的解决方案更安全了。我倾向于说码头工人不那么安全。就每一个软件一个容器而言,这可以证明是另一回事。

如果你不确定现实世界的例子,我会看一看OpenVZ。它以与Docker类似的方式使用OS级虚拟化,但使用的是修改后的内核。

票数 24
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/169642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档