搜索

22.5. 启用 IMA 和 EVM

download PDF

您可以启用并配置完整性测量架构(IMA)和扩展验证模块(EVM)以提高操作系统的安全性。

重要

始终将 EVM 与 IMA 一起启用。

虽然您可以单独启用 EVM,但 EVM 评估仅由 IMA 评估规则触发。因此,EVM 不保护文件元数据,如 SELinux 属性。如果文件元数据线下被篡改了,EVMVM 只防止文件元数据被更改。它不阻止文件访问,如执行文件。

先决条件

  • 安全引导被临时禁用。

    注意

    启用安全引导后,ima_appraise=fix 内核命令行参数无法正常工作。

  • securityfs 文件系统挂载到 /sys/kernel/security/ 目录,并且 /sys/kernel/security/integrity/ima/ 目录存在。您可以使用 mount 命令验证 securityfs 挂载的位置:

    # mount
    ...
    securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
    ...
  • systemd 服务管理器打了补丁,以在引导时支持 IMA 和 EVM。使用以下命令验证:

    # grep <options> pattern <files>

    例如:

    # dmesg | grep -i -e EVM -e IMA -w
    [ 0.943873] ima: No TPM chip found, activating TPM-bypass!
    [ 0.944566] ima: Allocated hash algorithm: sha256
    [ 0.944579] ima: No architecture policies found
    [ 0.944601] evm: Initialising EVM extended attributes:
    [ 0.944602] evm: security.selinux
    [ 0.944604] evm: security.SMACK64 (disabled)
    [ 0.944605] evm: security.SMACK64EXEC (disabled)
    [ 0.944607] evm: security.SMACK64TRANSMUTE (disabled)
    [ 0.944608] evm: security.SMACK64MMAP (disabled)
    [ 0.944609] evm: security.apparmor (disabled)
    [ 0.944611] evm: security.ima
    [ 0.944612] evm: security.capability
    [ 0.944613] evm: HMAC attrs: 0x1
    [ 1.314520] systemd[1]: systemd 252-18.el9 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS -FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY +P11KIT -QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
    [ 1.717675] device-mapper: core: CONFIG_IMA_DISABLE_HTABLE is disabled. Duplicate IMA measurements will not be recorded in the IMA log.
    [ 4.799436] systemd[1]: systemd 252-18.el9 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS -FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY +P11KIT -QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)

流程

  1. 修复 模式下为当前引导条目启用 IMA 和 EVM,并通过添加以下内核命令行参数来允许用户收集和更新 IMA 测量:

    # 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-5.14.0-1.el9.x86_64 root=/dev/mapper/rhel-root ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M 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
  8. 搜索 evm-key ,并将其加密值导出到新目录中。

    # keyctl pipe $(keyctl search @u encrypted evm-key) > /etc/keys/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
    
    # ls -l /etc/keys/
    total 8
    -rw-r--r--. 1 root root 246 Jun 24 12:44 evm-key
    -rw-r--r--. 1 root root  32 Jun 24 12:43 kmk
  10. 可选:如果密钥已从密钥环中删除,例如在系统重启后,您可以导入已导出的 kmkevm-key,而不是创建新密钥。

    1. 导入 kmk

      # keyctl add user kmk "$(cat /etc/keys/kmk)" @u
      451342217
    2. 导入 evm-key

      # keyctl add encrypted evm-key "load $(cat /etc/keys/evm-key)" @u
      924537557
  11. 激活 EVM。

    # echo 1 > /sys/kernel/security/evm
  12. 重新标记整个系统。

    # find / -fstype xfs -type f -uid 0 -exec head -n 1 '{}' >/dev/null \;
    警告

    在不重新标记系统的情况下启用 IMA 和 EVM 可能会导致系统上的大多数文件无法访问。

验证

  • 验证 EVM 是否已初始化。

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

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.