我遇到了局域网唤醒的情况,我想让 GRUB 发出网络请求来决定“我应该启动 Windows 吗?”,也许是通过load_env (http,192.168.1.123)/grubenv
(这样我就可以在唤醒机器之前写入该文件)。不幸的是,默认的 Ubuntu 签名 GRUB 缺少诸如http
和 之类的模块tftp
,并且在启用安全启动的情况下,它将拒绝从磁盘加载它们。
因此,我认为注册 MOK 并签署独立版本的 GRUB 是一个解决方案,但我收到了一个蓝色的文本模式对话框,我相信它来自 shim,上面写着:
验证失败:(0x1A)安全违规
随后出现了“Shim UEFI 密钥管理”对话框,我可以通过该对话框注册哈希值,但奇怪的是,这样做之后,我在下次启动时仍然得到相同的结果,并且所呈现的哈希值与 grubx64.efi 或中的任何其他文件的grubx64.efi
直接值不匹配。sha256sum
/boot/efi
我的 MOK 有“X509v3 扩展密钥用法:代码签名,1.3.6.1.4.1.311.10.3.6”,即才不是具有与发行版生成的 ID 类似的“1.3.6.1.4.1.2312.16.1.2”ID,这会将其限制为内核模块签名。
这是我所做的:
# cat >grub-initial.cfg <<EOF
search.fs_uuid [……/boot uuid……] root
set prefix=($root)/grub
configfile $prefix/grub.cfg
EOF
# MODULES="tpm part_gpt lvm ext2 fat chain linux efifwsetup \
efi_uga efi_gop efinet configfile normal gzio gfxterm ls cat \
test echo http gfxterm_background png gfxterm_menu gfxmenu \
sleep videoinfo gettext loadenv search luks password_pbkdf2 \
extcmd terminal play linuxefi search_fs_uuid search_label \
search_fs_file regexp reboot halt memdisk lsefi"
# grub-mkstandalone --compress=xz -O x86_64-efi -o grubx64.unsigned \
--install-modules="$MODULES" --modules="$MODULES" --themes="" \
--locales="en@quot" boot/grub/grub.cfg=grub-initial.cfg
# sbsign --key /etc/keys/MOK.priv --cert /etc/keys/MOK.pem \
--output grubx64.efi grubx64.unsigned
# mokutil --test-key /etc/keys/MOK.der
/etc/keys/MOK.der is already enrolled
# sbverify --cert /etc/keys/MOK.pem /boot/efi/EFI/bifrost/grubx64.efi
Signature verification OK
# mkdir /boot/efi/EFI/bifrost
# cp grubx64.efi /boot/efi/EFI/bifrost/
# cp /boot/efi/EFI/ubuntu/{shimx64.efi,mmx64.efi} /boot/efi/EFI/bifrost/
# efibootmgr -c -d /dev/nvme0n1p1 -L "bifrost auto select" -l "\EFI\bifrost\shimx64.efi"
# efibootmgr -v
[…]
Boot0001* bifrost auto select HD(1,GPT,[……ESP uuid……],0x800,0x82000)/File(\EFI\BIFROST\SHIMX64.EFI)
Boot0002* ubuntu HD(1,GPT,[……ESP uuid……],0x800,0x82000)/File(\EFI\UBUNTU\SHIMX64.EFI)..BO
[…]
...然后重新启动并手动选择新的启动项,现在。
我认为正在发生的情况是:
- 启动原装 GRUB 时:
Boot0002
-> Ubuntu shim -> Ubuntu GRUB -> Linux 或 Windows - 启动本地 GRUB 时:
Boot0001
-> Ubuntu shim 的副本 -> 拒绝我的 GRUB,但我不知道为什么
可能的理论:
- 我正在以某种方式在某处启动其他垫片?
- 复制的 Ubuntu shim 是否正在尝试启动除
grubx64.efi
其旁边的其他程序? - 复制的 Ubuntu shim 是否以某种方式期望与所
mokutil
查看的密钥不同? - ...或者,最有可能的是,我误解了某件事。
答案1
事实证明我需要添加SBAT(安全启动高级目标)这基本上是一种版本信息,以便可以更有效地撤销易受攻击的软件上的签名。如上所述在 Arch wiki 上,shim 版本 15.3 及以上版本将无法启动没有有效.sbat
部分的 EFI 二进制文件。grub-mkstandalone
我上面使用的两者grub-mkimage
都有一个添加它的选项:
--sbat some-sbat-file.csv
上面的第一个链接包含几个示例 SBAT CSV 文件。我认为最好使用我使用的 Ubuntu GRUB 包中的信息,该包没有将此信息打包为单独的文件,但可以提取:
objcopy -O binary --only-section=.sbat grubx64.efi /dev/stdout
sbat,1,SBAT Version,sbat,1,https://github.com/rhboot/shim/blob/main/SBAT.md
grub,3,Free Software Foundation,grub,2.06,https://www.gnu.org/software/grub/
grub.ubuntu,1,Ubuntu,grub2,2.06-2ubuntu14.1,https://www.ubuntu.com/