什么是安全引导(SecureBoot)?
Secure Boot 是一项用于提高计算机启动安全性的技术。它的主要作用是在计算机启动过程中验证引导加载程序和操作系统内核的安全性和完整性。
Secure Boot 的工作原理是:
在 UEFI 固件中内置一个可信的公钥,用于验证引导加载程序和操作系统内核的数字签名。这些组件在发布前都要使用该公钥对应的私钥进行签名。
当计算机启动时,固件会检查引导加载程序的签名。如果签名有效,则加载引导加载程序并执行。如果签名无效,则停止启动过程。
引导加载程序再检查操作系统内核的签名。如果签名有效,则加载内核并启动操作系统。
整个启动过程中,任何一个组件的签名验证失败,都会停止启动,从而防止潜在的恶意软件入侵。
启用 Secure Boot 可以防止 rootkit 和 bootkit 等病毒的感染。它是 UEFI 固件的一个重要安全功能,现代个人计算机和服务器广泛采用。但也存在可能限制操作系统选择、增加软件兼容性问题等缺点。
启用SecureBoot过程
Manjaro Linux 系统启用 Secure Boot 的过程包括:
- 系统引导程序需要获得 Microsoft 的签名密钥才能让操作系统内核通过 Secure Boot 验证,但这是不可能的,因为微软不会这么做。因此替代方案是自行生成MOK密钥(Machine Owner Key)并替换 UEFI 固件的默认密钥;
- 按照GRUB的官方文档重新生成并安装GRUB,这一步坑比较多;
- 使用MOK密钥对引导程序进行签名。
MOK密钥生成和导入
在开始之前,先重启系统进入BIOS设置界面,设置SecureBoot进入Setup Mode(不同的机器可能操作不一样)。
设置完成后重启进入系统,安装以下软件:
- sbctl:Secure Boot key manager,这个工具使得密钥的生成和写入变得非常简单,它还拥有引导程序签名、pacman hook等功能。
1 | yay -S sbctl |
查看SecureBoot状态:
1 | sudo sbctl status |
应该看到 sbctl 工具未安装并且SecureBoot已禁用。
生成MOK密钥:
1 | sudo sbctl create-keys |
这将在默认位置生成MOK密钥。
将MOK密钥连带Microsoft密钥一起导入UEFI固件中:
1 | sudo sbctl enroll-keys -m |
注意:如果不附带“-m”选项,将会导致Mincrosoft密钥丢失,使Windows无法启动,而且某些固件会使用 Microsoft 密钥进行签名和验证,不验证设备可能会使它们变砖。
再次检查SecureBoot状态,此时sbctl会显示已安装。
1 | sudo sbctl status |
重新构建GRUB
要使GRUB能在SecureBoot模式下启动,GRUB必须集成运行过程中所需的所有模块,可以参考ubuntu的grub生成脚本来选择所需要的模块。然后,将这些模块记录成环境变量使用。
新建\etc\grub_modules
文件:
1 | sudo touch /etc/grub_modules |
打开文件,加入以下内容:
1 | CD_MODULES=" |
或者,通过已有的grub.cfg文件寻找所需的模块:
1 | sudo cat /boot/grub/grub.cfg | awk '/insmod/ { print $2 }' | sort | uniq |
保存文件并source:
1 | source /etc/grub_modules |
重新构建安装GRUB到ESP分区:
1 | sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --modules="${GRUB_MODULES}" --sbat /usr/share/grub/sbat.csv --disable-shim-lock |
target选项指明系统架构,efi-directory指明ESP分区挂载的位置,sbat是SecureBoot过程中GRUB需要的小节,disable-shim-lock选项解决了shim_lock protocol not found
错误。
重新生成grub.cfg:
1 | sudo grub-mkconfig -o /boot/grub/grub.cfg |
对引导程序进行签名
1 | sudo sbctl sign -s /boot/efi/EFI/Manjaro/grubx64.efi |
重新检查efi文件签名情况:
1 | sudo sbctl verify |
除windows相关的引导文件外,其他efi都应该进行签名,例如黑苹果引导OpenCore文件的签名:
1 | sudo -i |
测试
签名完成后,进入BIOS将SecureBoot设为启用状态。
重启进入系统,检查SecureBoot状态:
1 | sudo sbctl status |
正常应该如下所示:
1 | Installed: ✓ sbctl is installed |
然后,测试其他系统是否能够启动成功。
至此,SecureBoot启用完成。