配置背景
最近在我的 Thinkpad 上装了 Windows 11 + Archlinux 双系统。想要开启下 Secure Boot。
其实不开启双系统运行也正常,但由于 Windows 上的 WSA 和 部分游戏的安全检测会校验是否开启了 Secure Boot。而 Windows 11 目前仍旧是我的主力系统。所以为了不影响 Windows 的功能,还是决定开启它。
开启 Secure Boot 还有另外的重大意义在于开启数据加密。没有 Secure Boot,仅加密磁盘,启动程序有被篡改攻击的可能。
对于 Ubuntu / Fedora / Debian 来说,开启 Secure Boot 可能就是配置下 BIOS 的事情,而由于 ArchLinux 系统下,官方移除了 Secure Boot 支持,事情就没有那么简单了。你需要自己基于Arch Wiki 进行手动配置。
根据 ArchBoot 和 Debian 对Secure Boot的支持来看,它们都使用的是 Shim 的方式。
Shim 是 fedora 团队提供的一个为 linux 系统支持 secure boot 的解决方案。shim提供了一个由微软支持的第三方签名 efi 启动项(shimx64.efi),和一个 MokManager (mmx64.efi)。MokManager 用于在你启动失败的时候,提供一个 Fallback 界面让你导入你的 key / hash。配置好后,BIOS 设置Secure Boot允许微软颁发的第三方CA证书,应该就可以正常启动了。
最初我也想通过类似的方式实现。但是最后还是停在了 “shim Verification Failed 0x1A security violation” 这个报错上。
Arch Wiki 说 Grub 启动要指定 GRUB_MODULES,但是我的报错和 Wiki 提到的也不完全相同。我也不想再去尝试 PreLoader, rEFInd, systemd-boot 这些我不熟悉的工具链。
最终在 reddit 上找到了一个高赞文章《My easy method for setting up Secure Boot with GRUB》。看上去很美好,通过 sbctl,直接使用微软的证书签名自己的密钥。我也很快就配置成功了。
在这里翻译一下分享给需要在 ArchLinux 开启 Secure Boot 的朋友。
注意事项
需要提前注意的是:
根据 Bai-Chiang 安装笔记中的警告 这个方法可能不能适配所有机器。而且可能产生比较严重的后果:
某些插件卡(例如视频卡或 PXE 启动网卡)的固件由 Microsoft 的密钥签名。如果您在没有匹配公钥的情况下启用安全启动,则此类设备将无法工作(至少不能从固件中工作)。这些设备将无法在操作系统启动之前运行。 如果您的 CPU 没有集成显卡,而独立 GPU 在操作系统启动前不工作,你会无法访问 BIOS。
白话来说就是:如果你的设备没有集显,那么谨慎使用本方法。可能会搞成砖机。
配置方法
下文中esp需要修改为你的efi挂载分区,按照官方Wiki安装的话,应该是/boot目录。
以下命令通过 root 权限运行
# 重新安装 Grub
sudo grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB --modules="tpm" --disable-shim-lock
# 生成启动项
sudo grub-mkconfig -o /boot/grub/grub.cfg
# 安装 sbctl (Secure Boot配置工具)
sudo pacman -S sbctl
# 下面的命令需要在 BIOS 的 UEFI 配置中,设置 Secure Boot 为 Setup 模式。
# 重启后校验是否进入进入了安装模式
sbctl status
# 创建 keys
sbctl create-keys
# 使用微软的CA证书注册 keys
sbctl enroll-keys -m
# enroll-keys 会提示一些 efivars 不可写
# 通过 chattr -i 修改后再次执行 enroll-keys
chattr -i /sys/firmware/efi/efivars/<filename>
# 查看状态
sbctl status
# 检测状态,会看到启动项未签名
sbctl verify
# 启动项签名
sbctl sign -s /boot/EFI/GRUB/grubx64.efi
# 检测状态,会看到启动项已签名
sbctl verify
# 重启,并在 UEFI 中开启 Secure Boot
# 再次查看状态
sbctl status
# sbctl 自带了一个 pacman hook 用于自动签名,所以在更新系统的无需额外处理。
引用:
- https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface/Secure_Boot#shim
- https://www.reddit.com/r/archlinux/comments/10pq74e/my_easy_method_for_setting_up_secure_boot_with/
- https://www.reddit.com/r/archlinux/comments/10k58uj/encrypted_root_secure_boot_unified_kernel_image/
- https://pkgbuild.com/~tpowa/archboot/web/archboot.html#secure-boot-support-with-shim-package-signed-from-fedora
- https://wiki.debian.org/SecureBoot