3、UEFI安全启动:UEFI BIOS设置、Secure Boot原理、密钥数据库管理
这一章咱们聊聊UEFI安全启动。说实话,这是整个安全启动流程里最容易被忽视、但一旦出问题就让人抓狂的环节。我见过不少团队,系统镜像做得漂漂亮亮,结果到现场一开机就蓝屏,最后发现是Secure Boot没配好。
嗯,咱们从最基础的开始说。
3.1 UEFI BIOS设置:你得先找到门
不同厂商的BIOS界面长得完全不一样。但核心设置项就那么几个,我列个清单给你参考:
| 设置项 | 常见位置 | 推荐值 |
|---|---|---|
| Secure Boot | Security → Secure Boot | Enabled |
| Boot Mode | Boot → Boot Mode Select | UEFI(不要选Legacy) |
| CSM(Compatibility Support Module) | Boot → CSM | Disabled |
| Platform Key(PK) | Secure Boot → Key Management | 已安装/已注册 |
| Secure Boot Mode | Secure Boot → Mode | Custom(部署时)/ Standard(生产时) |
3.2 Secure Boot原理:说白了就是信任链
Secure Boot的核心思想其实很简单——从硬件到操作系统,每一级都要验证下一级的签名。你想想看,如果连启动加载器都能被随便替换,那系统再安全也没用。
整个流程是这样的:
- CPU上电 → 执行UEFI固件(固化在主板ROM里)
- UEFI固件 → 验证Boot Loader的签名(比如shim.efi或grubx64.efi)
- Boot Loader → 验证操作系统内核的签名(vmlinuz)
- 内核 → 验证内核模块和驱动的签名
每一级都只信任上一级签过名的东西。这个链条一旦断了,系统就直接拒绝启动。
3.3 密钥数据库:PK、KEK、db、dbx
这部分是Secure Boot的核心,也是很多人搞混的地方。我画了一张图,帮你理清它们之间的关系:
这张图你看明白了吗?我解释一下每个角色的职责:
3.3.1 PK(Platform Key)—— 老大中的老大
PK是整个Secure Boot体系的根信任。它由硬件厂商(或者你,如果你在自定义部署)持有私钥。只有用PK签过名的KEK才能被系统接受。说白了,PK就是「钥匙的钥匙」。
3.3.2 KEK(Key Exchange Key)—— 管家
KEK的作用是管理db和dbx的更新。操作系统厂商(比如Microsoft)会持有KEK,用来签名新的db条目或吊销旧的dbx条目。你想想看,如果没有KEK这个中间层,每次更新驱动都得找硬件厂商签PK,那得多麻烦。
3.3.3 db(Allowed Signature Database)—— 白名单
db里存的是允许启动的签名。可以是具体的文件哈希,也可以是CA证书。比如Microsoft的Windows Boot Loader的签名就在db里。我自己做嵌入式Linux部署时,会把自签的证书加进db。
3.3.4 dbx(Forbidden Signature Database)—— 黑名单
dbx正好相反,它存的是被吊销的签名。比如某个版本的Boot Loader发现了安全漏洞,厂商就会把它的签名加入dbx,这样即使有人拿着旧版本想启动,系统也会拒绝。
3.4 实际操作:如何管理这些密钥
理论说完了,咱们看看实际操作。以下是在Linux环境下管理Secure Boot密钥的常用命令:
3.4.1 查看当前密钥状态
# 查看Secure Boot状态
mokutil --sb-state
# 查看当前PK
efi-readvar -v PK
# 查看当前KEK
efi-readvar -v KEK
# 查看当前db
efi-readvar -v db
# 查看当前dbx
efi-readvar -v dbx
3.4.2 生成并注册自定义密钥
# 生成PK私钥和证书
openssl req -new -x509 -newkey rsa:2048 -keyout PK.key \
-out PK.crt -days 3650 -subj "/CN=My Platform Key/"
# 生成KEK私钥和证书
openssl req -new -x509 -newkey rsa:2048 -keyout KEK.key \
-out KEK.crt -days 3650 -subj "/CN=My KEK/"
# 生成db证书
openssl req -new -x509 -newkey rsa:2048 -keyout db.key \
-out db.crt -days 3650 -subj "/CN=My db Certificate/"
# 将证书注册到UEFI固件
# 注意:这需要在BIOS设置中切换到Custom模式
sudo efi-updatevar -f PK.auth PK
sudo efi-updatevar -f KEK.auth KEK
sudo efi-updatevar -f db.auth db
3.5 常见问题与排查思路
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 开机显示「Secure Boot Violation」 | Boot Loader签名不在db中 | 进入BIOS → 查看db列表 → 确认签名是否注册 |
| 系统启动后Secure Boot状态为「未启用」 | CSM未关闭或PK未注册 | 检查BIOS设置 → 关闭CSM → 注册PK |
| 更新dbx后无法启动 | 误吊销了当前Boot Loader签名 | 恢复BIOS默认设置 → 重新注册密钥 |
| 自定义内核无法启动 | 内核签名未被db信任 | 将内核签名证书加入db → 或使用shim签名 |
嗯,关于UEFI安全启动的核心内容就这些。密钥管理这块,说白了就是「信任链」三个字——谁信任谁,谁签谁,谁吊销谁。把这个逻辑理清了,剩下的就是操作细节了。