SDB:静态 Initrd 和统一内核镜像

跳转到:导航搜索
本文档描述了如何设置使用静态 initrd 和/或统一内核镜像的系统。
Icon-checked.png
此过程已在 Tumbleweed 上进行了测试


简介和动机

未签名的 initrd

initramfs(或 initrd)是由 dracutmkosi-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"

安装统一内核镜像 (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 中进行注册
  • 根据您的引导加载程序添加新的菜单条目

删除已安装的静态 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

实验

Icon-warning.png
警告:本节描述了正在进行中的实验,尚未准备好投入生产

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/

通过软件包安装

即将推出 ...

使用快照

问题:快照使用 cmdline 中的 `rootflags` 选项加载。但是,cmdline 嵌入到签名的 UKI 文件中,并且在不使签名失效的情况下无法修改。

附加组件

为了使用 UKI 的快照,我们需要使用 UKI 的“附加组件”功能。附加组件是与扩展类似的伴随文件,旨在动态添加 cmdline 选项。对于快照,我们需要添加一个指定正确快照的 rootflag 选项的附加组件。

问题:UKI 使用附加组件的方式不允许从列表中只加载一个。因此,我们无法在引导加载程序期间选择要引导的快照...

EFI 特定的附加组件

为了解决此问题,目标是创建一种新型的附加组件,需要在引导加载程序的菜单条目中选择该附加组件才能与 UKI 一起加载。例如,使用 grub2,您需要在 grub.cfg 中使用“add-on”关键字,后跟要加载的二进制文件的路径。

正在调查中 ...

Snapper 插件

为了自动处理 sd-boot 或 grub2 的快照,可以开发一个 snapper 插件。

正在调查中 ...

UKI 配置文件

正在调查中 ...


参见

相关文章