发布带有 UKI(统一内核映像)支持的 systemd 系统管理器 252

经过五个月的开发,系统管理器systemd 252发布了,新版本的关键变化是集成了对现代化引导过程的支持,它不仅允许您验证内核和引导加载程序,还可以验证组件使用数字签名的基本系统环境。

所提出的方法涉及在加载时使用统一的内核映像UKI(统一内核映像),它结合了从UEFI(UEFI引导存根)加载内核的处理程序、Linux内核映像和加载到内存中的initrd系统环境,使用用于挂载根 FS 之前阶段的初始初始化。 UKI 映像被打包为 PE 格式的单个可执行文件,可以使用传统引导加载程序加载或直接从 UEFI 固件调用。 当从 UEFI 调用时,不仅可以验证内核数字签名的完整性和可靠性,还可以验证 initrd 内容的完整性和可靠性。

为了计算用于监控完整性并生成 UKI 映像数字签名的 TPM PCR(可信平台模块平台配置寄存器)寄存器的参数,包含了一个新的实用程序 systemd-measure。 签名中使用的公钥和附带的 PCR 信息可以直接嵌入到 UKI 启动映像中(密钥和签名保存在 PE 文件中的“.pcrsig”和“.pcrkey”字段中)并由外部从中提取或内部实用程序。

特别是,systemd-cryptsetup、systemd-cryptenroll 和 systemd-creds 实用程序已适应使用此信息,通过这些信息,您可以确保加密的磁盘分区绑定到数字签名的内核(在这种情况下,可以访问加密的分区)仅当 UKI 映像已通过基于 TPM 中参数的数字签名验证时才提供)。

此外,还包含 systemd-pcrphase 实用程序,它允许您控制各种启动阶段与支持 TPM 2.0 规范的加密处理器内存中的参数的绑定(例如,您可以使 LUKS2 分区解密密钥仅在initrd 映像并在稍后阶段下载阻止对其的访问)。

