您尚未登录。

#1 2020-07-14 03:40:24

yw662
大会员
注册时间: 2018-10-10
帖子: 304

[记录] 替换安全启动密钥并签名内核

pro:
1.可以保证bios只会引导被正确签名的efi application和bootloader,可以保证内核和bootloader不被替换。
2.使用自己生成的安全启动密钥可以确保三个私钥(PK, KEK, DB)受自己的控制。
con:
1.必须签名所有你想要在这台机器上运行的bootloader,除了内核和bootloader之外,也包括windows和efi shell。
2.内核不会验证initrd签名(虽然bootloader会),bootloader不会验证配置文件签名,因此修改引导参数和替换initrd总是可行的。
*解决方案1:设置bios管理密码并使用efi stub直接引导内核以保证引导参数不被修改,同时,不使用外置initrd以保证其不被替换。这意味着,如果需要修改内置initrd,必须重新编译内核。
*解决方案2:使用grub引导,并将grub.cfg,内核和initrd都放在加密分区内(ESP挂载到/boot/efi而不是/boot)。签名所有esp内的grub组件,并使用cryptomount挂载加密分区。
*解决方案3(物理):因为修改initrd必须要物理接触到硬盘,所以,嗯,就是说,嗯……
过程
1.生成安全启动密钥
sbkeys(AUR) https://aur.archlinux.org/cgit/aur.git/ … s?h=sbkeys 可以用于自动生成密钥。也可以参照此脚本手动生成密钥。

2.安装密钥(又名:虚假的第二步)
将密钥复制到FAT分区并重启到bios。(systemctl reboot --firmeware-setup),清除内置密钥并用新密钥替换。(Platform key=PK, key exchange key=KEK, Authorized Signatures=DB)。当然你也可以使用efitools的keyTool。

*然后例行检查bios是否拒绝引导内核,然后禁用安全启动。

*如果我无法替换安全启动密钥呢?
无法解决问题的话,就解决制造问题的电脑好了。

3.签名内核(又名:真正的第二步)
可以使用sbsign-tool签名内核。
一个用于签名的例子是:
sbsign --key DB.key --cert DB.crt --output /boot/vmlinuz-linux /boot/vmlinuz-linux
你可能同时希望签名bootloader和initrd(注意(again):内核并不会验证ininrd,只有bootloader会,但是bootloader不会验证配置文件)

*记得启用安全启动

*签名efi shell安全吗?
在安全启动启用下,efi shell会验证efi application的签名,但不会验证nsh脚本(当然也不会验证用户手动输入的命令所以这很科学)。因此efi shell还是有可能能做到一些事情的。

4.pacman钩子
当然你不想每次升级内核(和bootloader)后都重新手动签名,所以pacman的钩子也是很重要的。
因为mkinitcpio钩子的数字是90,所以这个钩子的数字需要大于90。
如下:
[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = linux (或者grub或者什么)

[Action]
Description = 妈妈说如果名字起得很长就会容易被看到
When = PostTransaction
Exec = /usr/bin/sbsign blah blah

以上。
我们linux也用上安全启动了可喜可贺可喜可贺。

后续
1.bypass initrd
当然实际上你什么都不做也有机会直接bypass掉。但是如果不行的话就需要……自行编译内核了。

2.编译内核……
诶你以为我会写我是怎么编译内核的?这是不是有种超纲的感觉。

3.efi stub
首先是(optional) efibootmgr -b N -B,其中N是你想要删除的引导项编号……当然如果你没有想要删掉的东西的话那就……
啊不对,首先是安装efibootmgr。
然后,
efibootmgr --disk /dev/nvme0n1 --part 1 --create --label "我们的超级无敌炫酷内核" --loader /vmlinuz-linux --unicode 'root=PARTLABEL=ROOT rw resume=PARTLABEL=RESUME blah blah'
对就是这样。
然后,如果你想要修改label或引导参数,那么就删掉重来吧。

以上。

最近编辑记录 yw662 (2020-07-14 06:00:19)


ecmascript是世界上最好的语言

离线

#2 2020-09-27 20:54:34

HiltonLeftChain
会员
所在地: Earth
注册时间: 2017-11-11
帖子: 7
个人网站

Re: [记录] 替换安全启动密钥并签名内核

cryptboot 这个 Shell 脚本(AUR 链接)可以帮助简化这个过程。

不过要求有

  • 一个独立的使用 LUKS 加密的 /boot 分区

  • /etc/fstab 中指定了 /boot(变量 BOOT_DIR) 和 /boot/efi(变量 EFI_DIR)

  • /etc/crypttab 中指定了 cryptboot(变量 BOOT_CRYPT_NAME)

变量值可以在 /etc/cryptboot.conf 指定;当然,因为是 Shell 脚本,也可以做些修改解除所有限制的。

整个过程就是:

  1. 生成密钥

    cryptboot-efikeys create
  2. 安装密钥(需要先让 Secure Boot 进入 Setup Mode)

    cryptboot-efikeys enroll
  3. 如果 bootloader 是 GRUB 的话,这样会更新软件 -> 生成 grub 配置文件 -> 重新安装 bootloader -> 为 bootloader 签名;如果不是,就会报错

    cryptboot upgrade

    其它 bootloader 的话,我没有用过,参考关于签名的内容吧(

只是给 bootloader 签名的话(pacman 钩子也是用这个)

/bin/cryptboot-efikeys sign /boot/grub/efi/EFI/grub/grubx64.efi

最近编辑记录 HiltonLeftChain (2020-09-27 20:57:10)


自由软件爱好者,性格怪。

离线

页脚