Linux下的SecureBoot配置

算是划水+笔记吧

为什么要使用SecureBoot

Microsoft 上是这样说的:

Secure Boot is a security standard developed by members of the PC industry to help make sure that your PC boots using only software that is trusted by the PC manufacturer.

When the PC starts, the firmware checks the signature of each piece of boot software, including firmware drivers (Option ROMs) and the operating system. If the signatures are good, the PC boots, and the firmware gives control to the operating system.
  • 总结一下,大概就是:

SecureBoot 在你系统启动前会对内核等底层的东西进行签名验证。验证通过则继续启动,验证失败无法进去系统并弹出提示。

  • 达到的效果就是:

当你的内核遭到修改(被植入后门什么的)时, SecureBoot 会阻止系统启动,这样就能防止那些图谋不轨的人进入系统。

49:配合全盘加密食用,味道更佳。

谈谈UEFI

UEFI (可扩展固件接口)负责加电自检、联系操作系统以及提供连接操作系统与硬件的接口 [wikipedia] 。说白了就是用来替代BIOS的。具体参考 Wikipedia

杂谈

据说因为巨硬给 EFI 做出了不少的贡献,所以 EFI 的文件格式是 PE 而不是 ELF 。而且最开始的部分电脑只能使用厂商内置的key和微软的key进行签名,导致Linux下根本无法配置 SecureBoot阮一峰有提到过

为Linux配置SecureBoot

!!请确保你的 BIOS 支持 SecureBoot 中的自定义密钥选项!! ,不支持我也没办法。

参考 Ubuntu wiki

没错,代码都是复制粘贴的

创建自己的key

openssl genrsa -out test-key.rsa 2048
openssl req -new -x509 -sha256 -subj '/CN=test-key' -key test-key.rsa -out test-cert.pem
openssl x509 -in test-cert.pem -inform PEM -out test-cert.der -outform DER

你也可以使用你自己的RSA私钥生成一个key。用rsa的key登录ssh的人应该都知道怎么生成吧(然而并不。不知道就搜呗,就像我)

给内核签名

sbsign --key test-key.rsa --cert test-cert.pem --output grubx64.efi /boot/efi/efi/ubuntu/grubx64.efi
cp /boot/efi/efi/ubuntu/grubx64.efi{,.bak}
cp grubx64.efi /boot/efi/efi/ubuntu/

目录什么的需要自己改成自己的。更改 /boot/ 下的文件需要 root 权限,记得 sudo 。以上命令也可以对内核文件使用。

配置自动签名

每次更新内核都要手动签名会累死的。在 ArchLinux 里面直接可以添加 hook ,具体看 这里 。将写好的 hook 放到 /etc/pacman.d/hooks/ 即可。 Ubuntu 下参考 /etc/apt/apt.conf.d/ 目录下的配置(并没有具体尝试)。 Pacman 的配置如下:

[Trigger]
Type = Package
Target = linux-xxx # your kernel package name
Operation = Install
Operation = Upgrade

[Action]
Description = Secure Boot Sign
When = PostTransaction
Exec = # sign your vmlinuz here
Depends = sbsigntools

有个问题

签名操作不能对 initramfs 进行签名,因此需要将 initramfs 和内核文件 vmlinuz 打包在一起一并签名。然而我并没有做这一步,过程可以在 这儿 找到。这篇文章写得很详细(但是太TMD折腾了,所以搞到上一步就没搞了)。

注意事项

配置完 SecureBoot 记得给 BIOS 加密码,不然人家直接改启动,开了 SecureBoot 也白搭。

参考