Linux systemd安全启动

在 Linux 系统中,systemd 作为现代初始化系统,其启动过程的安全性与 UEFI Secure Bootsystemd 自身的安全配置密切相关。以下是关于安全启动和 systemd 安全增强的详细指南:


一、UEFI Secure Boot 基础

Secure Boot 是 UEFI 固件的安全特性,确保只有经过签名的引导加载程序、内核和内核模块被加载。若系统启用 Secure Boot,需确保以下组件被正确签名:

  1. 引导加载程序(如 GRUB、systemd-boot)
  2. Linux 内核vmlinuz
  3. 内核模块(如驱动模块)
  4. UEFI 应用(如 shim

二、配置 Secure Boot 的步骤

1. 检查 Secure Boot 状态

1
2
3
mokutil --sb-state
# 或
dmesg | grep -i secure

输出 Secure boot enabled 表示已启用。

2. 使用发行版预签名组件

大多数主流发行版(Ubuntu、Fedora 等)已提供签名的内核和引导加载程序:

  • Ubuntu: 依赖 shim-signedgrub-efi-amd64-signed 包。
  • Fedora: 默认支持 Secure Boot。

3. 自定义内核或模块的签名

若需自行编译内核或模块,需手动签名:

生成密钥对

1
2
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
openssl x509 -outform DER -in cert.pem -out cert.der

签名内核

1
sbsign --key key.pem --cert cert.pem --output vmlinuz-signed vmlinuz

签名内核模块

1
2
3
4
5
# 安装签名工具
sudo apt-get install kmod

# 签名模块
kmodsign sha512 key.pem cert.pem /path/to/module.ko

4. 注册自定义密钥到 UEFI

  1. cert.der 复制到 FAT 格式的 USB 设备。
  2. 进入 UEFI 固件设置界面,选择 Enroll Key 或类似选项。
  3. 导入 cert.der 到数据库(db)。

三、systemd 启动过程的安全增强

1. 限制服务的权限

systemd 服务单元文件(.service)中,通过以下选项增强安全性:

1
2
3
4
5
6
[Service]
PrivateTmp=yes
ProtectSystem=full
NoNewPrivileges=yes
RestrictSUIDSGID=yes
CapabilityBoundingSet=CAP_NET_BIND_SERVICE

2. 启用沙盒功能

1
2
3
4
5
6
[Service]
ProtectHome=read-only
ProtectKernelTunables=yes
ProtectControlGroups=yes
RestrictAddressFamilies=AF_INET AF_INET6
SystemCallFilter=@system-service

3. 防止服务被篡改

  • 使用 systemctl edit <service> 覆盖服务配置时,检查完整性。
  • 通过 systemd-analyze security <service> 分析服务的安全性评分。

四、Secure Boot 常见问题解决

1. 系统启动失败(显示 “Invalid Signature”)

  • 原因:组件未正确签名或密钥未注册。
  • 解决
    1. 禁用 Secure Boot 临时启动系统。
      2 检查签名工具命令(如 sbsign)是否正确。
      3 重新注册密钥到 UEFI。

2. 内核模块加载失败

  • 原因:模块未签名或签名不匹配。
  • 解决
    1
    2
    sudo modprobe -v <module>  # 查看详细错误
    sudo kmodsign sha512 key.pem cert.pem /path/to/module.ko

3. 更新后 Secure Boot 失效

  • 原因:内核或引导加载程序更新后未重新签名。
  • 解决:配置自动签名脚本(如 DKMS 钩子)。

五、推荐工具

  • sbsigntools: 签名 EFI 二进制文件。
  • efitools: 管理 UEFI 密钥。
  • mokutil: 修改 Secure Boot 设置。

六、注意事项

  1. 备份数据:操作前备份重要数据。
  2. 测试环境:建议在虚拟机中测试 Secure Boot 配置。
  3. 发行版文档:参考特定发行版的 Secure Boot 指南(如 Ubuntu Secure Boot)。

通过结合 UEFI Secure Boot 和 systemd 的安全配置,可显著提升 Linux 系统的启动安全性。