如何签署你的内核和引导加载程序?

如何签署你的内核和引导加载程序?

如何签署你的内核和引导加载程序?

如何签署我的内核和引导加载程序?

更新(2021 年 2 月 4 日) 我觉得我没有说清楚自己到底想做什么。我想废除 OEM 密钥,只使用自己的密钥。我试图运行安全启动全盘加密, 包括引导

准备

  1. 禁用安全启动删除现有密钥
  2. 下载并安装mikos/cryptboot工具。
  3. 安装软件包依赖项(在自述文件中列出)

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...

当我验证签名时,我收到一个输出,说它有多个签名,但它们没问题:

  1. 规范签名
  2. 我的自定义签名

所以我想也许删除 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-bootgrub-install

系统和环境信息

  • Ubuntu20.04
  • GRUB2.04
  • 核心5.4.0-65

更新(2021 年 2 月 4 日)

我已经不再使用这个cryptboot工具,开始手动执行所有步骤。无法获取我的密钥的问题mokutil仍然存在,但如果我先将密钥加载到 MOK 中,然后再加载到 UEFI 中,一切就都正常了。

我后来发现删除grub-efi-amd64-signed会导致你丢失shimx64.efimmx64.efi,这可能是我无法启动 MokManager 的原因以及安全启动无法正常工作的原因。

grub-efi-amd64-signed我没有安装,而是尝试在安装grub-install时运行。没有给出任何提示,因此无法启动 MokManager。我可以通过复制到然后用 将其添加为启动项来解决这个问题。这样我就可以在重启时运行 MokManger,但仍会添加默认键(稍后会详细介绍默认键)。shimgrub-efi-amd64shimx64.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

  1. 为 PK、KEK、DB 和 DBX 创建签名密钥。您可以使用 openssl 来实现此目的。
    将 x509 证书(用于 PK)保存到机器中并加载 *。英文(KEK.esl、DB.esl 和 DBX.esl)到设备。

  2. 使用签名签名 *.efi 文件。使用验证你可以检查一下

  3. 如果直接从 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.efisbsign 签署“new”。

  4. 使用以下命令更改 nvram 条目启动管理器改为 grubx64.efi 即可直接启动 grub。例如:

    efibootmgr -c -b 000A -d /dev/<drive> -p 1 -L "<any name>" -l \\EFI\\ubuntu\\grubx64.efi
    

您可以在此处找到示例如何为安全启动签名或者使用 grub 和签名的 linux 和 initrd 进行安全启动

你需要更多信息?

相关内容