其他一些变化:

  • 确保默认区域设置为 C.UTF-8,除非在设置中指定了不同的区域设置。
  • 现在可以在首次引导期间执行完整的服务预设操作(“systemctl预设”)。 在启动时启用预设需要使用“-Dfirst-boot-full-preset”选项进行构建,但计划在未来版本中默认启用。
  • 用户管理单元涉及CPU资源控制器,这使得可以确保CPUWeight设置应用于用于将系统分割成多个部分(app.slice、background.slice、session.slice)的所有切片单元,以隔离之间的资源不同的用户服务,竞争CPU资源。 CPUWeight还支持“空闲”值来激活适当的资源配置模式。
  • 在临时(“瞬态”)单元和 systemd-repart 实用程序中,可以通过在 /etc/systemd/system/name.d/ 目录中创建嵌入式文件来覆盖设置。
  • 对于系统映像,设置了支持结束标志,根据 /etc/os-release 文件中新参数“SUPPORT_END=”的值确定这一事实。
  • 添加了“ConditionCredential=”和“AssertCredential=”设置,如果系统中不存在某些凭据,这些设置可用于忽略或崩溃单元。
  • 在 system.conf 和 user.conf 中添加了“DefaultSmackProcessLabel=”和“DefaultDeviceTimeoutSec=”设置,以定义默认 SMACK 安全级别和单元激活超时。
  • 在“ConditionFirmware=”和“AssertFirmware=”设置中,添加了指定各个 SMBIOS 字段的功能,例如,仅当 /sys/class/dmi/id/board_name 字段包含值“Custom”时才启动单元Board”,您可以指定“ConditionFirmware=smbios” -field(board_name = "Custom Board")"。
  • 在初始化过程 (PID 1) 期间,除了通过 qemu_fwcfg 进行定义之外,还添加了从 SMBIOS 字段(类型 11,“OEM 供应商字符串”)导入凭据的功能,这简化了向虚拟机提供凭据并消除了需要第三方工具,例如cloud-init和ignition。
  • 在关闭期间,卸载虚拟文件系统(proc、sys)的逻辑已更改,有关阻止卸载文件系统的进程的信息将保存在日志中。
  • 系统调用过滤器(SystemCallFilter)默认允许访问 riscv_flush_icache 系统调用。
  • sd-boot 引导加载程序增加了在混合模式下引导的功能,其中 64 位 Linux 内核从 32 位 UEFI 固件运行。 添加了自动应用 ESP(EFI 系统分区)中文件中的 SecureBoot 密钥的实验功能。
  • bootctl 实用程序中添加了新选项:“—all-architectures”用于为所有受支持的 EFI 架构安装二进制文件,“—root=”和“—image=”用于处理目录或磁盘映像,“—install-source” =”用于定义安装源,“-efi-boot-option-description=”用于控制启动项名称。
  • “list-automounts”命令已添加到 systemctl 实用程序中,以显示自动安装的目录列表,并添加“--image=”选项来执行与指定磁盘映像相关的命令。 在“show”和“status”命令中添加了“--state=”和“--type=”选项。
  • systemd-networkd 添加了选项“TCPCongestionControlAlgorithm=”用于选择 TCP 拥塞控制算法,“KeepFileDescriptor=”用于保存 TUN/TAP 接口的文件描述符,“NetLabel=”用于设置 NetLabels,“RapidCommit=”用于通过 DHCPv6 加速配置(RFC 3315)。 “RouteTable=”参数允许指定路由表的名称。
  • systemd-nspawn 允许在“--bind=”和“--overlay=”选项中使用相对文件路径。 在“--bind=”选项中添加了对“rootidmap”参数的支持,以将容器中的root用户ID绑定到主机端挂载目录的所有者。
  • systemd-resolved 默认使用 OpenSSL 作为其加密后端(保留 gnutls 支持作为选项)。 不支持的 DNSSEC 算法现在被视为不安全,而不是返回错误 (SERVFAIL)。
  • systemd-sysusers、systemd-tmpfiles 和 systemd-sysctl 实现了通过凭证存储机制传输设置的功能。
  • 在 systemd-analyze 实用程序中添加了“compare-versions”命令,以将字符串与版本号进行比较(类似于“rpmdev-vercmp”和“dpkg --compare-versions”)。 在“systemd-analyze dump”命令中添加了按掩码过滤单元的功能。
  • 当选择多阶段睡眠模式(挂起-然后休眠)时,现在根据剩余电池寿命的预测来选择待机模式所花费的时间。 当电池剩余电量低于 5% 时,会立即转换到睡眠模式。
  • 'journalctl' 中添加了新的输出模式“-o Short-delta”,显示日志中不同消息之间的时间差。
  • systemd-repart 添加了对使用 Squashfs 文件系统创建分区和 dm-verity 分区的支持,包括数字签名。
  • 向 systemd-logind 添加了“StopIdleSessionSec=”设置,以在指定超时后结束非活动会话。
  • Systemd-cryptenroll 添加了一个“--unlock-key-file=”选项,用于从文件中提取解密密钥,而不是提示用户。
  • 现在可以在没有 udev 的环境中运行 systemd-growfs 实用程序。
  • systemd-backlight 改进了对具有多个显卡的系统的支持。
  • 文档中提供的代码示例的许可证已从 CC0 更改为 MIT-0。

破坏兼容性的更改:

  • 使用 ConditionKernelVersion 指令检查内核版本号时,现在在“=”和“!=”运算符中使用简单的字符串比较,如果根本未指定比较运算符,则可以使用 glob-mask 匹配来使用人物 '*', '?' 和 '[', ']'。 要比较 stverscmp() 样式版本,请使用“<”、“>”、“<=”和“>=”运算符。
  • 用于检查单元文件访问权限的 SELinux 标记现在在文件加载时读取,而不是在访问检查时读取。
  • 现在,“ConditionFirstBoot”条件仅在系统首次启动时直接在启动阶段触发,并在启动完成后调用单元时返回“false”。
  • 2024 年,systemd 计划停止支持 cgroup v1 资源限制机制,该机制在 systemd 版本 248 中已弃用。建议管理员在将基于 cgroup v2 的服务迁移到 cgroup v1 之前小心谨慎。 cgroups v2 和 v1 之间的主要区别在于,对所有类型的资源使用通用的 cgroups 层次结构,而不是使用单独的层次结构来分配 CPU 资源、调节内存消耗和 I/O。 单独的层次结构会导致组织处理程序之间交互的困难,并且在为不同层次结构中引用的进程应用规则时会导致额外的内核资源成本。
  • 在 2023 年下半年,我们计划结束对分割目录层次结构的支持,其中 /usr 与根目录分开安装,或者 /bin 和 /usr/bin、/lib 和 /usr/lib 分开。

来源: opennet.ru

添加评论