Linux 中的 MOK 到底有什么用?

Linux 中的 MOK 到底有什么用?

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

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

谢谢你的帮助!

答案1

广告 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 错误从互联网获得 root 访问权限的黑客,则不会。至于禁用,您已经做了正确的事情 - 在 BIOS 中禁用安全启动。

答案2

广告 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+ 二进制文件,因此内核也可以以安全引导兼容的方式进行签名。

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

相关内容