Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

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

完整性测量架构(IMA)和扩展验证模块(EVM)是内核完整性子系统的组成部分,以各种方式增强系统安全性。配置 IMA 和 EVM 可让您签署文件,从而增强系统的安全性。

先决条件

  • The ima-evm-utilskeyutils 软件包安装在您的系统上。
  • securityfs 文件系统挂载到 /sys/kernel/security/ 目录。
  • 存在 /sys/kernel/security/ima/ 目录。

    # mount
    …​
    securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
    …​

流程

  1. 准备您的系统以启用 IMA 和 EVM:

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

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

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

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

    2. 重启以使更改生效。
    3. (可选)验证内核命令行是否包含新参数:

      # cat /proc/cmdline
      BOOT_IMAGE=/vmlinuz-3.10.0-1136.el7.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto spectre_v2=retpoline rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet LANG=en_US.UTF-8 ima_appraise=fix ima_appraise_tcb evm=fix
  2. 为 EVM 创建并设置公共和私有密钥对:

    1. 为 EVM 创建新密钥环:

      # evm_kr_id=$(keyctl newring _evm @u)

      命令创建 _evm 密钥环,并将它连接到 @u 系统用户密钥环。然后,_ evm 的密钥环 ID 分配给 evm_kr_id 变量,以便更轻松地处理。

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

      # keyctl show
      Session Keyring
      1025767139 --alswrv   0     0  keyring: _ses
      548660789 --alswrv   0 65534   \_ keyring: _uid.0
      456142548 --alswrv   0     0       \_ keyring: _evm
    3. 为密钥创建一个目录:

      # mkdir -p /etc/keys/
    4. /etc/keys/privkey.pem 文件中生成 1024 位 RSA 私钥:

      # openssl genrsa -out /etc/keys/privkey.pem 1024
      Generating RSA private key, 1024 bit long modulus
      .......++++++
      ...++++++
      e is 65537 (0x10001)
    5. 使用之前创建的 /etc/keys/privkey.pem 私钥,将对应的 RSA 公钥派生到 /etc/keys/pubkey.pem 文件中:

      # openssl rsa -pubout -in /etc/keys/privkey.pem -out /etc/keys/pubkey.pem
      writing RSA key
    6. 将公钥导入到专用的 EVM 密钥环中:

      # evmctl import --rsa /etc/keys/pubkey.pem $evm_kr_id
      1054989579

      命令将 /etc/keys/pubkey.pem 公钥导入到 _evm 密钥环中。然后,_evm 密钥环附加到内核密钥环。密钥序列号位于上例的第二行。

    7. 另外,还可查看新导入的密钥:

      # keyctl show
      Session Keyring
      1025767139 --alswrv   0     0  keyring: _ses
      548660789 --alswrv   0 65534   \_ keyring: _uid.0
      456142548 --alswrv   0     0       \_ keyring: _evm
      1054989579 --alswrv   0     0           \_ user: FA0EF80BF06F80AC
      注意

      此非对称密钥对可用于使用 evmctl 符号 命令以数字方式签署文件的扩展属性的内容。扩展属性稍后由内核验证。

    8. 创建一个内核主密钥来保护 EVM 密钥:

      # dd if=/dev/urandom bs=1 count=32 2>/dev/null | keyctl padd user kmk-user @u

      内核主密钥(kmk)完全保留在内核空间内存中。内核主密钥 kmk 的 32 字节长值是从 /dev/urandom 文件中随机字节生成的,并放置在用户(@u)密钥环中。

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

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

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

    重要

    必须为用户密钥 evm-key 命名,因为这是 EVM 子系统预期并可使用的名称。

  4. 激活 EVM:

    # echo 1 > /sys/kernel/security/evm
  5. 验证 EVM 是否已初始化:

    dmesg | tail -1
    […​] EVM: initialized