![在 Ubuntu 中启用和配置安全启动不会带来额外的安全好处吗?](https://linux22.com/image/896348/%E5%9C%A8%20Ubuntu%20%E4%B8%AD%E5%90%AF%E7%94%A8%E5%92%8C%E9%85%8D%E7%BD%AE%E5%AE%89%E5%85%A8%E5%90%AF%E5%8A%A8%E4%B8%8D%E4%BC%9A%E5%B8%A6%E6%9D%A5%E9%A2%9D%E5%A4%96%E7%9A%84%E5%AE%89%E5%85%A8%E5%A5%BD%E5%A4%84%E5%90%97%EF%BC%9F.png)
以下文字来自英国国家网络安全中心真的?
虽然安全启动硬件可以验证启动链的第一步,但 Ubuntu 不会继续验证启动系统,因此启用和配置安全启动不会带来额外的安全好处。
答案1
确实如此。在 Windows 上,安全启动可以提供NCSC 指出的额外福利:
早期启动反恶意软件 (ELAM) 驱动程序为配置为使用安全启动的 ELAM 兼容系统上的已知坏驱动程序提供签名检查。
...
当有人试图破坏安全控制时,Windows 10 安全启动过程(在受支持且正确配置的硬件上)会向用户发出警报。用户知道如何识别和响应此警报非常重要。
据我所知,Ubuntu 上没有提供这两个功能。
答案2
确实如此,UEFI 上的安全启动仅检查已签名的启动固件(放置在用于运行启动加载程序的 FAT32 分区上的文件),但似乎也可以检查已签名的驱动程序,但我从未听说过 Ubuntu 中的驱动程序已签名,而 Microsoft 系统却这样做。文件系统的其余部分肯定没有签名。
编辑:我创立了Linux 签名软件包在 Ubuntu 存储库中,意味着驱动程序也已签名。
答案3
Ubuntu 的安全启动支持随着时间的推移而发生了变化,您提供的引用已经过时了。从广义上讲,验证可能在以下几个阶段发生:
- 验证引导加载程序-- 这是安全启动本身的极限。安全启动阻止 UEFI 启动未签名(或未正确签名)的二进制文件,基本上就是这样。在 EFI 下,引导加载程序是 EFI 二进制文件,因此如果它们未签名,安全启动会阻止它们启动。但是,引导加载程序旨在启动内核,而内核不是 EFI 二进制文件,因此如果引导加载程序设计为允许启动未签名的内核,安全启动本身无法阻止启动未签名的内核。(不过,在技术细节方面有一些注意事项和例外。)因此,在这个级别上,安全启动可以防止引导加载程序受到损害,但无法防止软件堆栈的后续部分受到损害。
- 内核验证-- 为了进一步提高安全性,应该验证内核。我听说(两三年前)原装 GRUB 根本不会验证内核。因此,如果您使用原装 GRUB,它会很乐意启动您输入的任何内核。Ubuntu 至少在 12.04 版之前都使用了以这种方式工作的 GRUB。需要签名内核的修改后的 GRUB 二进制文件可用,并被许多发行版使用。我不记得 Ubuntu 14.04 的 GRUB 是否需要签名内核。Ubuntu 16.04 的 GRUB 肯定需要签名内核,至少在其默认配置下。此外,至少从 12.04 版开始,Ubuntu 提供了使用安全启动密钥签名的内核,因此可以使用执行此验证的引导加载程序启动。因此,通过换出原装 GRUB,甚至可以将 Ubuntu 12.04 配置为需要签名内核。
- 内核模块验证-- Linux 内核可以加载内核模块,如果内核已签名但加载了受恶意软件感染的内核模块,则主内核的签名状态毫无意义。虽然我不能 100% 确定 Ubuntu 14.04 是否需要签名的内核,但我有理由相信 Ubuntu 14.04 不需要签名的内核模块。Ubuntu 16.04 已经改变了这一点。对于想要使用第三方专有驱动程序(例如 VirtualBox 驱动程序或 ATI/AMD 或 Nvidia 芯片的视频驱动程序)的用户来说,这一变化带来了不便。这些驱动程序模块未由 Canonical 签名,因此如果要保持安全启动处于启用状态,则需要添加机器所有者密钥 (MOK) 并自行签名模块。
- 用户空间二进制文件的验证-- 内核加载后,它会启动用户空间二进制文件,包括
bash
Web 浏览器和文字处理器等。原则上,内核可以要求对这些二进制文件进行签名。实际上,我不知道 Linux 是否支持这种签名要求。这种要求会非常繁重,特别是对于软件开发人员或任何想要运行第三方二进制文件的人来说。
除了这四个主要的(潜在)验证级别之外,还有几个曲折、中间级别、例外等。例如,内核可以包括一个EFI 存根加载器,这会将内核变成自己的引导加载程序,从而模糊步骤 1 和步骤 2 之间的界限。我还看到过内核拒绝启动,如果它们是从不进行安全启动验证的引导加载程序启动的,这会扭转步骤 #2 的要求。原则上,引导加载程序之外的验证可以使用除安全启动密钥之外的机制。实际上,在 Linux 世界中,安全启动密钥用于步骤 #3;但是,据我了解,内核提供了自己的代码来验证内核模块(步骤 #3),因此从技术上讲,UEFI 中的安全启动代码不涉及步骤 #2 之后的内容。(不过,我从未深入研究过这个问题,所以我可能误解了这个细节。)
另外,我在上面的描述中重点介绍了 LTS 版本。一些安全更改可能已在临时(非 LTS)版本中引入;我不记得具体细节了。
如上所述,Ubuntu 一直在提高其验证要求的级别。您提供的引用适用于 Ubuntu 12.04,也许也适用于 14.04,但不适用于 16.04——至少,在固件中启用安全启动的默认配置下不适用。(当然,您可以将 Ubuntu 的 GRUB 换成旧版本或另一个根本不进行安全启动验证的引导加载程序。)对于某些应用程序,更详细的信息(例如验证代码的代码审查)可能很重要。如果您在高度安全的环境中工作(例如银行、国防承包商、某些政府机构等),您绝对应该依靠自己雇主的安全部门、安全承包商等,而不是依靠网络论坛上随机陌生人的建议。