我刚刚在 Arch 安装中设置了安全启动。与其他发行版不同,这不是开箱即用的。不过,在 sbctl 和 pacman hook 的帮助下,创建自己的密钥并设置自动签署每个内核更新的过程相对简单。
但是,我对这种方法有一个疑问:如果我必须将密钥保存在我的计算机上,并且我可以使用它们对任何可在用户空间调用的工具可用的凭据进行签名……这如何保护我的系统?
如果这些东西已经由 Arch 维护者签名,我会发现它更加方便和安全。然后我只需在 bios 设置中允许它(或者像其他发行版一样,微软签名的 shim 数据库,我不在乎)一次,就可以将他们的密钥添加到我的安全启动数据库中。但我发现没有办法这样做。为什么我在网上看到的所有设置方法都如此复杂,而这个解决方案看起来如此明显和直接?我是否遗漏了技术、意识形态或程序原因?
主要是因为他们目前没有合适的基础设施来存储和访问签名密钥。
与其他发行版不同,Arch 软件包目前不是在中央“构建场”上构建的 - 构建是手动完成的,要么在开发人员自己的机器上,要么通过 SSH 卸载到普通构建服务器上。然后使用开发人员自己的 PGP 密钥对软件包进行签名(并使用该签名交付,而不是重新签名)。
(.iso 映像以类似的方式构建 - 请注意它们是由某人的 PGP 密钥而不是通用的“Debian buildd”密钥签名的,并且当该人不可用时,有时整个过程会被延迟。)
到目前为止,这已经满足了软件包签名的需求,因为 pacman 有一个密钥撤销程序(可以删除开发人员密钥,同时保留相同的 CA),以及 PGP 固有的“M of N”信任模型。但是,将此模型 1:1 映射到安全启动签名(假设您只想要内部“Arch CA”签名)将不再允许自动证书撤销,因为唯一可以自动安装的“dbx”更新是 Microsoft 签名的更新(因为只有 Microsoft 在您的“KEK”列表中,并且无论如何都不能保证您的机器固件会让您注册自定义 KEK,而无需完全从 PK 进行自己的安全启动签名)。
它还不符合“完整”安全启动的要求(其他发行版就是这么做的),因为内核需要由单个密钥签名,而该密钥需要嵌入到 Microsoft 签名的“Shim”加载程序版本中。为了避免密钥泄露(以及 Shim 撤销/重建/重新签名)的风险,需要某种中央构建基础设施,该基础设施本身仍在构建过程中,理想情况下还需要某种安全密钥存储(TPM 或智能卡或 Nitrokey 或类似的 HSM)来防止密钥被提取,这需要与托管公司达成协议(Arch 没有自己的数据中心)。
例如,这与 Ubuntu 中的情况相同,它也要求您在机器上存储一个密钥 - MOK(机器所有者密钥) - 该密钥可用于签署任何内核模块,包括合法的(DKMS 包)和非法的。
(据我记得,它还附带一个 EFI 程序,允许具有物理访问权限的人注册他们想要的任何 MOK,尽管大多数固件都允许安全启动。)
首先,安全启动本身并不能为您的系统提供太多保护(如果有的话)——尤其是考虑到它甚至不验证 initrd 映像(除非使用本地“UKI”签名过程)。90% 的实用性来自与系统磁盘加密结合使用(这也意味着您的签名密钥也将被加密)。
事实上,对于大多数 Linux 发行版来说,安全链直接停止在内核及其模块处,并且无法防止甚至最关键的用户空间文件被外部篡改——只有磁盘被加密这一事实才能基本防止这种情况发生。
为了发挥最大作用,安全启动需要与测量启动相结合——例如,使用 TPM 密封磁盘加密密钥并将其绑定到特定系统状态。这就是 BitLocker 所做的;它的自动解锁不需要“安全启动通过”,它需要“安全启动表明 Windows 内核由该 MS 证书专门签名”,即它成为整体系统状态证明的一个组成部分。
(DRM 和反作弊系统也使用没有磁盘加密的 SB TPM 测量。)
TLS 和 SSH 的工作方式有一些相似之处:首先以未经身份验证的方式(DH)交换加密密钥,然后才使用服务器的私钥来绑定证书和前一个过程的记录;这意味着 DH 是协议的关键部分,但它本身几乎没有用处。