检查安全启动状态 #
在启动操作系统前,可以进入固件设置进行查看,请注意不要随意更改任何设置。您需要导航到正确的位置。您感兴趣的设置可能被简单地标记为安全启动,您可以将其设置为开启或关闭。
在启动操作系统后,可以使用 systemd-boot 检查安全启动状态:
$ bootctl
实现安全启动 #
安全启动的理想设置需要满足一些条件,否则即使实现了安全启动,不满足理想条件的安全启动可能会削弱安全启动的安全模型。
GRUB #
使用GRUB引导加载程序需要在启用安全启动之前执行额外的步骤,我们使用CA密钥进行安全启动:
# grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB --modules="tpm" --disable-shim-lock
esp 替换为自己的 EFI 分区
# grub-mkconfig -o /boot/grub/grub.cfg
注意:每次重新配置GRUB后不要忘记签名!
备份当前变量 #
安装efitools,然后运行以下命令来备份所有四个主要安全启动变量:
$ for var in PK KEK db dbx ; do efi-readvar -v $var -o old_${var}.esl ; done
如果您在新计算机或主板上执行此命令,则提取的变量很可能是 Microsoft 提供的变量。
将固件设置为 setup mode #
移除平台密钥后,安全启动将处于设置模式。要将固件置于设置模式,请进入固件设置实用程序,并找到删除或清除证书的选项。
使用 sbctl 进行辅助处理 #
注意: sbctl 并非适用于所有硬件。其工作效果取决于硬件制造商。
请安装sbctl。
创建和注册密钥 #
将固件设置为 setup mode 后,重新登陆,检查安全启动状态:
$ sbctl status
您应该看到 sbctl 未安装并且安全启动已被禁用。
然后创建您的自定义安全启动密钥:
# sbctl create-keys --pk-keytype tpm --kek-keytype tpm
SUPPORTED KEY TYPES: https://man.archlinux.org/man/sbctl.8#SUPPORTED_KEY_TYPES
将 Microsoft 的密钥和您的密钥注册到 UEFI:
# sbctl enroll-keys -m
警告:启用安全启动后,某些固件会使用 Microsoft 密钥进行签名和验证。不验证设备可能会导致设备崩溃。要注册您的密钥而不注册 Microsoft 密钥,请运行:sbctl enroll-keys。请仅在您了解操作方法的情况下执行此操作。
再次检查安全启动状态:
$ sbctl status
sbctl 现在应该已经安装好了,但是只有在使用您刚刚创建的密钥对启动文件进行签名后,安全启动才会起作用。
签名 #
检查需要签名哪些文件才能使安全启动正常工作:
# sbctl verify
现在对所有未签名的文件进行签名。通常内核和引导加载程序都需要签名。例如:
# sbctl sign -s /boot/vmlinuz-linux
# sbctl sign -s /boot/EFI/BOOT/BOOTX64.EFI
需要签名的文件取决于您的系统布局、内核和引导加载程序。
提示:尤其是在 Windows 双启动的情况下,可能需要签名的文件数量可能很多。使用 sbctl 签名所有需要的文件的过程可以通过sed完成:
# sbctl verify | sed -E 's|^.* (/.+) is not signed$|sbctl sign -s "\1"|e'
现在您已经完成了!重启系统,并在固件设置中重新启用安全启动。如果引导加载程序和操作系统能够正常加载,安全启动应该就可以正常工作了。检查方法如下:
$ sbctl status
使用 pacman hook 自动签名 #
sbctl 带有一个pacman 钩子,每当 Linux 内核、systemd 或引导加载程序更新时,它都会自动签署所有新文件。
sbctl 其他命令 #
# sbctl reset
重置平台密钥。这将使计算机退出安全启动模式并允许密钥轮换。
# sbctl rotate-keys --pk-keytype tpm --kek-keytype tpm
轮换安全启动密钥并将其替换为新生成的密钥。将旧密钥保存到 /var/tmp 目录中,并从文件数据库中注销所有文件。
# sbctl setup --print-config
打印 sbctl 当前配置。
# sbctl list-files
列出所有已注册的 EFI 二进制文件。
# sbctl remove-file <FILE>
从签名数据库中删除该文件。
# sbctl sign-all
对所有注册的 EFI 二进制文件进行签名。
fwupd #
使用 fwupd 更新固件后,安装固件会失败,根据错误信息使用以下类似命令签名:
# sbctl sign -s /usr/lib/fwupd/efi/fwupdx64.efi -o /usr/lib/fwupd/efi/fwupdx64.efi.signed
另外,必须在 /etc/fwupd/fwupd.conf 设置 DisableShimForSecureBoot ,然后重新启动。
/etc/fwupd/fwupd.conf
-----------------------------
...
[uefi_capsule]
DisableShimForSecureBoot=true