如何签署你的内核和引导加载程序?
如何签署我的内核和引导加载程序?
更新(2021 年 2 月 4 日) 我觉得我没有说清楚自己到底想做什么。我想废除 OEM 密钥,只使用自己的密钥。我试图运行安全启动和全盘加密, 包括引导。
准备
- 禁用安全启动和删除现有密钥。
- 下载并安装mikos/cryptboot工具。
- 安装软件包依赖项(在自述文件中列出)
Cryptboot 配置
对配置文件做了一些更改(这些是我为反映我的设置而做的更改)。
# Encrypted boot device name (/dev/mapper/$BOOT_CRYPT_NAME)
# (have to be specified in /etc/crypttab)
BOOT_CRYPT_NAME="LUKS_BOOT"
# Boot entry in UEFI Boot Manager (if using GRUB boot loader)
EFI_ID_GRUB="ubuntu"
# Path to GRUB boot loader EFI file (relative to EFI System partition)
EFI_PATH_GRUB="EFI/ubuntu/grubx64.efi"
采取的措施
# Create and enroll keys (must be in setup mode, verify with bootctl)
cryptboot-efikeys create
cryptboot-efikeys enroll
# Sign kernel
cryptboot-efikeys sign /boot/vmlinuz-5.4.0-65-generic
# Sign bootloader
cryptboot update-grub
当我重新启动并启用安全启动我会收到这个错误:
error: Secure Boot forbids loading module from (cryptouuid/abcdef0123456789)/grub/x86_64-efi/normal.mod
当我通过捆绑/预加载(使用--modules
参数grub-install
)模块修复该问题时,出现此错误:
error: /vmlinuz-5.4.0-65-generic has invalid signature.
error: you need to load the kernel first
Press any key to continue...
当我验证签名时,我收到一个输出,说它有多个签名,但它们没问题:
- 规范签名
- 我的自定义签名
所以我想也许删除 Canonical 签名会有所帮助。 找到了一个名为的程序pesign
,它可以让我从二进制文件中删除签名。 我删除了 Canonical 签名,然后通过运行以下命令验证签名是否仍然正常:
cryptboot-efikeys verify /boot/vmlinuz-5.4.0-65-generic
一切似乎都很好,它说签名有效(OK)。当我重新启动时,我仍然收到与以前相同的错误。不要认为这是问题所在(上面有 Canonicals 签名)。
附加信息
我已仔细检查过我的钥匙是否已正确登记。
cryptboot-efikeys list
# All UEFI Secure Boot keys enrolled in your UEFI firmware:
# Variable PK, length 835
# PK: List 0, type X509
# ...
# Variable KEK, length 837
# KEK: List 0, type X509
# ...
# Variable db, length 835
# db: List 0, type X509
# ...
# Variable dbx, length -4
# Variable MokList has no entries
双重检查
moktuil --import /boot/efikeys/PK.cer
# SKIP: efikeys/PK.cer is already in PK
mokutil --import /boot/efikeys/KEK.cer
# SKIP: efikeys/KEK.cer is already in KEK
mokutil --import /boot/efikeys/db.cer
# SKIP: efikeys/db.cer is already in db
当我运行时,mokutil --list-enrolled
它告诉我 MOK 列表是空的。
mokutil --list-enrolled
# MokListRT is empty
查看各种指南和文章时,他们都说导入密钥时mokutil
会提示您输入密码,然后必须重新启动并选择所需的密钥。然后,在重新启动后验证密钥是否已正确注册。
由于我的输出mokutil --list-enrolled
显示列表为空,我感觉这就是导致我看到的错误的原因。我已阅读了脚本cryptboot-efikeys
,它没有mokutil
在任何地方使用,也许这有帮助。
我的钥匙已经注册并且mokutil
不会接受它们,所以如果这导致了问题,我不知道如何在不放弃cryptboot
并亲自执行所有操作的情况下修复它,而我并不想这样做。
还尝试了该包,它将为您提供使用该选项的grub-efi-amd64-signed
选项,但这似乎没有任何区别。--uefi-secure-boot
grub-install
系统和环境信息
- Ubuntu
20.04
- GRUB
2.04
- 核心
5.4.0-65
更新(2021 年 2 月 4 日)
我已经不再使用这个cryptboot
工具,开始手动执行所有步骤。无法获取我的密钥的问题mokutil
仍然存在,但如果我先将密钥加载到 MOK 中,然后再加载到 UEFI 中,一切就都正常了。
我后来发现删除grub-efi-amd64-signed
会导致你丢失shimx64.efi
和mmx64.efi
,这可能是我无法启动 MokManager 的原因以及安全启动无法正常工作的原因。
grub-efi-amd64-signed
我没有安装,而是尝试在安装grub-install
时运行。没有给出任何提示,因此无法启动 MokManager。我可以通过复制到然后用 将其添加为启动项来解决这个问题。这样我就可以在重启时运行 MokManger,但仍会添加默认键(稍后会详细介绍默认键)。shim
grub-efi-amd64
shimx64.efi
/usr/lib/shim/shimx64.efi
/boot/efi/EFI/ubuntu/
efibootmgr
退后一步,重新安装了系统,没有任何加密,只是为了看看 vanilla Ubuntu 20.04 在设置方面会做什么。我能够使用我自己的密钥(有点)在 vanilla Ubuntu 20.04 桌面安装上设置安全启动。
使用添加密钥时,mokutil --import key.der
我还获得了 Microsoft shim 签名密钥和 Canonical 安全启动签名密钥。我不认为这是我想要的,但目前还不能确定,因为我不完全了解 MOK 密钥的作用。无法使用从 MOK 中删除 Microsoft 和 Canonical 密钥mokutil
。我现在正在研究从源代码编译 shim,希望默认密钥未注册。
答案1
为 PK、KEK、DB 和 DBX 创建签名密钥。您可以使用 openssl 来实现此目的。
将 x509 证书(用于 PK)保存到机器中并加载 *。英文(KEK.esl、DB.esl 和 DBX.esl)到设备。如果直接从 grub2 启动(不使用 shim),你必须使用 OpenPGP 签署所有通过 grub 加载的文件!
例如:
- grub.cfg->grub.cfg.sig
- *.mod -> *.mod.sig
- vmlinuz-5.4.0-65-通用-> vmlinuz-5.4.0-65-通用.sig
- ...
嵌入 OpenPGP 的公共部分grub-mkstandalone还添加了 grub 启动所需的最小模块集。不要忘记使用
grubx64.efi
sbsign 签署“new”。使用以下命令更改 nvram 条目启动管理器改为 grubx64.efi 即可直接启动 grub。例如:
efibootmgr -c -b 000A -d /dev/<drive> -p 1 -L "<any name>" -l \\EFI\\ubuntu\\grubx64.efi
您可以在此处找到示例如何为安全启动签名或者使用 grub 和签名的 linux 和 initrd 进行安全启动。
你需要更多信息?