3. 安全启动技术原理:PK、KEK、db、dbx证书数据库的层级结构与信任链

UEFI 安全启动(Secure Boot)的核心是一个基于公钥基础设施(PKI)的分层证书数据库与静态信任链验证机制。该机制确保平台在启动过程中仅执行经过授权的、未被篡改的固件、引导加载程序(Boot Loader)及操作系统内核。理解 PK、KEK、db、dbx 四个数据库的层级关系与交互流程,是掌握安全启动配置与排错的基础。

3.1 证书数据库的层级结构

安全启动的信任模型由四个关键组件构成,它们以严格的层级关系存储在 UEFI 非易失性变量中:

数据库 全称 层级位置 核心作用 签名对象
PK Platform Key 根信任(Root of Trust) 建立平台所有者对固件的控制权;授权 KEK 更新 KEK 证书
KEK Key Exchange Key 第二层(密钥交换层) 授权操作系统与第三方对 db/dbx 的更新操作 db / dbx 证书
db Signature Database 第三层(白名单) 存储受信任的签名证书或哈希,允许执行对应镜像 Boot Loader / OS Loader / 内核
dbx Forbidden Signature Database 第三层(黑名单) 存储已撤销或恶意的签名证书或哈希,阻止执行 被吊销的 Boot Loader / 内核
关键原则:PK 是信任的锚点,只有使用 PK 私钥签名的 KEK 更新请求才被接受;只有使用 KEK 私钥签名的 db/dbx 更新请求才被接受。这种单向授权机制防止了未经授权的恶意软件篡改信任数据库。

3.2 信任链验证流程

在平台启动过程中,UEFI 固件按以下顺序执行签名验证,形成一条从硬件到操作系统的信任链:

  1. 固件启动阶段:UEFI 固件(SEC/PEI 阶段)首先验证自身完整性,然后加载 DXE 阶段驱动。此阶段信任根固化在固件代码中。
  2. Boot Manager 阶段:固件读取 Boot#### 变量指向的引导加载程序(如 shim.efi、grubx64.efi)。
  3. 签名验证:固件计算镜像的哈希值,并与 db 数据库中的白名单条目进行匹配。同时检查 dbx 黑名单,确保镜像未被吊销。
  4. 授权执行:若镜像签名在 db 中且不在 dbx 中,则固件授权执行该引导加载程序。
  5. 链式传递:引导加载程序(如 shim)继续验证下一阶段镜像(如 GRUB 或 Linux 内核),通常使用内嵌的证书或 Machine Owner Key(MOK)。
  6. 内核加载:最终,经过签名的 Linux 内核(vmlinuz)被加载并执行,完成安全启动链。
实践提示:在配置自定义内核参数签名时,通常需要将自签名的证书添加到 MOK(Machine Owner Key)列表,而非直接修改 db。MOK 由 shim 引导加载程序管理,避免了修改固件数据库的风险。

3.3 证书数据库层级关系 SVG 架构图

下图展示了 PK、KEK、db、dbx 之间的层级授权关系与信任链流向:

UEFI 安全启动证书数据库层级结构与信任链 PK(平台密钥) 信任根 / 平台所有者 授权 KEK(密钥交换密钥) 操作系统 / 第三方授权 授权更新 授权更新 db(签名数据库) 白名单:受信任签名/哈希 dbx(禁止签名数据库) 黑名单:已吊销签名/哈希 Boot Loader / OS Loader / 内核镜像 验证通过则执行,否则拒绝启动 信任链方向:PK → KEK → db/dbx → 镜像。验证失败则终止启动流程。

3.4 数据库更新与签名验证机制

证书数据库的更新操作必须遵循严格的签名验证规则,以防止恶意篡改:

  • PK 更新:必须由当前 PK 私钥签名。若 PK 为空(设置模式),则无需签名即可写入。
  • KEK 更新:必须由当前 PK 私钥签名。KEK 本身不能自授权。
  • db / dbx 更新:必须由当前 KEK 私钥签名。操作系统通过此机制添加或吊销证书。
  • 镜像验证:固件计算镜像的 Authenticated Variable 格式签名,使用 db 中的公钥验证。若签名有效且哈希不在 dbx 中,则镜像通过验证。
安全警告:在生产环境中,PK 私钥必须离线存储于硬件安全模块(HSM)或物理保险柜中。一旦 PK 私钥泄露,攻击者可完全控制平台的信任数据库,绕过安全启动保护。

3.5 设置模式与用户模式

UEFI 安全启动有两种操作模式,决定了数据库的可写性:

模式 PK 状态 数据库可写性 典型场景
设置模式(Setup Mode) PK 为空 PK、KEK、db、dbx 均可无签名写入 OEM 出厂配置、首次部署
用户模式(User Mode) PK 已设置 所有更新必须经对应私钥签名 生产环境、日常运行
部署建议:在完成 PK 注册后,系统自动从设置模式切换到用户模式。建议在部署前完成所有数据库的初始化配置,避免后期在用户模式下频繁更新带来的签名管理复杂性。

3.6 信任链验证流程图

以下 SVG 流程图展示了从固件启动到内核加载的完整签名验证路径:

安全启动信任链验证流程图 1. UEFI 固件启动 2. 读取 Boot#### 变量 3. 验证镜像签名 失败 成功 4. 拒绝启动 / 错误提示 4. 授权执行镜像 5. 链式验证下一阶段

3.7 常见问题与排错思路

  • 启动失败,提示“Image not authorized”:镜像签名不在 db 中,或已被加入 dbx。检查镜像签名证书是否已注册到 db 或 MOK。
  • 无法更新 db/dbx:更新请求未使用正确的 KEK 私钥签名。确认签名工具链与 KEK 证书匹配。
  • PK 丢失或损坏:平台将无法退出设置模式,或无法进行任何授权更新。需通过物理访问清除安全启动状态(清除 CMOS 或进入固件设置重置)。
  • MOK 与 db 混淆:MOK 是 shim 维护的软件级数据库,独立于固件 db。自定义内核签名通常添加到 MOK,而非 db。
排错工具:在 Linux 下可使用 mokutil --list-enrolled 查看 MOK 列表,使用 sbverify --list <镜像> 查看镜像签名信息,使用 efi-readvar 查看固件变量中的 PK/KEK/db/dbx 内容。