3.3 虚拟机安全机制
针对以上攻击方法,虚拟机必须采取相应的安全机制。本节重点介绍虚拟机访问控制和虚拟机隔离这两种最常见的安全机制。
3.3.1 虚拟机访问控制
访问控制通过限制主体对客体的访问权限与范围,保证客体不被非法访问。云存储服务支持海量的用户接入,每个用户都有为其提供服务的虚拟机,如何区分不同用户对不同虚拟机的访问权限,需要通过虚拟机的访问控制机制来实现。
在虚拟化软件栈中,从VMM、客户操作系统到应用软件,高优先级的软件层能够无限制地访问低优先级软件层的代码和数据,这种机制威胁着整个软件栈的安全。因此,需要利用访问控制机制来阻止非法用户访问受保护的数据资源,同时允许合法用户访问受保护的数据资源。
另外,很多应用需要进行虚拟机间的通信,可能带来非法访问、边信道攻击等安全风险。云存储的动态弹性计算,虚拟机可以根据性能进行动态的迁移,也需要研究迁移过程中对数据的访问控制。文献[75]和[76]都对虚拟机中的访问控制技术做了详细的阐述。
虚拟机的访问控制策略一般有以下两种方案:一种是每个虚拟机各自部署访问控制策略;一种是集中式存储访问控制策略。第一种方案的可扩展性比较差,管理烦琐;第二种方案将访问控制策略部署在Hypervisor上,可以实现统一配置与管理。
王于丁等人[75]将虚拟机下多租户的访问控制分为以下3类进行介绍。
1. 通过多租户的隔离实现访问控制
通过对多租户的隔离实现访问控制,主要是利用虚拟机下的隔离机制,增加访问控制策略并执行访问控制。
2010年,Hao等人[77]提出将网络访问控制策略集中存储在一个中心服务器上,在转发交换机上强制执行。客户网络的隔离通过虚拟局域网来实现,当分组是发往同一个虚拟局域网时,则不执行访问控制策略而直接发往目的地虚拟机,以避免因访问控制带来不必要的额外开销;若分组是发送到不同的虚拟局域网,则根据访问控制策略进行判定转发。
2013年,Factor等人[78]提出一个逻辑隔离多租户的方案SLIM(Secure Logical Isolation for Multi-tenancy),可以极大地提高系统物理隔离的安全性。SLIM采用租户资源、云存储系统以及租户之间逻辑隔离的原则,在OpenStack上实验验证了方案的有效性。
Li等人[79]提出利用云服务提供商和租户的安全职责分离实现多租户访问控制,云服务提供商负责租户的添加、删除和管理以及相关的安全问题,而由租户自己来管理自身的访问控制。比如,在PaaS服务模型中,云服务提供商提供一个安全的计算平台和开发环境,租户自己要确保应用程序安全可靠;在IaaS服务模型中,云服务提供商为客户提供可信的基础设施,租户自己要确保相关的实例和镜像安全。
Almutairi等人[80]提出一种分布式安全架构,该架构由3部分组成,即虚拟资源管理器(Virtual Resource Manager,VRM)、访问控制机制(采用基于角色的模型)和云服务提供商。由云服务提供商在多租户环境中实施的服务等级协议(Service Level Agreement,SLA),云间的通信、租户在同一层或不同层的通信以及内部云通信都采用这种分布式安全架构,他们还对这种安全架构进行了安全性证明。
2. 利用RBAC模型进行访问控制
基于角色的访问控制(Role-Based Access Control,RBAC)是一种经典的访问控制模型,它将用户分类为不同的角色,给予不同角色不同的权限。
Tang等人[81]提出在多租户认证系统的基础上引入RBAC访问控制模型,增加对不同租户的信任条件,并对多租户之间的信任进行形式化分析。
Yang等人[82]提出并设计了基于角色的多租户访问控制方案(Role-Based Multi-Tenancy Access Control,RB-MTAC),基于用户的身份管理来确定适合的角色。该方案可以有效地管理租户的访问权限来实现应用程序的独立和数据的隔离,并可以提高云环境中多租户服务的安全性和隐私性。
3. 通过Hypervisor实现虚拟机的访问控制
Hypervisor在虚拟机中具有较高的权限,可以利用对Hypervisor的信任,由Hypervisor来实现对虚拟机的访问控制。
Lucian等人[83]提出一种基于Hypervisor的多租户访问控制机制CloudPolice。他们给出了一种处理可伸缩性的方法,可以让Hypervisor动态地协调它所承载的虚拟机的访问控制策略。Hypervisor根据源虚拟机到目的虚拟机之间的具体通信状况来确定访问控制策略的分布,这些访问控制策略包括租户隔离、租户间通信、租户间公平共享服务和费率限制等。该方法的主要思想是:当数据流到来的时候,由Hypervisor在数据流到达目的虚拟机之前,发送一个访问控制策略数据包,来检测该数据流是否符合访问策略,如果不符合,则请求源Hypervisor停止或减少这种类型的数据流。该方法具有较好的伸缩性和健壮性。
Anil等人[84]比较了基于虚拟化的多租户架构与基于操作系统多租户的架构,两种架构都可以在虚拟机的Hypervisor上隔离用户,并通过一个共享的操作系统实现强制访问控制。研究表明,基于操作系统多租户的架构可以更加有效地管理虚拟机的安全。
目前的虚拟化技术已经比较成熟,多租户之间的访问控制策略一般和虚拟机内部结构和工作状态紧密相关,需要全面了解CPU虚拟化、内存虚拟化、I/O虚拟化的技术,才能在此基础上更好地改善其安全性。
上述方案利用访问控制来对内存的安全进行防护,Szefer和Lee[60]提出的HyperWall则利用CIP(Confidentiality and Integrity Protection)表对恶意Hypervisor和直接内存访问(DMA)攻击进行防范。
HyperWall利用CIP表对每个物理页标注Hypervisor和DMA的访问权限,并为CIP表提供一个可信的执行环境和存储区域。当Hypervisor或DMA访问内存时,HyperWall会检查CIP表,查看其是否有权进行访问。在虚拟机运行过程中,用户也可以进行虚拟机安全验证,查看是否存在非法访问自己虚拟机的内存,从而为入侵检测系统和恶意行为检测等提供依据。不过,HyperWall要求用户熟悉虚拟机系统的内存部署,能正确设定每个页面的访问权限,同时也存在数据残留问题,即对于异常终止的虚拟机,不能对其内存进行安全回收。此外,HyperWall保护的对象是客户虚拟机,对于虚拟机内部的安全威胁则是无能为力的。
Elwell等人[85]提出一种非包含性的(独占)内存访问权限机制(Non-Inclusive Memory Permissions,NIMP)。与HyperWall的思路不同,NIMP的保护对象可细化到应用程序,主要是防止跨层攻击,使得高特权层的软件只能按照低特权层软件预期的访问规则进行访问,以满足用户的安全需求。在NIMP中,每个物理页拥有一个2字节的权限位集合,其中的9 bits用来表明Hypervisor、内核和进程对该页的访问权限,这些访问权限是在分配页面的时候由安全硬件模块依据权限规则设定的。访存指令会对该权限规则进行相应扩展,添加该访存指令应具有的访存权限,从而保证了低特权层(如GOS)的内存页不能被高特权层软件(如Hypervisor)访问。在CPU的特殊Cache中存在7条权限转换规则,以此保证权限不能被非法转换。
这两种方案都需要对内核进行修改,HyperWall需要修改Hypervisor,而NIMP对进程、GOS和Hypervisor都要修改。NIMP只是一种特殊类型的方案,该方案针对的是特定攻击类型,并不能作为通用方案防护大部分攻击。而且,在NIMP方案中,可以实现跨域访问攻击。假设同一宿主机中运行的两个虚拟机,其系统分别为GOS1和GOS2。GOS1的指令具有读写(RW)权限,而GOS2的内存页的内核权限是RW。利用重映射使得GOS1可以访问GOS2的页,从而实现跨域访问。Payne等人[86]提出分层的访问控制模型,用以简化访问控制模块中的主客体关系链。
3.3.2 虚拟机隔离
早在1973年,Lampson[87]就认识到了隔离的重要性,而且在早期的计算机设计中,比如Multics[88]和Cambridge CAP计算机中已经使用硬件特性实现地址隔离。随着对计算机系统的安全性要求越来越高,组件隔离成为计算机系统的一项基本的安全策略,也是实现更高级别系统安全策略的基础。比如在处理器内有保护内存的硬件,如内存管理单元(Memory Management Unit,MMU),可以分配不同的虚拟地址给不同的进程以实现进程隔离。操作系统或管理程序可以利用这些硬件组件和自身的软件技术,在软件组件之间实现一种隔离策略。比如操作系统内核必须与驻留的应用程序隔离,这样操作系统就可以控制和实施I/O资源的访问控制策略。如果没有这种隔离,一个恶意的应用程序就可以破坏内核,进而阻止内核运行任何其他的安全服务或者窃取其中的安全敏感信息[89]。
在多租户以及多实例的虚拟化环境中,虚拟机之间的隔离程度是虚拟化平台的安全性指标之一。通过隔离机制,虚拟机之间独立运行、互不干扰。
文献[90]对系统安全隔离技术做了详细的阐述,其中将系统隔离从实现的层次划分为3类,即硬件隔离技术、软件隔离技术及系统级隔离技术。但具体到虚拟机隔离技术,我们将其分为两类,即硬件隔离技术与系统级隔离技术。
1. 硬件隔离技术
硬件隔离技术利用硬件本身提供完整性监控保护,从而为虚拟化环境提供一个非常安全的隔离运行环境。为了保证系统中敏感信息的安全,在进行系统安全设计时,考虑使用专用的硬件模块来提供一个相对安全的硬件隔离环境。在此安全环境中,可以执行敏感程序、实施访问控制、对敏感数据进行加密处理等。可以要求所有程序的运行要通过此模块的认证,这样就可以将系统中的敏感数据、密钥等存储在此模块中。
使用硬件技术实现隔离,一般由处理器或与主处理器连接的专用设备提供隔离功能。通常,有两种实现硬件隔离的方案,一种是在进行芯片设计时设计一个专门的硬件模块来处理安全事务,一种是在进行芯片设计时在芯片内集成一个专门的硬件模块。
第一种方案包括通常使用的智能卡以及手机中使用的SIM(Subscriber Identification Module,用户身份识别模块)卡。在当前智能计算时代,几乎人人手中都持有至少一个智能设备,其中最广泛使用的智能卡在移动网络中作为用户身份的标识,也作为信用卡的安全组件,可以实现各种类型的安全认证。另外一种实现隔离的计算设备是经典的IBM 4758加密协处理器,可以在通用计算机中处理金融类高安全性应用中的数据加解密,将其非易失性存储隔离在防止篡改的空间内。
第二种方案在芯片设计时在芯片内集成一个专门的硬件模块,又可以分为两类:一类是管理加密操作和密钥存储的硬件安全模块;另一类是专门为安全子系统设计的通用处理器——通过在主处理器中内置通用处理引擎,来专门为安全子系统提供专用的安全处理模块。该方案主要是使用定制的硬件逻辑来阻止未授权软件对系统敏感资源的访问。
IO内存管理单元(Input/Output Memory Management Units,IOMMU)[91]可以将设备DMA地址转换到物理地址,限制设备只能访问得到授权的部分内存。因此,操作系统可以利用IOMMU来隔离设备的驱动程序,虚拟机也可以利用IOMMU来限制硬件对虚拟机的直接访问。
硬件隔离技术也存在一些局限性,因为修改硬件是一个长期的任务,需要产业界达成一致共识才可能实现。
2. 系统级隔离技术
系统级隔离技术是结合硬件的安全扩展和可信软件在系统中构建一个相对安全可靠的可信执行环境(Trusted Execution Environment,TEE)[92],以将可信程序或敏感数据保护在该隔离环境中,同时也可以限制恶意代码的扩散。
2008年,Chen等人[15]提出OverShadow,利用VMM为虚拟机中的指定程序提供了一个私密运行空间,在这个运行空间中运行的程序,其内存是不能被操作系统或其他程序访问的。这种内存的隔离性保证了数据在内存中的高度私密性,即使整个OS受到损坏也能为应用数据提供保护。另一方面,程序使用的数据在磁盘上的存储是密文形式的。虚拟机监控器在读写数据时会分别为数据进行解密和加密。结合了上述两项保护,用户数据在存储设备和内存中都得到了虚拟机监控器的保护。
Azab等人[93]提出一种基于TrustZone的实时内核保护机制(TrustZone-based Real-time Kernel Protection,TZ-RKP),采用某种技术来限制普通程序对某些特权系统功能的控制,可以有效地阻止修改或注入二进制文件的攻击,也可以阻止修改系统内存布局的攻击。
Sun等人[94]提出一种基于TrustZone隔离环境的保护动态口令(On Time Password,OTP)安全的机制TrustOTP,能够在OS遭受损害甚至毁坏的情况下保护OTP的完整性。Li等人[95]基于TrustZone平台提出一种在线移动广告认证的安全机制AdAtterster。Yang等人[96]基于TrustZone机制提出一种安全有效的直接匿名认证(Direct Anonymous Attestation,DAA)机制DAA-TZ。这些研究都是利用系统级安全隔离环境来隔离OS中的敏感应用,防止其中敏感操作和关键数据遭受恶意攻击。以上研究表明,基于系统级隔离环境实现应用程序的保护已然是一种比较行之有效的方法。
Steinberg等人[97]提出一个简单的瘦虚拟化架构NOVA,通过减少攻击面来改善系统的整体安全性。Lacombe等人[98]在硬件虚拟化的基础上提出了一个轻量级的虚拟机Hytux,它拥有比Linux内核更高的权限,从而能保证Hytux中的防护系统内核的安全机制免遭恶意攻击。
Lange等人[99]基于先进的微内核提出一个通用操作系统框架L4Android,它允许虚拟机与安全应用并行运行,同时确保了它们之间的安全隔离。Klein等人[100]提出一个对操作系统内核进行验证的形式化方法seL4,用于检验由于软件漏洞等产生的一些安全隐患。该方法可以对微内核的某些安全性质进行全面、严格的检查。
Ren等人[101]提出为安全敏感型应用提供一个安全执行环境的方案AppSec,能够根据应用程序的意图保护用户的私有数据和人机交互数据。AppSec将系统中应用分为高特权和低特权两种类型,只有受保护的高特权进程能够访问到自身窗口中的数据。AppSec利用隔离机制防止用户与系统设备交互的数据被恶意内核截获,并且能够在运行时通过存储在Hypervisor中的哈希值对共享动态链接程序进行验证,保证共享动态链接库不被篡改。
Rutrowska等人[102]提出一种利用x86系统的CPU系统管理模式(System Management Mode,SMM)来监控虚拟机完整性的机制Hyper Guard。Wang等人[103]提出一个硬件辅助的完整性监视器HyperCheck,利用x86系统的CPU SMM安全地生成和传输被保护主机的状态信息到外部服务器,可以检测出影响Xen虚拟机和传统操作系统完整性的Rootkit,从而保护主机的VMM的完整性。与HyperGuard相比,HyperCheck有更好的监控性能。
Azab等人[104]提出一个度量系统中运行的Hypervisor或其他最高权限软件层的完整性的系统架构HyperSentry。HyperSentry通过引入一个与Hypervisor隔离的组件来评估运行的Hypervisor的完整性,而且可以保存度量上下文,从而可以恢复一个成功的完整性度量所涉及的输入信息。Lengyel等人[105]提出一个基于TrustZone的多层次安全的隔离环境,用于检测Hypervisor的完整性。它可以对关键组件载入及运行时的完整性进行验证,也可以对虚拟机异常状态进行自查。
这些系统都可以对内核和虚拟机的完整性执行周期性检查,但是所有的攻击都只能在攻击发生后才能被检测到,如果一些恶意程序具有隐藏功能,那么以上系统都检测不到。因此,合理的检测系统应该能在攻击发生之前就可以进行预判,从而阻止攻击的发生。
McCune等人[106]提出一个基于可信平台模块(Trusted Platform Module,TPM)的隔离系统Flicker,该系统具有很小的可信计算基(Trusted Computing Base,TCB),可以用来执行敏感代码并提供了执行代码的远程认证功能,但是具有较大的性能开销。
为了改善Flicker的性能,他们又提出一个专用的Hypervisor,记作TrustVisor[107]。它利用硬件虚拟化的特性和TPM为进程和内核提供一个隔离的运行环境,称为PAL(Pieces of Application Logic,应用程序逻辑块)。PAL可以保证其内数据的完整性和机密性。TrustVisor能够对应用进程的敏感代码和数据进行细粒度的保护,而且TrustVisor很小巧,可以方便地进行形式化验证,同时也减小了可信计算基的大小。在Iso-X[108]中也采用了这样的思想。隔离执行环境的缺点是需要由程序开发者指定隔离域,这需要程序员有良好的编程习惯和编程素养。
以Docker[109]为代表的容器技术,作为一个开源的引擎,能为任何应用创建一个轻量级、可移植的及自给自足的容器。在最小化需要运行的容器上,开发者需要权衡容器与系统之间的分离度,而虚拟机与主机的分离性比容器会更高。Docker可以从操作系统内部为应用程序提供隔离的运行空间,是一种操作系统层的虚拟化。在Docker中,每个容器独享一个完整用户环境空间,且一个容器的变动不会影响其他容器的正常运行。
沙箱(SandBox)[110]技术按照严格的安全策略来限制不可信进程或不可信代码运行的访问权限,因此它能用于执行未被测试或不可信的应用。沙箱内的应用需要访问系统资源时,它首先会发出读系统资源的请求,然后系统会核查该资源是否在它所操作的权限范围内,如果核查通过则完成读请求,否则系统会拒绝其操作。沙箱能为不可信应用提供虚拟化的内存、文件系统和网络资源等,也正是由于其内的资源被虚拟化,它能将不可信应用的恶意行为限制在有限的机制内,这样能防止不可信应用可能损害其他应用甚至是威胁系统的安全。
以上是系统级隔离技术的相关研究工作。相比而言,硬件隔离技术可以很好地将敏感数据保护在可靠的物理设备中,并可以采用更加先进的防篡改技术,但是纯硬件加密模块会增加系统的功耗并且需要在芯片上增加专门的模块,通用安全处理器则因为需要与主处理器通信而影响系统性能,因此硬件隔离技术会影响系统的性能。系统级隔离技术不需要重新设计硬件,因此开发成本小且周期短,对系统的性能影响也较小。
3.3.3 其他安全机制
由于操作系统的功能非常强大,其实现机制也很复杂,那么区分哪些程序是正常或异常的也是一件比较困难的事情。Hofmann等人[16]提出一种基于虚拟化的安全框架InkTag,通过验证客户操作系统的行为,保证即使是恶意的GOS也能够安全地执行高敏感进程(High Assurance Process,HAP)。InkTag通过基于半虚拟化的验证机制强制GOS为Hypervisor和应用程序提供验证自身行为的相关信息,利用超级调用在切换的过程中对HAP的上下文进行保护,并对内存页进行完整性检查和机密性保护。在运行的过程中,InkTag可以限制GOS对HAP寄存器数据的修改,从而保证HAP的控制流完整性不会被GOS破坏。InkTag并没有采取将HAP数据/代码与GOS隔离的机制,而是提出了一种基于属性的访问控制机制(Attribute Based Access Control),让用户灵活地设置针对HAP的访问控制策略,从而保护他们自己的数据机密性和完整性。但是InkTag需要对GOS进行更改,同时需要重新编写HAP,使其支持超级系统调用,这样可能会导致与其他系统的兼容性问题。此外,由于GOS与Hypervisor交互的接口,造成Hypervisor被攻击的可能;同时如果GOS拒绝将信息传递给Hypervisor,则会形成DoS攻击。
在提高虚拟机可靠性的镜像备份以及备份去冗方面,也有一些研究工作。在文献[111]中,徐继伟等人提出一种基于遗传算法的虚拟机镜像自适应备份策略,即针对不同的虚拟机镜像备份策略,分别建立资源需求模型,根据系统当前资源占用情况自适应地进行策略规划,从而最小化备份时间。Jin等人[112]提出一个虚拟机镜像系统中的去冗余方案,他们的实验表明在虚拟机镜像去冗余中变长切分和定长切分的效果相近。Fu等人[113]采用“源”去冗余(Source Deduplication)方案在私有云计算环境中实现了虚拟机备份,备份数据先在“源”端进行聚合再传输到备份端。Jayaram等人[114]分析了虚拟机镜像的相似性,指出虚拟机镜像具有小范围相似的特点。Zhang等人[115]针对大规模的虚拟机镜像去冗余提出了一种低开销可扩展的解决方案,其核心思想是在实际的存储中进行重复数据检测,而不是内联去冗余。该方法将数据索引进行划分,在不同虚拟机之间执行去冗余。
针对虚拟机系统中存在的网络方面的威胁,如拒绝服务攻击,Lakshmi等人[116]提出了一种新的I/O虚拟架构,为每个虚拟机配置一个虚拟网卡,虚拟机可以通过自身的网卡驱动与虚拟网卡直接进行通信,然后通过VMM监视每个虚拟机的数据流。这样可以防御诸如DMA的无控制漏洞和DoS攻击等威胁;与此同时,也可以提高网络性能。
Catuogno等人[117]提出一种基于TCB的可信虚拟域(Trusted Virtual Domain,TVD)的设计和实现,通过安全策略和TVD协议实现可靠性。在交叉平台架构下,实现TVD的生命周期管理,并在Xen和L4微内核平台上实现原型系统。Berger等人[118]则通过软件方法设计了基于硬件TPM的虚拟TPM来保证多个虚拟机的可靠性。Ruan等人[119]设计了一种通用可信虚拟平台架构(Generalized Trusted Virtualized Platform architecture,GTVP),将控制域划分为管理、安全、设备、操作系统成员及通信5个子域,每个子域都完成相应的功能,以实现安全以及负载均衡的目标。
程川[120]提出了一种基于Xen的信任虚拟机安全访问机制,为用户提供了一种有效的安全访问敏感数据的模式。其核心思想是利用虚拟机的隔离性,为数据应用提供一个专用的隔离环境,同时利用可信计算技术保证该虚拟平台配置状态的可信性。
Jansen等人[121]提出利用传统的安全技术如入侵检测技术,并通过虚拟化来提高系统的安全性和独立性。首先在安全主域配置入侵检测系统,通过对客户机的用户命令信息和内核内存所获取的信息进行比较以判断是否为入侵,然后通过设置保护模块获取客户机系统调用、进行进程等事件管理,实现完整性保护。张志新等人[122]提出了基于Xen的入侵检测服务,通过在VMM层设置入侵检测系统,可以监控到所有对操作系统的入侵,同时将系统放置在一个独立于操作系统之外的受保护的空间内,增强了入侵检测系统的独立性和检测能力。
朱民等人[123]针对虚拟化软件栈不同软件层的安全威胁、攻击方式和威胁机理进行了分析,并针对这些安全威胁,以可信基为视角,从基于虚拟机监控器、基于微虚拟机监控器、基于嵌套虚拟化和基于安全硬件等类别分析比较了国内外相关安全方案和技术,并指出了当前仍然存在的安全问题。另外,针对云计算和虚拟化的安全问题的研究工作还可以参考文献[124-126]等。
另外,在实施安全策略的过程中应坚持以下原则。
(1)正确配置虚拟机监视器并对客户虚拟机进行监控,及时发现入侵和攻击并阻止它们。
(2)远程管理程序的连接采用动态身份认证和防SQL注入技术,防范对管理程序的攻击。同时,虚拟机的管理应仅限于企业的关键工作人员,这些人员要有较好的职业操守和安全意识。
(3)保持虚拟机系统及管理程序安装最新升级或补丁,要定期进行检查或自动升级,从而防范攻击者利用已知的漏洞对系统及管理程序发起攻击。
(4)对虚拟机的资源进行约束,防止单个虚拟机独占所有物理资源,造成拒绝服务攻击。
(5)将资源进行再分配时,建议对存储区域进行重写覆盖,因为前虚拟机的数据存于内存或硬盘上,分配给别的虚拟机时,需要将这些数据进行重写覆盖。
(6)云服务提供商应该提供较好的虚拟机备份机制,定期创建备份。
(7)在虚拟机迁移过程中,检查迁移虚拟机的环境,对虚拟机内存等状态信息和虚拟机副本进行保护。此外,在虚拟机进行迁移、暂停并重新启动时,建立对安全性进行明确定义和记录的策略。