我一直在尝试了解安全启动是如何工作的,但对我来说仍然有一些不清楚的地方,这就是我写这篇文章的原因。
这是我目前的理解。
安全启动是在 UEFI 标准中定义的系统,它使用数字签名来防止恶意操作系统映像/引导加载程序启动。
安全启动使用 4 种不同类型的签名/证书:
- 平台密钥:检查 UEFI 固件是否可信
- 密钥交换密钥:验证密钥数据库的更新(但我不知道如何操作)
- 白名单和黑名单密钥数据库:包含可信和不可信的签名/证书
验证过程如下:
预引导加载程序(shim)通过计算其签名并使用数据库中的证书进行验证来验证引导加载程序;如果正确,则引导加载程序启动。
操作系统映像也一样,引导加载程序以相同的方式对其进行验证。如果检查通过,操作系统就可以启动。
到目前为止一切都正确吗?
现在,我尚不清楚的是:
- 证书/签名何时添加到数据库中?假设我想配置双启动系统,第二个操作系统的密钥何时声明?在安装时?如果是这样,我需要授权外部操作系统映像来修改数据库……它不太安全,不是吗?
- 如何更新数据库?如何使用密钥交换密钥 (KEK)?
答案1
密钥不是“声明”的,而是安装的(也称为“注册”)。二进制文件经过签名,因此可以通过密钥进行验证。密钥与授权机构相关联,而不是与二进制文件相关联。许多二进制文件可以由单个密钥签名,并且可以有密钥链。
通常情况下,二进制文件由 Microsoft 或 Canonical 等发行商签名。这几乎符合整个启动链的描述。
有时,当二进制文件在本地构建时(例如使用 DKMS 设备驱动程序),必须使用本地密钥对其进行签名。在这种情况下,安装驱动程序的一部分涉及注册本地密钥。这其中一半是在安装驱动程序时完成的(它可能会要求您输入密码),另一半是在下次机器重启时完成的(当它要求您重新输入该密码时)。
如果注册本地密钥的过程失败,驱动程序将不会加载。您可以通过手动注册密钥或重新运行配置然后dpkg-reconfigure drivername...
重新执行密码/注册过程来解决此问题。