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

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

安装时16.04,我被要求关闭“安全启动“如果我想安装第三方模块/驱动程序

我没有遵守。

当我手动安装我使用的唯一第三方驱动程序时(bcmwl-内核源代码),我再次被要求(在安装软件包期间)关闭“安全启动”。

使用bcmwl-内核源代码完全没问题安全启动15.10。对我来说这似乎与错误无关。

所以这看起来确实像是 Ubuntu 拒绝签署任何第三方驱动程序/模块,使其与“安全启动”配合使用(??)。或者似乎认为第三方模块不安全并破坏了“安全启动”,因此强制禁用它以使其清晰??我说得对吗?

答案1

这不是一个错误,而是一个功能。

正如 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 构建的软件包(应该有一个 perl 脚本/usr/src/kernels/$(uname -r)/scripts/sign-file),并且签名后,你可以将其加载到内核中

当然,有人应该对此做出更多的视觉说明,甚至可能制作一个向导或更好的 DKMS 标准以允许将密钥考虑在内,但这就是我们目前所拥有的。

您可以参考这个关于如何签署您自己的内核模块的说明:https://askubuntu.com/a/768310/12049

答案2

简而言之,这不是一个错误,而是 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

答案3

另一种方法是创建自己的密钥,将公共部分插入 MOK 数据库,并使用私有部分对你编译的模块进行签名。请参阅此处了解详细信息:升级到 Ubuntu 16.04 后无法加载“vboxdrv”(我想保留安全启动)

答案4

接受的答案非常完整,但我想添加这条简单的信息,取自这里:

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

基本上,安全启动可能会阻止您加载您安装的某些驱动程序,这可能会非常令人沮丧。我自己也经历过这种情况:驱动程序安装正确,一切似乎都很好,但就是不起作用。我花了一些时间才发现安全启动阻止操作系统加载它。

相关内容