当前位置: 首页>>技术教程>>正文


为什么在安装第三方模块时禁用“Secure Boot”是强制策略

, , , ,

问题描述

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

我不遵守。

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

使用bcmwl-kernel-source在15.10中使用安全启动非常好。这似乎与我的错误无关。

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

最佳解决办法

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

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

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

次佳解决办法

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

第三种解决办法

另一种方法是创建自己的密钥,将公共部分插入MOK数据库,并使用私有部分对您编译的模块进行签名。在这里查看详细信息:Could not load ‘vboxdrv’ after upgrade to Ubuntu 16.04 (and I want to keep secure boot)

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1926.html,未经允许,请勿转载。