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

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

我不遵守。

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

使用bcmwl-kernel-source15.10中使用Secure Boot完全没问题。 这似乎与我的错误无关。

所以这看起来像Ubuntu拒绝签署第三方驱动程序/模块以使其工作(??)与“安全启动”。 或者似乎认为第三方模块不安全并打破“安全启动”因此强制禁用它以使其清楚? 我对吗 ?

这不是一个bug,它是一个function。

正如Anthony Wong所说,当您安装DKMS软件包时,您自己正在编译软件包,因此,Canonical无法为您签署该模块。

但是,您肯定可以使用安全启动,但这正是安全启动试图保护您自己的用例,因为它无法知道您是否信任某个模块。

默认情况下 ,UEFI计算机上有一个平台密钥(PK),它是用于在处理器中加载代码的最终可信证书颁发机构。

GRUB,或垫片或其他引导机制可以由根CA(PK)信任的KEK 进行数字签名 ,因此您的计算机可以在没有任何配置的情况下使用Ubuntu Live USB / DVD等引导软件。

在Ubuntu 16.04上,内核使用CONFIG_MODULE_SIG_FORCE = 1构建,这意味着内核将强制模块由平台中的可信密钥签名 。 考虑到默认情况下UEFI平台包含您无法控制的PK,因此您无法使用自己计算机识别的密钥对二进制文件进行签名。

有些人抨击和咆哮,但从安全的角度来看,确实没有比你自己注册你想要的新密钥更好的方法了。

如果您的启动系统使用垫片,您可以使用称为机器所有者密钥数据库的东西,并将您的密钥注册为 MOK(您可以使用mokutil执行此操作)。 如果不这样做,您还可以将密钥作为签名密钥注册到UEFI数据库中。

注册密钥后,您可以使用MOK在DKMS构建的软件包上签名/usr/src/kernels/$(uname -r)/scripts/sign-file应该有一个perl脚本), 之后是签名后,您可以将其加载到内核中

当然,有人应该对此做出更多的视觉指示,甚至可能制作一个向导或更好的DKMS标准来考虑密钥,但这就是我们现在所拥有的。

简而言之,这不是一个错误,而是16.04中引入的新变化。

因为你要安装的是一个dkms包。 DKMS模块在您自己的机器上编译,因此Canonical无法为您签署模块。 如果Canonical无法对其进行签名,则无法对其进行数字validation。 如果你打开了安全启动,那将意味着你的模块无法使用,并且为了使用它,你将不得不关闭安全启动,这就是你被问题问到的原因。

为什么它只发生在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

另一种方法是创建自己的密钥,将公共部分插入MOK数据库,并使用私有部分对您编译的模块进行签名。 在这里查看详细信息: 升级到Ubuntu 16.04后无法加载’vboxdrv’(我想保持安全启动)

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

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

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