根据https://wiki.ubuntu.com/UEFI/SecureBoot Initrd 映像未经过验证。这些信息是最新的吗?这将使整个安全启动完全无用,因为攻击者可以很容易地用记录 LUKS 密码并将其发送给他的 initramfs 替换 initramfs...这反过来会使所有模块签名麻烦并在安全启动上禁用休眠完全荒谬。
如果确实如此,是否有任何启动板错误/功能请求我们可以投票以使安全启动真正安全?
OTOH,如果此声明已过时,验证如何进行?在新内核安装过程中生成 initrd 文件时,用于签名 initrd 文件的密钥对在哪里?哪个组件稍后验证签名?(shim、MOK、GRUB、内核本身?)...或者也许以某种方式使用 PCR 和 TPM?
...内核命令行怎么样?这也必须经过签名/验证才能确保启动安全......
小智 7
根据我目前对Ubuntu 20.04的了解:
有2种基本情况:
/boot分区(仅限 LUKS1,Ubuntu 20.04 中不支持 LUKS2。较新的 Grub 将支持 LUKS2,但有一些限制(https://git.savannah.gnu.org/cgit/grub.git/tree/docs/grub .texi#n4554 )) 或有一个带有/和/boot(LUKS1) 的系统分区initrd从中
读取内核/boot这样,通过使用磁盘加密来隐式保护完整的系统完整性//boot,所以你有 2 个选择initrd和内核并强制检查它们:
initrd)grub.cfg,使用自定义密钥进行签名并将此密钥添加到 EFI 密钥存储中grub.cfg、 内核和initrd( https://ruderich.org/simon/notes /secure-boot-with-grub-and-signed-linux-and-initrd)initrd更新时生成签名甚至 EFI 二进制文件(最好通过initramfs-tools钩子自动生成)initrd原样/boot,让任何攻击者修改它,但您将根文件系统绑定到适当的 TPM 寄存器,有效地阻止访问(如果rootfs有人更改了内核参数)、任何使用的文件(内核二进制文件、、initrd)grub.cfg...initrd/kernel 更改后,您必须重新启动,手动解锁磁盘并将 LUKS 上的 TPM 绑定密钥插槽重新绑定到新的 PCR 寄存器值,并确保在此重新启动期间没有人更改任何内容/boot。理想的解决方案是,如果可以计算未来的 TPM 值,并且因此不必保持 luks TPM 绑定。正在解决此问题的项目: https ://github.com/grawity/tpm_futurepcr一些进一步的分类参考:
更新:2022-11-07:添加了一些有关 grub2 限制的来源和详细信息
您甚至不需要签署/验证initramfs,因为您不需要保持它可访问(在本地磁盘上未加密)。
Ubuntu20.04完全能够处理 initrd 文件包含在加密容器内的安装布局(目前适用于AMD64 和 ARM64 上的luks1 、 luks2以及未来版本中的更多平台)。除了降级到具有相同内核的最早版本之外,除了您之外没有人可以修改用您的密码密封的 initrd。
当前自动化中真正缺少的部分是生成用于验证其自身配置的签名 grub 二进制文件。它也可以开箱即用 - grub可以验证 gpg 风格的签名 - 但Canonical提供的内核安装脚本不会以通常的全自动方式进行设置/更新。
如果您想在当前的 Ubuntu 版本中配置经过完全验证的引导链,您可以尝试将您自己的脚本(这是您的配置,然后使用then将该二进制文件gpg --sign集成到 grub 二进制文件中,然后再将其放入)中每当您安装/删除内核(版本)时它都会自动调用。grub-mkstandalonesbsign/boot/efi/etc/kernel/postinst.d/
请注意,几乎没有消费者 PC 实际上用于注册安全启动的自定义密钥 ( MOK ),因此您可能会遇到一些固件错误。您也不会找到太多关于此主题的错误报告,仅仅是因为很少有人想要/做如此复杂且容易出错的事情。
这只是 Ubuntu 方面的事情。在安全方面您可能一无所获(但欢迎您在那里做出贡献)。
您可能需要首先定义威胁模型:您要防范什么?
安全启动应该防止 root 用户破坏以内核级权限运行的代码的完整性。这在启动时最为明显:即使是 root 也不应该能够安装不可信的内核或引导加载程序,并且我们使用签名来确定可信度。然而,它也扩展到正在运行的内核:Ubuntu 内核将检测安全启动并在启动早期进入锁定完整性模式。完整性模式尝试在运行时维护根和内核之间的安全边界。(这会阻止您执行类似kexec从受信任内核到不受信任内核的操作。)
安全启动任务中从未包含过的内容是防止 root 替换非内核二进制文件。这是一个相当困难的问题,脚本语言使它变得更加困难。在自由和开源软件世界中,情况更加令人担忧,因为人们对他们认为限制软件自由的任何事物都感到非常愤怒,即使可以禁用它。(例如,看看苹果公司对几乎所有内容进行签名的做法!)
肯定有一些方法可以限制 root 用户安装恶意二进制文件。您可以使用 grub 的分离签名支持来要求 initrd 进行签名。但是,所有事情,甚至是grub.cfg,都必须签署,这对于管理来说真的很烦人。你可以使用类似的东西dm-verity。IMA 可以帮助你(但对于脚本来说没有那么多)。但你很快就会不再拥有通用系统!