本文解释安全引导,并说明如何将其扩展到 Linux(特别是 RHEL7)。此外,它还提供对 Linux“可信内核引导”的一些见解,并为用户空间应用提供一些启示。
安全引导旨在使用选项 ROM 和 MBR 等机制防止以下情况:引导时安装在内存中的根工具包加载到操作系统,将系统控制劫持并保持隐藏状态,让反恶意软件程序无法发现它们。 随着时间的推移,这个问题变得益发严重,在数据丢失/损坏和盗窃中起着重要作用。恶意软件可出现在 BIOS 和操作系统加载程序的中间。此外,它还可出现在操作系统加载程序和操作系统之间。
UEFI 是适用于现代服务器平台的硬件/软件接口的新标准,具有一系列丰富的 UI、模块性和标准接口,供 IHV 开发 UEFI 中的设备驱动程序,这些驱动程序能够在比传统 BIOS 环境更灵活的预引导环境中无缝地工作。操作系统和平台对 UEFI 的采用率继续增长,许多主要的客户端和服务器操作系统版本都支持 UEFI。
在 Microsoft 的领导下,UEFI 标准机构确定了一种禁止安装启动时恶意软件根工具包的方法,该方法使用加载和执行未经修改且平台已知的二进制文件的机制。此机制称为安全引导 - 请参阅 Microsoft way of Secure boot(Microsoft 的安全引导方式),以了解 Microsoft 信息,不同操作系统供应商采用不同方法以相似的方式来实现安全引导。
安全的 UEFI 平台只加载未经修改且受平台信任的软件二进制文件,例如选项 ROM 驱动程序、引导加载程序、操作系统加载程序。 UEFI 规格在这里详细描述了安全引导机制。
UEFI 规格定义了安全引导所需的基础架构。我们将简要介绍安全引导中使用的术语,以帮助那些希望更详细了解安全引导的人。
安全引导在运行时不保护系统及其数据。如果引导过程中没有对任何组件进行身份验证,则安全引导将停止引导到操作系统(这将阻止系统运行隐藏的恶意软件)。
这些关键字是安全引导的基础。UEFI Specification(UEFI 规格)讲述有关这些关键字的更多信息。这些规格详细介绍如何对二进制文件进行签名;具体请参阅第 28 节。
经过身份验证的变量:UEFI 提供一项名为“经过身份验证的变量”的服务,这意味着只有经认证的模块或可信代码模块才能写入,即只有具备密钥证书的代码模块才能写入。但任何一方都可以解读这些变量。
平台密钥 (PK):平台密钥在平台所有者和平台制造商安装在 NVM 中的固件之间建立信任关系。
KEK:密钥交换密钥在操作系统和平台固件之间建立信任。KEK 由操作系统和/或希望与平台固件通信的第三方组件安装在平台中。
数据库:经授权的数据库,其中包含被授权与平台固件交互的代码模块的公钥和证书。
DBX:黑名单中的数据库。与这些证书匹配的任何代码模块都不允许开始加载。
签名:签名由将要签名的二进制文件的私钥和哈希生成。
证书:包含与用于为图像签名的私钥相对应的公钥的可信代码证书
UEFI 平台固件将加载由证书颁发机构 (CA)(在此示例中是 Microsoft)签名的第三方驱动程序、选项 ROM 和操作系统加载程序。任何硬件供应商都可以在 UEFI BIOS 中编写驱动程序,并由 Microsoft 对其进行签名,以便在 UEFI 平台上运行。 OEM 在平台数据库中安装密钥的公共部分,并且 UEFI 加载程序协议服务会根据经授权的数据库验证二进制文件的签名,然后才允许它在平台上运行。这一系列的身份验证从 UEFI 持续到操作系统加载程序和操作系统。
总之,UEFI 允许运行已签名且其密钥存在于数据库中的操作系统加载程序。此密钥机制确保操作系统加载程序或选项 ROM 只有在得到任何一方的授权且未经修改时才能执行。
图1:UEFI 平台固件