2023 archlinux 启用 Secure Boot (安全启动) 的最简单方法 -- sbctl

发布时间 2023-03-25 09:55:24作者: wswind

配置背景

最近在我的 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 进行手动配置。

根据 ArchBootDebian 对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 用于自动签名,所以在更新系统的无需额外处理。

引用:

  1. https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface/Secure_Boot#shim
  2. https://www.reddit.com/r/archlinux/comments/10pq74e/my_easy_method_for_setting_up_secure_boot_with/
  3. https://www.reddit.com/r/archlinux/comments/10k58uj/encrypted_root_secure_boot_unified_kernel_image/
  4. https://pkgbuild.com/~tpowa/archboot/web/archboot.html#secure-boot-support-with-shim-package-signed-from-fedora
  5. https://wiki.debian.org/SecureBoot