Linux 中的 MOK 到底是做什么用的?

Ver*_*onB 15 linux nvidia linux-mint secure-boot

安装 Nvidia 驱动程序后,我被提升为设置 MOK 密码,否则第三方驱动程序可能无法正常工作,因此我创建了一个。重新启动后,我看到一个蓝色的 MOK 管理屏幕,其中有几个选项,第一个是继续启动。所以我选择了这个,当启动完成时,我的第二台显示器没有被识别。记得在最初提示 MOK 时阅读了有关安全启动的内容,我启动到 BIOS 并关闭了安全启动。现在我的第二个屏幕回来了。想到了几个问题。

  1. 首先,什么是MOK?
  2. 我是否需要它,如果不需要,我该如何摆脱它?
  3. 由于安装 Nvidia 驱动程序或设置 MOK,是否无法识别我的第二个屏幕?
  4. 我可以只关闭安全启动吗?

谢谢你的帮助!

Ned*_*d64 14

广告 1)

MOK(机器所有者密钥)旨在通过仅允许经批准的操作系统组件和驱动程序运行来保护启动过程。无论如何,MOK 必须由“BIOS”或计算机内部的某些启动代码实现。

主要思想是在加载操作系统 (OS) 时只允许运行经过签名的代码。一旦启动,操作系统就可以从 BIOS 接管保护系统的责任。

MOK 系统使用公钥加密,这意味着您可以创建一个密钥对,然后使用您的私有/秘密密钥对允许运行的所有组件进行签名。这包括 GRUB 引导加载程序本身。然后 BIOS 在运行代码之前使用您的公钥(您需要安装它)来检查签名。

这里有一些关于安全启动和 MOK 的文档

在我个人看来,MOK 的美妙之处在于您可以自己创建密钥并对您信任的组件进行签名。过去,EFI BIOS 只安装了 Microsoft 的公钥,他们对签署 Linux 引导加载程序犹豫不决:-) 这就是为什么您过去需要 SHIM(介于 EFI BIOS 和 GRUB 之间)。

所有安全启动方法都希望通过保证一个干净启动的系统不被恶意软件篡改来保护系统免受黑客和病毒的侵害。如果启动代码或驱动程序被篡改,则会被检测到,以便您可以采取相应的行动。如果攻击者可以物理访问您的计算机(“邪恶女仆攻击”),则没有很多选项可以保护您的机器 - 即使例如您的磁盘与所有重要数据都已加密,攻击者也可以修改启动代码以读取您的密码当您输入它时,然后传输或存储它以供他们以后阅读。安全启动适用于此类修改。

Kyle Rankin 在保护 Librem 系列笔记本电脑的启动过程方面做了很多工作,这里有一篇关于他工作的好文章。我相信它非常值得一读,即使它不能直接适用于您的系统 - 想法是一样的。

广告 2) 和 4)

您需要 MOK 和安全启动吗?如果您永远不会被黑客成功攻击,尤其是那些可能物理访问您的笔记本电脑或通过浏览器/办公室/Linux 漏洞从 Internet 获得 root 访问权限的黑客,则不会。至于禁用,您做对了 - 在 BIOS 中禁用安全启动。


tel*_*coM 9

广告 3)

当安全启动生效时,只有具有有效签名的内核模块才会被允许。由于 MOK 安装过程实际上并未完成,对 Nvidia 模块的签名检查失败,并且由于 Nvidia 模块安装过程可能已经将内核驱动程序列入黑名单nouveau,系统很可能会回退到未加速的efifb显示驱动程序,它仅支持固件已经设置的任何显示。

为了保护系统免受未经授权的 MOK 修改,MOK 安装过程将请求固件以只能在启动时访问的方式存储 MOK,而不能在任何操作系统实际运行时访问。因此,MOK 安装过程需要重新启动。

首先,在操作系统运行时创建 MOK 并准备安装,并创建一次性密码以保护安装过程的第二阶段。然后,系统重新启动,将shimx64.efi检测到 MOK 安装过程已启动,并在启动时显示蓝色的 MOK Manager 屏幕。此时,您应该选择“安装密钥”选项,并通过输入重新启动之前设置的一次性密码进行确认。该密码将不再需要:如果 MOK 安装成功,内核模块管理工具将能够在需要时自动使用 MOK,或者如果失败,则需要从头开始 MOK 安装过程。


最初,安全启动固件仅接受引导加载程序*.efi文件(必须使用 Windows 风格的 PE32/PE32+ 二进制格式,而不是 Linux 使用的 ELF 格式),这些文件要么通过加密哈希明确列入白名单,要么由安全启动证书之一签名固件 NVRAM。这shimx64.efi会将 Linux 发行版的签名证书和可选的 MOK 证书添加到允许的证书列表中(非持久性)。

这将允许shimx64.efi加载grubx64.efi引导加载程序和发行版内核,它们是使用该特定 Linux 发行版的安全引导签名密钥进行签名的。当为 UEFI 构建时,Linux 内核可以包含 UEFI 引导存根,这将使内核看起来像 PE32+ 二进制文件,因此内核也可以以安全引导兼容的方式进行签名。

安全启动规范要求内核必须保持在执行之前检查所有内核代码签名的要求,否则任何不兼容的内核可能会被未来符合安全启动的固件版本列入黑名单。因此,内核还将对其将加载的任何内核模块进行签名检查。为此,内核公理地信任其构建时所使用的签名密钥。发行版内核通常将安全启动接受的密钥添加到其白名单中(请参阅keyctl list %:.builtin_trusted_keyskeyctl list %:.secondary_trusted_keys在现代 Linux 或keyctl list %:.system_keyring旧版本中) - 如果设置了 MOK,则这将包括 MOK。