原标题 Lars Kurth谈开源安全流程之二:容器vs虚拟机管理程序
【编者的话】随着云平台的日渐流行,其面对的安全问题也越来越严重。近日,Xen项目顾问委员会主席Lars Kurth分享了其对开源安全流程的理解和看法。作为该系列文章四部分的第二篇,本文介绍了Lars对于容器和虚拟机管理程序的不同安全漏洞的理解。
在这一系列的第一部分,Lars介绍了他对于云安全背后的理论和这些理论与《行尸走肉》(The Walking Dead 2)电视剧的关系。阅读第1部分:云安全介绍。
随着虚拟化软件的发展,每一个接口中的每一个要素都有机会犯错误,接口调用每一段代码都可能会引入漏洞,接口的每一个角落都可能给攻击者提供突破的机会。这就是所谓的“受攻击面”,信息技术需要考虑由虚拟化软件本身的接口中的漏洞所带来的风险,以及当接口被调用的时候需要执行的代码量。
通过给定不同的功能,让我们介绍“受攻击面”是如何形成的,以及在流行的云技术中它们有什么关联和差异。
首要攻击媒介:操作系统功能
虚拟化和容器的基本构建模块是调度和内存管理。在Xen的环境下,虚拟机管理程序整个从头到尾重新实现了这个功能。Linux内核展示的KVM功能,由KVM内核模块进行增强,被调度虚拟机重用,并用来管理它的内存。在这种模式下,每一个虚拟机都是一个Linux进程,这个进程通过Linux调度器调度,同时它的内存是由Linux的内存分配器分配。相同的复用的概念也适用于容器。
KVM和容器之间的主要区别是:KVM在每个虚拟机(要么是Linux的不同版本,要么是完全不同的操作系统内核,如Windows)中运行一个单独的内核实例,并使用一个内核模块和QEMU来实现额外的条块分割。容器使用相同的内核实例,并通过内核的系统调用接口的单个实例来管理容器以及容器中运行的应用程序。
尽管容器中的Linux内核的重用有许多优点,但需要在经由系统接口的可用功能的广度与它背后的代码之间进行平衡。这增加了代码中出现错误的风险,以及相比Xen更容易出现漏洞,Xen仅实现必要的部分,另外,KVM重新使用KVM内的内核功能,而不直接将其暴露给客户虚拟机。
如果你将Linux内核系统调用接口与Xen的调用接口进行比较,Linux的外部接口中的幅度差大于300,而Xen的外部接口中的幅度差仅仅为40。内核给你提供文件系统,其中包括了文件、目录、查找、FSTAT、阅读、MMIO和AIO。你可以创建多少种不同的sockets呢?存在多少种不同的IPC机制呢?所有带有内部状态的事情都必须正确处理,如Futexes、共享内存、读写控制、TTY。在Linux系统调用接口,还有更多的机会可能会犯错。如下表1所示,在一个更加规则的基础上,会出现了更多的错误。这给问题增加了复杂性和受攻击面的数量。
第二攻击媒介:设备仿真
虚拟机管理程序,如Xen和KVM,使用QEMU作为设备模型仿真器来仿真服务器硬件部件,如主板,定时器,内核中的外部中断和I/O。 Xen在某些情况下(例如,x86的HVM,但不适用于x86的PV,以及ARM架构)只使用仿真,而KVM完全依赖于QEMU(或提供类似功能的替代方案)。
设备仿真很复杂,其原因有两个。首先,硬件接口需要权衡硬件实现与软件执行之间的关系,其次,在此过程中需要仿真大量设备。这就是为什么我们最近在QEMU中常常看到漏洞增加的原因。
表1:该表显示了关于显著的漏洞的一个调查结果,该结果发表于FOSDEM 2015。 m相应的2015年的调查还没有执行,还需要花费更多的努力。要注意的是,Xen HVM的图有一些类似于带QEMU的KVM。
第三攻击媒介:I / O和设备驱动程序
如前所述,系统的I / O是恶意的有效载荷进入云系统的主要途径。攻击通常试图利用设备驱动程序的漏洞,这给攻击者提供了访问系统中所有内容的路径,因为设备驱动程序运行在Linux内核模式下。在虚拟化环境中,设备驱动程序漏洞可能赋予攻击者单个虚拟机的控制权限,但为了攻击主机上的其他虚拟机,就需要利用额外的漏洞来获得对主机的控制。
由于仿真在本质上是非常缓慢的,Xen和KVM为磁盘和网络访问采用半虚拟化I / O驱动程序,因此二者不需要仿真。半虚拟化I / O驱动程序往往是非常简单的,将其与容器相比,半虚拟化I / O驱动程序采用单内核实例的系统调用接口,并能够实现与设备驱动程序的交互。正如前面指出的,系统调用接口的工作量是非常大的,远远超过PV I / O,以及组合的仿真I / O。因为设备驱动程序是运行在内核模式下,因此相比虚拟机管理程序的部署,容器部署带来的风险会高得多。
结论
针对容器技术,最近不少厂商也开发了许多安全功能,如每个容器的ulimit、容量消减、设备访问限制、Linux安全模块(SELinux、AppArmor)的改进处理、用户命名空间的提高,以及所有的深度防御(多重保护层)的例子
尽管有了这些努力,以及尽量用最小的Linux发行版,与虚拟机管理程序相比,容器的根本问题仍然存在,因为它们有一个非常大的“受攻击面”,使得它们本质上非常脆弱。这就是为什么我们需要尝试将虚拟化技术与容器进行结合,比如超清晰容器和Xen容器,现在都已经开始在制造声势。