SDB:静态 Initrd 和统一内核镜像
简介和动机
未签名的 initrd
引导链损坏
initramfs(或 initrd)是由 dracut(mkosi-initrd,...)生成的压缩归档文件。它包含挂载根文件系统所需的最小服务集,并且在这种情况下,initramfs 只能由生成它的系统使用。因此,由于在机器上本地构建,它不能由供应商签名。引导链并非完全安全,攻击者可以更改或破坏包含 initramfs 的 cpio 归档文件。
使用静态 initrd 和统一内核镜像
为了提高引导链的安全性,一个想法是在供应商端构建一个静态 initramfs 并让其签名。我们使用 OpenBuildService (OBS) 构建此项目并通过发行版的软件包管理器提供它。为了提供更强大和安全的镜像,从静态 initrd 开始的下一步是使用统一内核镜像 (UKI)。它提供了一个包含内核、模块、initramfs、kernel-cmdline-参数等所有内容的 EFI 二进制文件。它将所有构建集中化,内核和 initrd 从 OBS 构建,所有内容一次性签名。发行版变得更加强大和安全
重要链接
从 Factory 安装静态 initrd 和统一内核镜像
安装未签名的静态 initrd
sudo zypper install static-initrd-<flavor>-unsigned
- 一个静态 initrd 将安装到
/usr/share/initrd/static-initrd-<flavor>-<kernel_version>.unsigned - flavor 是一种“专用”initrd,用于特定用例,例如:
- "generic" → 包含所有模块,尽可能成为最通用的 initrd,应该适用于大多数情况。
- "base" → 包含最少数量的模块,可能不适用于所有用例,需要通过附加组件进行扩展
- "network" → 一个专用 initrd 的示例,其中包含基本内容和所有“网络”模块
- 所有 flavor 都是未签名的。未签名的 flavor 是为了与 UKI 项目一起使用(参见下一节)。它也适用于在不关心签名的情况下测试静态 initrd。
localhost:~ # zypper se -t package static-initrd-* Loading repository data... Reading installed packages... S | Name | Summary | Type ---+--------------------------------+--------------------------------+-------- | static-initrd-base-unsigned | Unsigned static base initrd | package | static-initrd-generic-unsigned | Unsigned static generic initrd | package | static-initrd-network-unsigned | Unsigned static network initrd | package
添加引导加载程序条目
- 需要 uki-tool 包
sudo zypper install uki-tool
- 调用命令以添加引导加载程序条目(/!\ 将用于构建静态 initrd 的相同内核版本放在 initrd 文件名中找到)
# For grub2 uki-tool grub2 --add --initrd /usr/share/initrd/static-initrd-generic-<kernelver>.unsigned --kerver <kernelver> # For sdboot uki-tool sdboot --add --initrd /usr/share/initrd/static-initrd-generic-<kernelver>.unsigned --kerver <kernelver> # To see entries at boot with sdboot, edit the /boot/efi/loader/loader.conf with "timeout 5"
screenshot grub2 static initrd entry
安装统一内核镜像 (uki-<kernel_flavor>)
# UKI based on the "default" kernel flavor sudo zypper install uki-default
该软件包将
- 将 UKI 安装到
/usr/lib/modules/${uname}/uki-<kernel_flavor>-<uki_version>.efi - 将证书安装到
/usr/share/unified/certs/uki-<kernel_flavor>-<uki_version>-<cert_id>.crt中进行注册 - 根据您的引导加载程序添加新的菜单条目
screenshot grub2 uki entry
删除已安装的静态 initrd 和 UKI
删除未签名的静态 initrd
sudo zypper remove static-initrd-<flavor>-unsigned # for grub2 uki-tool grub2 --remove --initrd /boot/static-initrd-<flavor>-<kernelver>.unsigned # for sdboot uki-tool sdboot --remove --initrd /boot/efi/<machine-id>/<kernelver>/static-initrd
删除 UKI
sudo zypper remove uki-default
实验
UKI 扩展
扩展放置在额外的 UKI 目录中
- 全局额外位于
/usr/lib/modules/uki.extra.d - UKI 特定的额外位于
/usr/lib/modules/$(uname -r)/${uki_name}.efi.extra.d/(/usr/lib/modules/6.9.1-1.foo/bar_123.efi.extra.d/)
使用 uki-tool 本地构建
ukit extension\
--packages "strace"\
--type raw\
--arch x86_64\
--uki /usr/lib/modules/$(uname -r)/${efi_file}\
--name strace
此示例创建一个格式化的扩展,包含 strace 及其依赖项,命名为“strace”
localhost:~ # ukit extension -n "debug" -p "strace" -u /usr/lib/modules/6.9.7-1-default/uki-0.1.0.efi [INFO] Check the uki /usr/lib/modules/6.9.7-1-default/uki-0.1.0.efi and extract the initrd... [INFO] Create the extension 'debug-ext.raw' with 'strace' in format squashfs at type raw for the uki /usr/lib/modules/6.9.7-1-default/uki-0.1.0.efi [INFO] Get all dependencies to install... [INFO] Create an image of sized 18M... [============================================================================================================================================================================================================================================================================================================\] 200/200 100% [INFO] extension image created at ./debug-ext.raw localhost:~ # cp ./debug-ext.raw /boot/efi/EFI/opensuse/uki-0.1.0.efi uki-0.1.0.efi uki-0.1.0.efi.extra.d/ localhost:~ # cp ./debug-ext.raw /boot/efi/EFI/opensuse/uki-0.1.0.efi.extra.d/
通过软件包安装
即将推出 ...
使用快照
附加组件
为了使用 UKI 的快照,我们需要使用 UKI 的“附加组件”功能。附加组件是与扩展类似的伴随文件,旨在动态添加 cmdline 选项。对于快照,我们需要添加一个指定正确快照的 rootflag 选项的附加组件。
EFI 特定的附加组件
为了解决此问题,目标是创建一种新型的附加组件,需要在引导加载程序的菜单条目中选择该附加组件才能与 UKI 一起加载。例如,使用 grub2,您需要在 grub.cfg 中使用“add-on”关键字,后跟要加载的二进制文件的路径。
正在调查中 ...
Snapper 插件
为了自动处理 sd-boot 或 grub2 的快照,可以开发一个 snapper 插件。
正在调查中 ...
UKI 配置文件
正在调查中 ...

