为什么在安装第三方模块时禁用“安全启动”是强制政策

在安装16.04时,如果我想安装第三方模块/驱动程序,就会被要求关闭“安全启动”。
我没有遵守这个要求。
当我手动安装我使用的唯一的第三方驱动程序(bcmwl-kernel-source)时,又被要求(在安装软件包时)关闭“安全启动”。
在15.10中,使用bcmwl-kernel-source与“安全启动”完全兼容。对我来说,这似乎与错误无关。
所以看起来Ubuntu不再签署第三方驱动程序/模块以使其正常工作(??)与“安全启动”。或者似乎认为第三方模块是不安全的,并破坏了“安全启动”,因此强制禁用它以明确说明?我理解得对吗?

6从英语翻译成中文:在我看来,这是因为人们(错误地)认为启用安全引导会破坏第三方模块,因此在给出建议时会禁用它。有关安全引导的技术信息在这里 - https://wiki.ubuntu.com/SecurityTeam/SecureBoot。就个人而言,我不同意那种似乎无处不在的关闭安全引导的建议,在我的硬件上启用安全引导可以正常运行。在没有问题的情况下,请保持启用安全引导,没有理由盲目禁用安全功能。 - Panther
8我还没有深入研究过这个问题,但据我了解,16.04版本在安全启动方面比15.10及之前的版本更加严格。具体来说,在15.10及之前的版本中,一旦Shim启动GRUB,GRUB就会启动任何Linux内核;安全启动保护在GRUB结束。我的理解是,16.04版本中,安全启动策略执行范围扩展到了内核,因此Ubuntu的GRUB将不再启动未签名的内核。如果超出此范围,那么未签名的内核模块也将受到影响,而以前则不会。不过,我还没有深入研究这个问题。 - Rod Smith
1一些好的背景信息:https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1401532 - dpb
1人们试图安装第三方模块来搞乱他们的系统,我不禁怀疑这个“功能”是否会带来更多的伤害而不是好处。 - Daniel
关掉之后还有办法重新启用吗? - shaunakde
@shaunakde 微软的 “禁用安全启动” 帮助页面 警告说,“在禁用安全启动并安装其他软件和硬件之后,重新激活安全启动可能会很困难,需要将 PC 恢复到出厂状态。” 但该页面还有一个“重新启用安全启动”的部分,其中列出了尝试的步骤。 - Rory O'Kane
4个回答

这不是一个错误,而是一个特性。
正如Anthony Wong所说,当您安装DKMS软件包时,您正在自己编译软件包,因此Canonical无法为您签署模块。
然而,您绝对可以使用安全启动,但这正是安全启动试图保护您免受自身伤害的用例,因为它无法知道您是否信任一个模块。
默认情况下,您的UEFI机器上有一个平台密钥(PK),它是加载代码到处理器中的最终可信任的证书颁发机构。
GRUB、shim或其他引导机制可以由一个被根CA(PK)信任的KEK进行数字签名,因此您的计算机可以在没有任何配置的情况下启动像Ubuntu Live USB/DVD这样的软件。
在Ubuntu 16.04上,内核使用CONFIG_MODULE_SIG_FORCE=1构建,这意味着内核将强制要求模块由一个受信任的密钥签名。
请注意,默认情况下,UEFI平台包含一个您无法控制的PK,因此您无法使用您自己的机器认可的密钥对二进制文件进行签名。
有些人对此进行抨击和抱怨,但实际上没有比你自己注册所需的新密钥更好的方式(从安全角度来看)。
如果你的引导系统使用shim,你可以使用一种称为机器所有者密钥数据库的东西,并将你的密钥注册为MOK(你可以使用mokutil完成此操作)。如果不是这样的话,你也可以将你的密钥注册到UEFI数据库中作为签名密钥。
在注册了你的密钥之后,你可以使用你的MOK对你的DKMS构建的软件包进行签名(在/usr/src/kernels/$(uname -r)/scripts/sign-file中应该有一个Perl脚本),并且在签名完成后,你可以将其加载到内核中。
诚然,有人应该提供更多可视化的说明,并且可能甚至制作一个向导或更好的DKMS标准,以便考虑到密钥。但目前我们只能按照现有的方法进行操作。
你可以参考这个解释来签名你自己的内核模块:https://askubuntu.com/a/768310/12049

1我把它禁用了,现在我收到一个烦人的“以不安全模式启动”的消息。有没有办法撤销这个操作?我似乎无法在这里的论坛上解释清楚这个问题。@ssice - 我使用的是UBUNTU 14.04,所以我认为这与我无关。 - shaunakde

简而言之,这不是一个错误,而是在16.04中引入的新变化。
因为您正在安装的是一个dkms软件包。DKMS模块是在您自己的计算机上编译的,因此Canonical无法为您签名该模块。如果Canonical无法签名,就无法进行数字验证。如果您打开了安全启动,这意味着您的模块无法使用,为了使用它,您将不得不关闭安全启动,这就是为什么会出现这个问题。
至于为什么只发生在16.04而不是之前的版本,Rod Smith给出了一个很好的答案。在Ubuntu 16.04中,Ubuntu开始对内核级别执行安全启动。在16.04之前,Ubuntu并没有真正强制您使用已签名的内核和已签名的内核模块,即使您打开了安全启动。但在16.04中不再如此。
这是相关的错误:https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1401532 这是相关的蓝图: https://blueprints.launchpad.net/ubuntu/+spec/foundations-x-installing-unsigned-secureboot

我仍然可以在16.04 beta2和更新后加载wl模块。但是现在在发布版中,我收到了一个错误消息:“modprobe: ERROR: could not insert 'wl': Required key not available”。 - solsTiCe
你能试着运行一下吗:sudo apt install mokutil; sudo mokutil --disable-validation - Anthony Wong


接受的答案非常完整,但我想补充一点简单的信息,来自这里:

https://askubuntu.com/a/843678/664391

基本上,安全启动可能会阻止您加载一些已安装的驱动程序,这可能非常令人沮丧。我自己也经历过这种情况:驱动程序安装正确,一切看起来都很顺利,但它就是无法工作。花了我一些时间才发现是“安全启动”阻止了操作系统加载它。