2.1 分区和分离内核
1.分区和分离内核的概念
分区和分离内核是计算机系统安全领域中两个重要的概念。
分区通常指将系统资源(如内存、存储器、处理器等)分割成多个独立的部分,每个部分可以分配给不同的应用程序或用户。这种技术使得多个应用程序或用户可以在同一台计算机上运行,同时互相隔离,从而提高了系统的安全性和稳定性。在本书中,分区技术特指虚拟化技术。
分离内核是指使用专门的软件或硬件技术将操作系统内核分隔成多个独立的部分,每个部分都有自己的资源管理和保护机制。这种技术可以提高系统的安全性和可靠性,因为即使一个分区内的系统被攻击或发生崩溃,其他部分仍然可以正常工作。
英国计算机科学家约翰·拉什比(John Rushby)在1981年的论文“安全系统的设计和验证” 中首次描述了分离内核的概念:“分离内核的任务是创建一个和物理分布式系统类似的环境:它必须看起来像每一个分区都是一台单独隔离的机器,并且信息只能从一台机器沿着一条已知的外部通信线路流向另外一台机器”。
拉什比认为分隔非常重要,传统的操作系统无法真正实现分隔。因为传统的操作系统大而复杂,很难做到万无一失。拉什比认为构建一个安全计算机系统的最佳方案是将传统操作系统的分隔管理剥离出来,放入专注于分隔功能的分离内核架构中实现。这种分离内核实现应该足够小,以便对其仔细检查并能被形式化证明。1982年,拉什比在“隔离性证明”的相关论文中继续描述了如何使用数学形式化方法来验证这种分离内核的正确性。
分离内核最初用于保障政府和美国国防部应用程序工作站的安全性,以实现对机密(Top Secret)信息、秘密(Secret)信息以及保密(Confidential)信息的分类隔离。后又应用于安全无线电网关(Secure Radio Gateways)之类的嵌入式军事网络通信系统。如今,分离内核已经成为嵌入式系统和对安全隔离要求更高的航空系统的Ⅰ型Hypervisor的实现方式,以便更高效地消除多核之间的干扰。尽管如此,分离内核仍然是一个安全相关的概念,只在对安全有需求的工业界才能认识到其价值。
2.SKH简介
(1)SKH的定义
一般来说,基于分离内核的Ⅰ型Hypervisor(即SKH)的定义如下:既通过分区的概念实现了应用之间的时空域隔离,达到了容错和简化验证的目的,又通过在不同分区采用不同安全级别的多级安全(Multi-Level Security,MLS)架构为系统提供了安全可靠的基础支撑,避免操作系统中的访问控制机制被篡改、绕过,使得各个安全关键任务独立运行,通过受控的消息机制进行交互,有效保证了各个应用和各部分数据的独立安全性。
SKH是小而精的虚拟化技术,利用现代处理器的硬件功能(特权模式/用户模式、硬件虚拟化扩展)定义Hypervisor的分区行为,并控制分区间的信息流。SKH内核不包含设备驱动程序,没有用户模式,没有shell访问,没有动态内存分配,所有这些辅助功能都由分区的客户操作系统的软件来实现。这种简单优雅的体系结构遵循了极小化设计原则。虽然这种实现不适合桌面系统,但非常适用于嵌入式(实时)系统,以及对安全性十分敏感的安全关键(Safety-Critical)系统。
现代多核处理器包含丰富的资源集合,SKH充分利用了现代处理器的硬件资源。除了多个处理器核心之外,还包含外围设备、内存以及硬件辅助虚拟化功能。它们使得构建各个分区的配置过程像搭建积木一样容易。
(2)SKH的基本架构
SKH(见图2-1)将处理器硬件资源划分为多个防篡改和完全隔离的可靠分区,并且分区之间以及分区和外围设备之间的信息流都有严格控制。除非获得明确的许可,否则分区之间是完全隔离的。SHK架构的分区系统可以充分利用功能丰富的多核处理器优势。
图2-1 SKH的基本架构
SKH架构的主要组成部分如下。
1)分区管理子系统:用于分区的调度管理。
2)分区通信子系统:用于分区之间或者分区和SKH内核之间的通信管理。SKH的设计借鉴了ARINC653标准,采用了ARINC653中规定的消息传递模型,分区间传递消息的途径是通道。通道定义了一个源分区与一个或多个目的分区之间的逻辑连接关系,指定了从源分区到目的分区的消息传递模式以及要发送消息的特性。分区通过已定义的访问点访问通道,访问点称为端口。通道由一个或多个端口以及相关的资源组成,端口提供资源,以便分区在特定的通道中发送或接收消息。分区间的消息通信方式分为两类:固定长度且允许覆盖的采样方式和可变长度且不允许覆盖的队列方式。
3)健康监控子系统:用于监测系统的异常事件或者状态,并做出处理。健康监控的目标是在错误出现的早期发现它,并试图解决错误或者隔离出错的子系统,以免影响整个系统的运行。
4)跟踪管理子系统:SKH提供给分区的超级调用服务,用于监控和调试系统的运行状态。
5)内存管理子系统:用于实现分区之间以及分区和SKH内核之间的内存隔离与访问控制。
6)时间管理子系统:为分区提供时钟服务以及基于时钟服务的分区本地定时器和分区全局定时器。
7)应用接口层:由SKH定义的、提供给应用分区的服务,分区通过超级调用接口来获取这些服务。
8)系统接口层:由SKH定义的、提供给系统分区的服务,分区通过超级调用接口来获取这些服务。
9)硬件访问子系统:负责管理硬件资源。它包含处理必要硬件的一组驱动,比如处理器、中断、硬件时钟、硬件定时器、页表等。
10)安全函数子系统:包含一个微型函数库。该库提供了一组严格定义的标准C函数(如strcpy()、memcpy()、sprint()等)以及一系列数据结构(如链表、队列),为其他子系统提供服务。
11)系统分区和应用分区:系统分区可以用来监控和管理其他应用分区的状态。一些超级调用程序仅限于系统分区调用,还有一些超级调用程序仅在系统分区未被使用时才能被应用分区使用。系统分区的权限仅限于管理系统,而不能直接访问本地硬件或者打破分区之间的隔离。系统分区和应用分区一样参与调度。
3.SKH的优势
SKH是为应用程序提供一个或者多个时空域隔离的分区执行环境的软件层。ARINC653定义了一个时空域隔离的分区系统,尽管ARINC653本意并不是用来描述分区系统的工作机制的,但是ARINC653定义的部分APEX模型已经大体上描述了一个分区系统应该具有的功能。在嵌入式SKH实现中,分区不再是具有强制隔离性质的一组进程,而是一个虚拟的执行环境,在分区中既可以执行一个裸机的应用,也可以运行一个支持多任务的操作系统级应用。可以说,SKH是一层最接近硬件的软件层(中间层)。尽管SKH没有完全兼容ARINC653标准,但是ARINC653的设计思想(分隔)已经潜移默化地应用在SKH的设计当中。
作为Ⅰ型Hypervisor,SKH直接运行在嵌入式硬件上,能够确保整个系统表现出最好的性能。另外,SKH支持SMP(Symmetric Multi-Processing,对称多处理)多核处理器,可以更加有效地管理多核竞争带来的不确定性,充分利用硬件资源。
在嵌入式领域,SKH只是Ⅰ型Hypervisor的一种实现方式。另外一种实现方式是基于现有操作系统扩展和微内核扩展的Hypervisor,其中依赖的Host OS(比如sel4)也比较精简(只包括基本功能,比如CPU调度和内存管理,而设备驱动和其他可变组件则处于内核之外)。这类Hypervisor应当归于Ⅰ型还是Ⅱ型,业内尚存在分歧,但是从实现机制上来看,基于操作系统扩展的Hypervisor应属于Ⅱ型Hypervisor的范畴。
接下来讨论一下这两种Hypervisor的实现方式。