vmlinuz *-generic 和 *-generic.efi.signed 之间的区别

vmlinuz *-generic 和 *-generic.efi.signed 之间的区别

在 中/boot,有两个vmlinuz内核文件:

vmlinuz-4.8.0-37-generic
vmlinuz-4.8.0-37-generic.efi.signed

这两个内核文件有什么区别?谁对第二个文件进行签名(如果它确实经过签名,顾名思义),我的 UEFI/BIOS 又如何知道应该信任它并使用*-generic.efi.signed而不是*-generic

答案1

文件名以 结尾的内核.efi.signed由 Canonical 签名,用于安全启动。不过,大多数计算机的固件都不信任 Canonical 的签名;只有在 Shim 程序(shimx64.efi计算机上的二进制文件)的帮助下,它才能ESP) 表示已签名的内核是值得信赖的。

详细来说,启用安全启动的 Ubuntu 签名组件的加载路径如下所示:

EFI -> Shim -> GRUB 2 -> Kernel -> Kernel modules
  • EFI 信任 Shim,因为它已由 Microsoft 签名,并且其密钥嵌入在固件中。
  • Shim 修补了 EFI 的安全启动子系统,并包含 Canonical 的公钥。Shim 信任 GRUB 2,因为它已使用 Canonical 的私钥签名。
  • GRUB 2 调用 EFI 的安全启动系统(现在已由 Shim 修补)来验证内核,该内核也使用 Canonical 的私钥进行签名。
  • 内核验证内核模块是否由 Canonical 的私钥或安全启动链中的其他密钥签名。

如果我没记错的话,Ubuntu 15.10 之前,Ubuntu 的 GRUB 2 没有在内核上强制执行安全启动策略,内核也没有在内核模块上强制执行安全启动策略。不过,最近这项规定已经收紧。据我所知,目前没有计划要求对普通系统二进制文件进行签名。

我不知道为什么 Ubuntu 中有一个未签名的内核文件。即使在不支持安全启动的系统(包括纯 BIOS 计算机)上,签名文件也能正常工作。因此,据我所知,未签名的文件是相当多余的。

请注意,从 Shim 开始的每个组件都可以以未签名的形式获得,或者它们的签名被剥离。如果您自己构建 Shim,您可以用自己的公钥或您喜欢的任何其他公钥替换 Canonical 的公钥。(大多数主要发行版都有自己的 Shim 二进制文件,其中嵌入了自己的密钥。)从源代码构建 Shim 是没有意义的,除非您让 Microsoft 对其进行签名,这将花费 100 美元并需要很多省去很多精力。如果您需要自己签名,那么将密钥添加为机器所有者密钥 (MOK) 比重建 Shim 并让 Microsoft 对其进行签名要容易得多。您还可以调整 EFI 直接支持的密钥集,这样就可以省去对 Shim 的需求。因此,您可以对所有这些部分的组合方式进行很多更改。请参阅我的安全启动主页我的页面关于完全控制安全启动有关如何管理安全启动的更多详细信息。

答案2

签名版本用于 UEFI 安全启动。它使用非对称加密进行签名。这意味着解密它的密钥与用于加密它的密钥不同。BIOS 只有一个公钥,可以验证签名是否正确(未被篡改)。创建此类签名的私钥是秘密的,因此您无法自己创建它。这就是 BIOS 信任它并允许它启动的原因。

更多信息: https://wiki.ubuntu.com/SecurityTeam/SecureBoot

相关内容