为 Linux 设置自定义安全启动
前言
本篇文章以 Gentoo GNU/Linux 为例,主要使用 systemd-boot 作为 Boot Loader,使用 UKI(Unified Kernel Image)打包内核、initramfs 并使用 systemd-ukify 作为其构建工具,若需要使用其他工具或在其他环境下配置,请参考相关文档。
注意安全启动的设置可能导致设备无法正常启动,建议读者在进行配置之前先行备份重要文件并确保有能力在设备无法启动时排查问题并恢复之。
为了设置并启用安全启动,你的设备必须支持 UEFI,能够开启安全启动并允许信任用户密钥。前二者的支持可以在安装有开启了 systemd-boot 支持的 systemd 的环境中通过 bootctl status 检查(不要求使用 systemd-boot 作为 Boot Loader),若其输出中包含类似 Secure Boot: disabled (disabled) 的字样,即表示此设备可以开启安全启动;至于后者的支持则取决于厂商,因设备而异,需要用户自行进入 BIOS 检查是否有类似于将安全启动调整至设置模式(Setup Mode)的选项并开启之。
在上述事项确认完毕后,可以安装设置所需的工具:sbctl,并全局开启 secureboot USE flag。
操作
生成安全启动密钥
完成上述准备后,通过运行下面的命令以生成所需密钥:
|
|
使用 sbctl 生成的密钥应存储于 /var/lib/sbctl/keys,请确认相关文件存在且其权限正确。
配置 UKI 构建
如前所述,本文使用 systemd-ukify 作为 UKI 构建工具,systemd-ukify 会在内核映像与 initramfs 构建完成后将其打包为 UKI 并签名,因此在进行此处的配置之前需要有能够正常启动的内核与 initramfs,读者可以自行选取其配置与构建方式,本文不再赘述。
此后配置 systemd 启用 ukify USE flag,installkernel 启用 uki 与 ukify USE flag 后,编辑文件 /etc/kernel/uki.conf,内容如下:
|
|
这之后,使用 portage 构建的内核软件包在安装时会自动调用 systemd-ukify 构建 UKI 并签名。
配置内核并重构相关软件包
在/etc/portage/make.conf中添加下列配置:
|
|
为内核及安装的树外模块启用 modules-sign USE flag 后,重构内核及相关软件包,注意此时可能需要重新使用 bootctl install 安装被签名的 systemd-boot。
完成之后,Boot Loader 与新安装的 UKI 应均已签名,可以通过 sbctl verify 检查之。注意在安全启动配置完毕后,只有在 /etc/kernel/cmdline 中配置并打包在 UKI 当中的内核命令行参数可以生效,请确认所有所需的内容都在其中配置。
配置并启用安全启动
重启进入 BIOS,将安全启动调整至设置模式并重启进入操作系统,此时应可以通过 bootctl status 看到类似 Secure Boot: disabled (setup) 的字样,此时即可通过 sbctl enroll-keys 写入相关密钥。若同时需要启动 Windows 或存在使用微软密钥签名的固件等,则可以通过 sbctl enroll-keys --microsoft 将其一并写入。
完成之后,安全启动应配置完成,除被信任的密钥签名的内容以外均无法引导,可以通过 bootctl status 验证,应能够看到类似 Secure Boot: enabled (user) 的字样。
在 NixOS 上的配置
Nix 社区项目 Lanzaboote 为 NixOS 提供了安全启动解决方案,NixOS 用户可以通过其进行安全启动的配置,大体过程与 Gentoo GNU/Linux 类似。
在完成相关内容的确认后,根据 NixOS 的配置方式将 Lanzaboote 加入系统配置,使用 sbctl 生成密钥,并添加如下所示的内容:
|
|
再将安全启动调整至设置模式,重启进入操作系统使用 sbctl 写入密钥即可。具体细节可在其文档中查询。
参考资料
- Secure Boot - Gentoo wiki
- Unified Extensible Firmware Interface/Secure Boot - ArchWiki
- Unified kernel image - Gentoo wiki
- Unified kernel image - ArchWiki
- sbctl - Gentoo wiki
- Introduction - Lanzaboote Docs