启动链基础:UEFI固件、BIOS与UEFI的区别、启动流程概述,以及Secure Boot在启动链中的位置
在深入Secure Boot的签名验证机制之前,必须先厘清现代计算机的启动链(Boot Chain)结构。启动链是硬件从加电到操作系统内核接管之间所执行的一系列固件与引导程序的有序集合。这一链条的每一个环节都承载着信任传递的职责——如果链条中任何一个环节被篡改或替换,后续所有环节的安全性都将失去根基。本章将系统梳理UEFI固件的角色、BIOS与UEFI的本质差异、标准启动流程,并明确Secure Boot在启动链中的精确位置与作用边界。
上图展示了从硬件加电到操作系统接管之间的完整信任链结构。Secure Boot并非独立运行的组件,而是嵌入在UEFI固件中的一套策略引擎,它位于固件层与引导加载层之间,对每一个即将执行的EFI应用(包括引导加载程序、驱动、内核镜像)进行签名验证。理解这一位置关系,是后续配置和管理Secure Boot的基础。
2.1 BIOS与UEFI:从传统固件到现代固件接口
核心原理:BIOS(Basic Input/Output System)诞生于1980年代,最初设计为16位实模式下的固件接口,负责硬件初始化并提供中断调用服务。其启动流程相对简单:加电自检(POST)→ 读取CMOS配置 → 按启动顺序查找引导扇区 → 将MBR(主引导记录)加载到内存并跳转执行。BIOS的局限性在于:无法直接支持大容量磁盘(超过2TB的GPT分区)、启动速度慢、缺乏模块化扩展能力,且没有原生的安全验证机制。
UEFI(Unified Extensible Firmware Interface)是Intel在2000年代推动的下一代固件标准,后由UEFI论坛统一管理。UEFI运行在32位或64位保护模式下,使用GPT分区表,支持网络启动、图形界面、驱动模型和可扩展的EFI应用。更重要的是,UEFI规范从设计之初就考虑了安全启动需求,定义了签名数据库和验证协议,这正是Secure Boot的规范基础。
| 对比维度 | 传统BIOS | UEFI固件 |
|---|---|---|
| 运行模式 | 16位实模式 | 32/64位保护模式 |
| 磁盘分区 | MBR(最大2TB) | GPT(支持大容量) |
| 启动方式 | 读取引导扇区代码 | 加载EFI应用(.efi文件) |
| 扩展性 | 中断调用,功能固定 | 驱动模型,可加载模块 |
| 安全机制 | 无原生验证 | Secure Boot签名验证 |
| 启动速度 | 较慢(逐项初始化) | 较快(并行初始化) |
| 用户界面 | 文本菜单 | 图形界面(可定制) |
msinfo32 查看“BIOS模式”字段;Linux下可执行 ls /sys/firmware/efi,若目录存在则为UEFI启动。
2.2 UEFI启动流程的四个阶段
操作流程:UEFI固件的启动过程分为四个标准阶段,每个阶段都有明确的职责边界和内存状态要求:
- SEC(Security Phase,安全验证阶段):CPU加电后的第一条指令入口,负责CPU初始状态设置、缓存作为临时存储、以及验证下一个阶段(PEI)的固件卷(FV)完整性。SEC阶段是信任根的起点,其代码固化在SPI Flash的最前端,不可被篡改。
- PEI(Pre-EFI Initialization,EFI预初始化阶段):主要完成内存控制器的初始化,探测并配置系统内存(DRAM),同时将固件卷从Flash中解压到内存。PEI阶段以PEIM(PEI Module)形式运行,每个模块负责特定的硬件初始化任务。
- DXE(Driver Execution Environment,驱动执行环境阶段):这是UEFI固件的主体阶段,加载并执行大部分设备驱动(如SATA、USB、NVMe、显示驱动),建立EFI系统表(System Table)、启动服务(Boot Services)和运行时服务(Runtime Services)。DXE阶段结束后,系统具备完整的硬件抽象能力。
- BDS(Boot Device Selection,启动设备选择阶段):根据固件中的启动顺序(BootOrder)变量,遍历所有可引导设备,查找EFI系统分区(ESP)中的
.efi引导文件。BDS阶段会调用LoadImage和StartImage服务来加载并启动引导程序,此时Secure Boot的验证钩子被触发。
2.3 Secure Boot在启动链中的精确位置
核心原理:Secure Boot的验证逻辑嵌入在UEFI固件的 LoadImage() 和 StartImage() 服务中。当BDS阶段尝试加载任何EFI应用时,固件会先检查该镜像的签名,验证流程如下:
LoadImage() 调用流程:
1. 读取EFI镜像文件头(PE/COFF格式)
2. 提取镜像的签名表(Certificate Table)
3. 使用DB(允许数据库)中的证书/哈希进行匹配
4. 若匹配失败,检查DBX(禁止数据库)是否包含该签名
5. 验证通过 → 允许加载;验证失败 → 返回EFI_SECURITY_VIOLATION
6. 若镜像未签名,且Secure Boot处于Setup Mode,则允许加载并提示
Secure Boot的信任模型基于四个关键数据库:PK(Platform Key,平台密钥)是最高级别的信任根,用于验证KEK的签名;KEK(Key Exchange Key,密钥交换密钥)用于验证签名数据库的更新;DB(Allowed Database,允许数据库)包含受信任的证书或镜像哈希;DBX(Forbidden Database,禁止数据库)包含已撤销或恶意的证书/哈希。这四个数据库存储在NVRAM中,由固件管理。
| 数据库 | 作用 | 更新方式 | 安全级别 |
|---|---|---|---|
| PK | 验证KEK签名,平台所有权 | 物理存在或固件更新 | 最高 |
| KEK | 验证DB/DBX更新签名 | 由PK签名的更新 | 高 |
| DB | 允许执行的EFI镜像签名 | 由KEK签名的更新 | 中 |
| DBX | 禁止执行的EFI镜像签名 | 由KEK签名的更新 | 中 |
2.4 常见误区与配置实践
判断方法:在实际部署Secure Boot时,运维人员常遇到以下误区,需要特别注意:
- 误区一:Secure Boot会阻止所有未签名程序。实际上,Secure Boot只验证EFI可执行文件(.efi),不影响操作系统内部的普通应用程序。Linux内核模块(.ko)的签名验证由内核自身管理,与Secure Boot无关。
- 误区二:启用Secure Boot后无法安装Linux。主流Linux发行版(Ubuntu、RHEL、Debian等)均提供经过Microsoft签名的shim引导程序,shim再加载发行版自己的证书链,因此可以正常启动。只需确保固件中启用了“Microsoft UEFI CA”证书。
- 误区三:Secure Boot可以防止rootkit。Secure Boot只能防止启动链前端的篡改,一旦内核运行,恶意模块仍可能被加载。需要配合内核模块签名验证和运行时完整性监控。
1. 在每台机器上进入固件设置,将Secure Boot模式从“Standard”切换为“Custom”;
2. 使用
KeyTool.efi 或 efi-updatevar 工具,删除默认的Microsoft证书,导入企业自建的PK、KEK和DB证书;3. 使用企业证书对shim和GRUB进行签名(通过
pesign 或 sbsign 工具);4. 在ESP分区中放置签名后的引导文件,并验证启动链完整性;
5. 部署后,通过
sbverify --list 检查镜像签名状态,确认所有引导组件均被正确签名。结果:所有工控机在启用Secure Boot后启动正常,且通过固件日志确认每次启动均执行了签名验证。后续发现一台机器因NVRAM空间不足导致DB更新失败,通过清理过期证书解决了问题。