出乎意料的结果:容器与虚拟机到底谁更安全?

861 阅读5分钟
原文链接: dockone.io
【编者的话】IBM Research创造了新的软件安全性测量方法——水平攻击概要,通过这个方法发现一个恰当配置的容器的安全性几乎与虚拟机相当。

视频链接:www.zdnet.com/video/8- ..…

大多数人可能都会认为虚拟机(VM)要比容器更安全。但是 IBM Research发现容器的安全水平其实可以等同,甚至超越虚拟机。

IBM Research的杰出工程师,顶级的Linux内核程序员James Bottomley表示:

“当前关于容器与hypervisor安全性的争论,最大的一个问题是没有人开发出一个明确的安全测量方法。争论都是基于定性的(hypervisor“觉得”从接口广度上比较,比容器更安全),却没人进行过明确的量化比较。”

对应这个问题,Bottomley 设计了个叫 水平攻击概要(HAP)的方法,它通过客观测量的方式来描述系统的安全。通过这个方法,Bottomley发现,在加载合适的seccomp配置文件的情况下,Docker容器提供的安全性基本等同于hypervisor。在这个环境内,seccomp配置文件提供了拦截非法系统调用的作用。

Bottomley一开始定义了垂直攻击概要,这个文件包含了全部的代码,通过遍历代码可以提供完整的服务,包括从数据输入,更新到输出等。像所有代码一样,这段代码也存在漏洞,而且漏洞的密度差异性随机,但遍历的代码越多,发现安全漏洞的概率就越大。堆积起来的安全漏洞的集合——应用可能从容器内跳出到物理主机或虚拟化主机层面——就是HAP集。

HAP集是最严重等级的安全漏洞。Bottomley称之为“潜在的业务毁灭事件”。那么,如何量化一个系统的HAP数呢?Bottomle解释如下:

定量方法测量HAP=Linux内核代码的缺陷密度*代码遍历产生的代码数量。

备注:这个遍历数是唯一,不重复的;是系统运行达到稳定状态后,遍历不会出现任何新的内核路径时的数据。

为了阐述这个方法,我们假定bug的密度是统一的,这样HAP差不多就等于系统稳态下,遍历过的代码数。而实际测量一个运行中的系统是另外一回事。值得庆幸的是,内核有一个称为ftrace的机制,它可以用于在给定的用户空间内,跟踪所有的函数调用,从而可得到所遍历的代码行数的合理近似数。需要强调一下,这个数不是精确数,主要是因为ftrace无法提供更细的信息,这个方法只是测量了所获取函数的代码行数,而未考虑内部代码流。除此之外,这个方法论特别适合测量容器环境,因为容器内所有的控制流,都是由已知的进程通过系统调用信息发出的。而在hypervisor环境里,测量除了直接的hypercall接口外,还必须添加后端守护进程的跟踪(如kvm vhost内核线程或Xen的dom0),所以这个方法在hypervisor内的应用效果要稍微差一些。

简而言之,先测出一个VM或容器裸系统的代码有多少行数,然后用这系统去运行一个指定的应用。系统的代码行数越多,就越有可能存在HAP级别安全漏洞。

如何去量化一个定义好的HAP集呢?Bottomley分别在如下的环境内做了测试:Docker,谷歌的gVisor,沙盒容器,gVisor-KVM,KVM的沙盒容器,Linux内置的VM hypervisor,Kata容器,开源的轻量级VM以及IBM最新发布的专应用于强应用隔离的Nabla容器。

测试内容是标准的基线测试,包括redis-bench-set,redis-bench-getpython-tornadonode-express。其中最后的2个测试需要运行Web服务器和简单外部事务客户端。

通过测试,Bottomley发现Nabla运行时的HAP要优于带有Kata技术的hypervisor。这也就意味着,我们可以构建一个容器系统,它的HAP比hypervisor更好,也意味着更安全。

除了Nabla之外,Bottomley还表示:“在精心调优过的seccomp文件的搭配下,容器提供的安全性也与hypervisor大致相当。”

比较特别的是gVisor,最好的结果与Docker相当,但在某一个用例测试中,结果明显很差。Bottomley推测:“这主要是因为gVisor尝试将Linux接口重写成Go来优化容器。但却没有人会关心系统运行时调用Go的接口数量。这可以对应上测试的结果表现。”若真是如此,Bottomley认为gVisor的后续版本必须重写才可能更加安全。

然而,真正的关键并不是那种技术本身更安全。对于最严重的安全问题,容器和VM所具备的安全等级是相当的。实际上,Bottomley认为:“比hypervisor更安全的容器,这个可能性完全存在。最终,关于哪个是更安全的技术的争论也将停止。”

他表示,“接下来,需要建立对恶意应用程序的完全暴露模型,要做到这一点,需要使用一些模糊测试。”

Bottomley的这个工作仅仅是一个开始。他证明了客观地度量应用程序的安全性是可能的。正如他所言,“我不认为这是辩论中的结束,通过描述我们所做的事情,希望其他人也能开发出好的量化测量方法。”

原文链接:Containers or virtual machines: ​Which is more secure? The answer will surprise you(翻译:易理林)