1 个不稳定版本
0.0.1 | 2023 年 7 月 28 日 |
---|
#23 在 #osdev
36KB
693 行
Lanzaboote: NixOS 的安全启动
此存储库包含 NixOS 上 UEFI 安全启动的工具。目标是使任何支持 UEFI 的平台都可以通过 nixpkgs 使用 UEFI 安全启动。
⚡ 快速入门 ⚡
如果您想尝试此功能,请访问 此处 以获取说明。如有任何问题,请参阅 故障排除文档。
🪛 参与进来 🪛
在将此工作上传到 nixpkgs 之前,还有大量工作要做。如果您想承担某项任务,请在 Matrix 房间 中协调或在 问题 中检查。
概述
安全启动
UEFI 安全启动的目标是只允许受信任的操作系统在系统上启动。这可以用来防御某些攻击,这些攻击会破坏系统的启动流程。例如,当安全启动处于活动状态时,攻击者将难以替换启动系统时使用的 Linux 内核。
UEFI 安全启动通过数字签名所有驱动程序、引导加载程序、Linux 内核及其 initrd 来工作。这建立了一个信任链,其中只有一个受信任的组件在链的完整性通过密码学验证后才将控制权传递给启动流程的下一个部分。
注意事项
要使 UEFI 安全启动有效,还需要执行一些额外的步骤
- 必须有一个 BIOS 密码或类似限制,以防止对安全启动策略进行未经授权的更改。
- 启动的系统必须有一种形式的完整性保护。
- 固件必须保持最新。
这些步骤在此处不涉及。
lzbt-*
,Lanzaboote 工具
目前,NixOS 上的引导加载程序、内核和 initrd 在当前系统上签名。然后需要将它们准备为 统一内核映像 (UKI) 并放置在 EFI 系统分区 (ESP) 上。
lzbt
是一个 Linux 命令行应用程序,负责处理此流程。它接受一个 NixOS bootspec 文档,对相关文件进行签名,使用存根创建 UKI(见下文),并将 UKI 以及其他所需文件安装到 ESP。 lzbt
还了解多个 NixOS 世代,并将为所有应可引导的配置进行签名。
我们对 lzbt
有多个后端。
lzbt-systemd
位于rust /tool /systemd
将来,lzbt
可能会支持更多的后端。
共享代码位于 rust /tool /shared
。
存根
当 Linux 内核和 initrd 被打包到 UKI 中时,需要一个 UEFI 应用程序存根。这个角色通常由 systemd-stub
来填补。
systemd-stub
的缺点是它需要将内核和 initrd 打包到 UKI 中,这使得它相当大。由于我们需要为每个 NixOS 配置一个 UKI,拥有许多配置的系统很快就会耗尽 ESP 中有限的磁盘空间。
Lanzaboote 存根是一个 UEFI 存根,它解决了与 systemd-stub
相同的问题,但允许内核和 initrd 分别存储在 ESP 中。通过验证 Linux 内核上的签名并将 initrd 的加密哈希嵌入到签名的 UKI 中来维护信任链。
存根有“瘦”和“胖”两种变体。上面描述的“瘦”变体是为 NixOS 定制的。而“胖”变体旨在与 systemd-stub
完全一样——实际上,它最终应该取代它。“瘦”变体是默认的,您可以从存根目录使用 cargo build
来构建它。“胖”变体需要在构建时启用,使用 cargo build --no-default-features --features fat
。
存根位于 rust /uefi /stub
。
Fwupd
当 Lanzaboote 和 services.fwupd
都启用时,对于 fwupd.service
将添加一个 preStart
,确保一个签名的 fwupd 二进制文件放置在 /run
,fwupd 将使用它。
向 Nixpkgs 上游的贡献状态
SecureBoot 可通过将此项目添加到您的配置中来实现。
它依赖于默认启用的 bootspec,自 NixOS 23.05 以来已启用。
我们目前正在努力使 Lanzaboote 在上游 Nixpkgs 中即插即用。
资金
此项目 通过 NGI Assure 基金获得资金,该基金由 NLnet 建立,并获得欧盟委员会 Next Generation Internet 计划的资金支持,在 DG Communications Networks、Content and Technology 下,根据协议 No 957073。 申请仍然开放,您现在可以 申请。
如果您想通过额外资金支持该项目,以便添加更多架构、PKCS#11 工作流程或集成支持,请联系维护者之一。
依赖项
~3MB
~60K SLoC