TAKT 之外
zbm-openwrt-clevis
基于 OpenWrt 的启动运行环境,打包为单个 UKI:用 clevis 和 TPM 解锁采用原生加密的 ZFS 根文件系统,然后通过借用的 ZFSBootMenu 运行环境启动目标 Linux 系统。
- OpenWrt
- ZFS
- TPM 2.0
- Clevis
- 状态
- 已发布标签版本 0.90–0.95。启动链已在使用 OVMF 和 swtpm 的 QEMU 实验环境中验证,可从加密的 ZFS 启动 Ubuntu。
- 许可证
- 未声明:仓库中没有许可证文件。
- 平台
- 配备 TPM 2.0 和 rEFInd 的 x86-64 UEFI 机器;UKI 内为 OpenWrt 25.12。
解决什么问题
ZFSBootMenu 能很好地启动加密的 ZFS,但它需要有人输入密钥。对于远程服务器或无人值守的机器,这还不够:操作员无法判断这个输入提示是否来自他此前信任的启动环境。在本项目中,只有当 TPM 度量值与操作员在上一次重新封装(reseal)时批准的状态一致时,密钥才会被自动释放。否则自动启动会停止,操作员会收到通知,一个受密码保护的 OpenWrt 系统会等待人工决定。
主要功能
- 通过
clevis将自动解锁绑定到 TPM PCR;经过验证的策略clevis.pcr_ids=1,4,5,7,9也覆盖 rEFInd 传入的内核命令行。 - 回退到完整的 OpenWrt 系统,需用密码或 SSH 密钥登录,而不是无密码的 shell;基础镜像中的
root账户处于锁定状态。 - 可通过控制台或 SSH 手动解锁,并为新的度量状态重新封装;也支持经 Wi-Fi 或双 WAN 上行链路进行。
- 已封装的 JWE 有三种存储后端:ZFS 属性、EFI 变量,或 VFAT 分区上的文件。
- 更新目标系统的内核和 initramfs 无需再次手动解锁:它们位于加密池内部,不属于被度量的运行环境。
- 自动解锁失败时可选发送 Telegram 消息;镜像中带有磁盘和网络修复工具。
工作原理
rEFInd 加载一个 OpenWrt UKI,并通过内核命令行向其传递策略。启动时 zbm-auto-boot 运行 zbm-start;load-key 钩子请求 clevis 恢复密钥,并将其交给借用的 ZFSBootMenu 运行环境,后者从加密的根文件系统读取目标内核和 initramfs,并用 kexec 启动它们。自动和手动入口走同一条路径,并共用一把锁。存储池以只读方式导入,只有在重新封装将结果写入 ZFS 属性时才会短暂写入。
UEFI → rEFInd → OpenWrt UKI → zbm-auto-boot → zbm-start
→ load-key hook / clevis → ZFSBootMenu → kexec → Ubuntu (ZFS)
要求
- 目标系统的根文件系统为采用原生加密的 ZFS,密钥位置为文件(
keylocation=file://…)。 - UEFI、作为启动管理器的 rEFInd,以及 TPM 2.0;策略写在 rEFInd 的 options 行中。
- 构建主机:仓库中的 OpenWrt ImageBuilder 构建流程、
ukify、refind以及常用构建工具。 - 实验环境:
qemu-system-x86_64、OVMF 和swtpm;经过验证的目标系统是加密 ZFS 上的 Ubuntu。
本页概述了截至 2026 年 10 月该仓库的 README 和文档内容。以仓库本身为准。