Menu Close

Red Hat Training

A Red Hat training course is available for RHEL 8

11.7. 启用完整性测量架构和扩展验证模块

完整性测量架构 (IMA) 和扩展验证模块 (EVM) 属于内核完整性子系统,以各种方式增强系统安全性。下面的部分论述了如何启用和配置 IMA 和 EVM 来提高操作系统的安全性。

先决条件

  • 验证 securityfs 文件系统是否已挂载到 /sys/kernel/security/ 目录,并且存在 /sys/kernel/security/integrity/ima/ 目录。

    # mount
    …​
    securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
    …​
  • 验证 systemd 服务管理器是否已在引导时支持 IMA 和 EVM:

    # dmesg | grep -i -e EVM -e IMA
    [    0.000000] Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-167.el8.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet
    [    0.000000] kvm-clock: cpu 0, msr 23601001, primary cpu clock
    [    0.000000] Using crashkernel=auto, the size chosen is a best effort estimation.
    [    0.000000] Kernel command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-167.el8.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet
    [    0.911527] ima: No TPM chip found, activating TPM-bypass!
    [    0.911538] ima: Allocated hash algorithm: sha1
    [    0.911580] evm: Initialising EVM extended attributes:
    [    0.911581] evm: security.selinux
    [    0.911581] evm: security.ima
    [    0.911582] evm: security.capability
    [    0.911582] evm: HMAC attrs: 0x1
    [    1.715151] systemd[1]: systemd 239 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=legacy)
    [    3.824198] fbcon: qxldrmfb (fb0) is primary device
    [    4.673457] PM: Image not found (code -22)
    [    6.549966] systemd[1]: systemd 239 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=legacy)

流程

  1. 添加以下内核命令行参数:

    # grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="ima_policy=appraise_tcb ima_appraise=fix evm=fix"

    该命令在 fix 模式下为当前引导条目启用 IMA 和 EVM,并允许用户收集和更新 IMA 测量。

    ima_policy=appraise_tcb 内核命令行参数确保内核使用默认的可信计算基础 (TCB) 测量策略和实例步骤。禁止访问文件,因为之前和当前测量结果不匹配。

  2. 重启以使更改生效。
  3. (可选)验证参数是否已添加到内核命令行中:

    # cat /proc/cmdline
    BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-167.el8.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet ima_policy=appraise_tcb ima_appraise=fix evm=fix
  4. 创建一个内核主密钥来保护 EVM 密钥:

    # keyctl add user kmk "$(dd if=/dev/urandom bs=1 count=32 2> /dev/null)" @u
    748544121

    内核主密钥 (kmk) 完全保留在内核空间内存中。内核主密钥 kmk 的 32 字节长值是从 /dev/urandom 文件中随机字节生成的,并放置在用户 (@u) 密钥环中。密钥序列号是位于前面输出的第二行。

  5. 根据 kmk 密钥创建一个加密的 EVM 密钥:

    # keyctl add encrypted evm-key "new user:kmk 64" @u
    641780271

    命令使用 kmk 生成并加密 64 字节长用户密钥(名为 evm-key)并将其放置在用户 (@u) 密钥环中。密钥序列号是位于前面输出的第二行。

    重要

    用户密钥必须命名为 evm-key,因为它是 EVM 子系统预期使用的且正在使用的名称。

  6. 为导出的密钥创建一个目录:

    # mkdir -p /etc/keys/
  7. 搜索 kmk 键并将其值导出到文件中:

    # keyctl pipe $(keyctl search @u user kmk) > /etc/keys/kmk

    命令将内核主密钥 (kmk) 的未加密值放在之前定义的位置 (/etc/keys/) 的文件中。

  8. 搜索 evm-key 用户密钥并将其值导出到文件中:

    # keyctl pipe $(keyctl search @u encrypted evm-key) > /etc/keys/evm-key

    命令将用户 evm-key 密钥的加密值放在任意位置的文件中。evm-key 已在早期由内核主密钥加密。

  9. 另外,还可查看新创建的密钥:

    # keyctl show
    Session Keyring
    974575405   --alswrv     0        0      keyring: _ses
    299489774   --alswrv     0    65534       \_ keyring: _uid.0
    748544121   --alswrv     0        0           \_ user: kmk
    641780271   --alswrv     0        0           \_ encrypted: evm-key

    您应该可以看到类似的输出。

  10. 激活 EVM:

    # echo 1 > /sys/kernel/security/evm
  11. (可选)验证 EVM 是否已初始化:

    # dmesg | tail -1
    […​] evm: key initialized