2. 安全启动基础

UEFI 安全启动(UEFI Secure Boot)是平台固件在操作系统加载之前建立的一道密码学验证关卡。它的核心目标不是“加密磁盘”,而是确保从固件到引导加载程序、再到内核模块的每一段可执行代码都经过授权签名,从而阻断 bootkit、恶意引导程序以及未授权内核驱动的加载。理解安全启动,必须同时理解它的信任链结构、四类关键密钥数据库,以及“签名”与“撤销”这对相反操作如何共同决定一段代码能否运行。

一、信任链:从不可变根到可执行代码

安全启动的信任不是凭空产生的,而是从平台固件中一段不可修改的根开始逐级传递。平台密钥(Platform Key,PK)位于信任链顶端,它代表平台所有者对固件的控制权。PK 通常用于签名密钥交换密钥(Key Exchange Key,KEK),KEK 再用于更新签名数据库(db)和撤销数据库(dbx)。真正参与镜像验证的是 db 中的证书或哈希,而 dbx 则记录被明确禁止的证书、哈希或镜像。

信任链的传递过程可以概括为:固件验证引导加载程序,引导加载程序验证内核与 initramfs,内核再通过模块签名验证可加载模块。每一级都使用上一级信任的密钥来验证下一级对象的签名。只要其中任何一级验证失败,启动就会中止或进入受限状态。这个链条的强度取决于最弱一环,因此 PK、KEK、db、dbx 的配置必须整体考虑,而不能只关注某一个数据库。

UEFI 安全启动:信任链与密钥数据库 PK 平台密钥 平台所有者控制权 KEK 密钥交换密钥 授权更新 db / dbx db 签名数据库 允许的证书/哈希 dbx 撤销数据库 禁止的证书/哈希 签名 更新 排除 信任链验证路径 固件 ROM 不可变信任根 引导加载程序 由 db 验证 内核与 initramfs 由引导程序验证 内核模块 模块签名验证 验证通过条件 1. 镜像签名证书存在于 db 中 2. 镜像哈希或证书未出现在 dbx 中 3. 签名链可回溯到受信任的 PK/KEK 4. 固件处于 Setup Mode 或 User Mode 正确状态 验证失败与撤销 • 签名不在 db 中:拒绝加载 • 证书或哈希在 dbx 中:立即撤销 • PK 未注册:处于 Setup Mode,安全性降低 • 密钥泄露:必须更新 KEK 并写入 dbx

二、四类密钥数据库的职责与关系

安全启动的密钥管理围绕四个数据库展开,它们各自承担不同职责,且存在明确的授权关系。PK 是平台密钥,通常只有一把或一组,用于签名 KEK 更新。KEK 是密钥交换密钥,可以由多个证书组成,用于授权 db 和 dbx 的更新。db 是签名数据库,包含允许加载的证书、公钥或镜像哈希。dbx 是撤销数据库,包含被禁止的证书、公钥或镜像哈希。四者关系可以概括为:PK 管 KEK,KEK 管 db 和 dbx,db 决定“谁能进”,dbx 决定“谁不能进”。

数据库 全称 作用 典型更新者 更新影响
PK Platform Key 平台所有者控制权,签名 KEK OEM 或平台所有者 更换 PK 会重置信任根
KEK Key Exchange Key 授权更新 db 与 dbx 平台所有者、OS 厂商 影响后续密钥更新权限
db Signature Database 允许加载的证书、公钥、哈希 OS 厂商、企业管理员 新增可引导镜像或驱动
dbx Forbidden Signature Database 禁止加载的证书、公钥、哈希 OS 厂商、安全响应团队 撤销泄露或恶意签名

三、密钥轮换与撤销的工程流程

在真实工程中,密钥轮换与撤销不是简单替换文件,而是一套需要审计、验证和回滚准备的流程。以企业环境为例,当某个用于签名内核模块的密钥疑似泄露时,管理员需要先确认该密钥对应的证书是否在 db 中,然后将其证书或哈希写入 dbx,最后再生成新密钥并加入 db。整个过程必须保证已有合法系统仍能启动,否则会导致大面积无法引导。

# 查看当前安全启动状态与数据库
mokutil --sb-state
efi-readvar -v PK
efi-readvar -v KEK
efi-readvar -v db
efi-readvar -v dbx

# 将撤销证书写入 dbx(示意)
efi-updatevar -e -f revoked.crt dbx

# 将新签名证书加入 db(示意)
efi-updatevar -e -f new_signing.crt db

# 验证更新结果
efi-readvar -v dbx | grep -i "revoked"
efi-readvar -v db | grep -i "new_signing"

上述命令中,efi-readvar 用于读取变量,efi-updatevar 用于更新变量。实际生产环境通常通过固件管理界面、厂商工具或自动化配置管理平台完成,而不是手工逐条执行。无论采用哪种方式,都必须遵循“先撤销、后新增、再验证”的顺序,避免出现旧密钥仍被信任而新密钥尚未生效的窗口期。

四、典型场景与常见误区

场景一:操作系统厂商发布内核更新,但旧内核签名证书被泄露。此时厂商会发布 dbx 更新,将泄露证书加入撤销列表,同时发布新证书到 db。企业终端在下次启动时,固件会拒绝加载使用泄露证书签名的旧内核,从而阻断潜在攻击。

场景二:企业自签名内核模块。管理员将企业 CA 证书加入 db 后,所有由该 CA 签发的模块都能加载。但如果 CA 私钥泄露,必须立即将 CA 证书写入 dbx,并重新签发所有模块。此时若只更新 db 而不更新 dbx,旧证书仍然有效,撤销就没有意义。

常见误区:把 db 当成“白名单”就以为足够安全。实际上,如果 dbx 没有及时更新,已泄露的证书仍然可以签名恶意代码并通过验证。另一个误区是认为 PK 可以随意更换。更换 PK 会改变信任根,可能导致原有 KEK、db、dbx 全部失效,必须重新配置整个信任链。

工程建议:在生产环境中,建议将 PK 离线保存,KEK 由平台所有者和 OS 厂商共同管理,db 和 dbx 的更新走变更审批流程。每次更新前备份当前变量,更新后使用 efi-readvar 和启动测试验证。对于大规模终端,应先在少量设备上灰度验证,再逐步推广。

安全启动的信任链、PK、KEK、db 与 dbx 共同构成一个动态的授权与撤销体系。理解它们之间的签名关系和更新顺序,是后续进行密钥轮换、撤销响应和故障排查的基础。只有把“谁信任谁、谁撤销谁”梳理清楚,才能在安全与可用性之间取得平衡。