9.4. 部署对运行时监控的 Keylime

警告

目前,对访问由 Integrity 测量架构(IMA)计算的多个文件的系统测试可能会失败。如需更多信息,请参阅 RHBZ#2138167

要验证受监控系统的初始状态是否正确,主要精简代理必须在被监控的系统上运行,且您必须提供一个允许列表进行精简。当您置备新代理时,Readlime 会检查系统中的文件是否与您在 allowlist 中定义的状态相符,并持续监控文件。

重要

为确保最大化安全性,请在完全加密后创建 allowlist,而 air-gapped 计算机永久与互联网隔离。为了防止在将允许列表传输到其他系统时进行篡改,请禁用所有网卡并签署允许列表哈希。

您可以使用 Keylime 脚本从 initramfs 生成 allowlist,但您也可以为应用程序文件或管理员脚本生成哈希值,它们将在远程监控系统上运行,并在 allowlist 文件中手动输入它们。

注意

由于 Keylime 运行时监控使用完整性测量架构 (IMA) 来测量大量文件,因此可能会对系统性能产生显著影响。

在置备代理时,您还可以定义 Keylime 发送到被监控系统的文件。Keylime 对发送到代理的文件进行加密,只有在代理系统符合 TPM 策略和 IMA allowlist 时,解密它。

要忽略特定文件或特定目录中的更改,请配置 Keylime excludes 列表。

默认情况下,Keylime 代理将其所有数据保存在被监控系统的 /var/lib/keylime/ 目录中。

注意

要将配置文件保留在置入目录中,请使用具有两位数字前缀的文件名,例如 /etc/keylime/agent.conf.d/00-registrar-ip.conf。配置处理以字典顺序读取置入目录中的文件,并将每个选项设置为它读取的最后一个值。

前提条件

流程

  1. 在要监控的系统中安装 Keylime 代理:

    # dnf install keylime-agent

    这个命令会安装 keylime-agent-rust 软件包。

  2. 通过在 /etc/ima/ima-policy 文件中输入以下内容来创建新的 IMA 策略:

    # PROC_SUPER_MAGIC
    dont_measure fsmagic=0x9fa0
    # SYSFS_MAGIC
    dont_measure fsmagic=0x62656572
    # DEBUGFS_MAGIC
    dont_measure fsmagic=0x64626720
    # TMPFS_MAGIC
    dont_measure fsmagic=0x01021994
    # RAMFS_MAGIC
    dont_measure fsmagic=0x858458f6
    # SECURITYFS_MAGIC
    dont_measure fsmagic=0x73636673
    # SELINUX_MAGIC
    dont_measure fsmagic=0xf97cff8c
    # CGROUP_SUPER_MAGIC
    dont_measure fsmagic=0x27e0eb
    # OVERLAYFS_MAGIC
    dont_measure fsmagic=0x794c7630
    # Don't measure log, audit or tmp files
    dont_measure obj_type=var_log_t
    dont_measure obj_type=auditd_log_t
    dont_measure obj_type=tmp_t
    # MEASUREMENTS
    measure func=BPRM_CHECK
    measure func=FILE_MMAP mask=MAY_EXEC
    measure func=MODULE_CHECK uid=0
  3. 使用新的 IMA 策略替换默认的 IMA 策略:

    # cat /etc/ima/ima-policy > /sys/kernel/security/ima/policy
  4. 重启系统以应用新的 IMA 策略。
  5. 从系统当前状态生成 allowlist:

    # /usr/share/keylime/scripts/create_allowlist.sh -o <allowlist.txt> -h sha256sum

    <allowlist.txt> 替换为 allowlist 的文件名。

    重要

    使用 SHA-256 哈希功能。SHA-1 不安全,在 RHEL 9 中已弃用。如需更多信息,请参阅 Red Hat Enterprise Linux 9 中的 SHA-1 弃用

  6. 在配置文件中定义注册的 IP 地址和端口。在 /etc/keylime/agent.conf.d/ 目录中创建一个新的 .conf 文件,例如: /etc/keylime/agent.conf.d/00-registrar-ip.conf,其内容如下:

    [agent]
    
    registrar_ip = "<registrar_IP_address>"
    • <registrar_IP_address> 替换为 registrar 的 IP 地址。
    • 另外,您还可以使用 registrar_port = <registrar_port> 选项修改 registrar 的默认端口 8890

      注意

      由于 Keylime 代理配置使用 TOML 格式,它与用于配置其他组件的 INI 格式不同,所以 IP 地址必须处于引号中。

  7. 可选:加载代理的现有密钥和证书。如果代理没有接收 server_keyserver_cert,它会生成自己的密钥和自签名证书。代理接受以下密钥和证书:

    • server_key (可选l)
    • server_cert (可选)
    • trusted_client_ca

      • 验证客户端 CA 证书的路径
      • 租户客户端 CA 证书的路径

    在配置中定义密钥和证书的位置。在 /etc/keylime/agent.conf.d/ 目录中创建一个新的 .conf 文件,例如: /etc/keylime/agent.conf.d/00-keys-and-certs.conf,其内容如下:

    [agent]
    server_key = </path/to/server_key>
    server_key_password = <passphrase1>
    server_cert = </path/to/server_cert>
    trusted_client_ca = ['</path/to/ca/cert1>', '</path/to/ca/cert2>']
    enc_keyname = </path/to/derived_cti_key>
    注意

    使用绝对路径定义密钥和证书位置。Keylime 代理不接受相对路径。

  8. 可选:您可以通过创建名为如 <excludelist> 的文件,并输入要排除的文件和目录,定义不包括在 Keylime measurements 中的文件或目录列表。排除列表接受 Python 正则表达式。有关更多信息,请参阅 docs.python.org 中的正则表达式操作。例如,要排除 /tmp/ 目录中的所有文件,请输入:

    /tmp/.*
  9. 使用 keylime_tenant 实用程序调配新代理。您可以从连接到网络的任何系统中置备代理,并提供正确的密钥和证书:

    $ keylime_tenant -c add -t <agent.ip> -v _<verifier.ip> -u _<agent.uuid> --allowlist _<allowlist.txt> --exclude <excludelist> -f _<filetosend>
    • <agent.ip> 替换为代理的 IP 地址。
    • <verifier.ip> 替换为 verifier 的 IP 地址。
    • <agent.uuid> 替换为代理的 UUID。
    • <allowlist.txt> 替换为 allowlist 文件的路径。
    • 使用到排除列表的路径替换 <excludelist>--exclude 选项是可选的;在没有提供文件的情况下,代理也可以运行。
    • <filetosend> 替换为要传送到代理的文件的路径。f 选项是可选的;配置代理也可以没有提供文件。
    注意

    Keylime 对发送到代理的文件进行加密,只有在代理系统符合 TPM 策略和 IMA allowlist 时,解密它。默认情况下,Keylime 解压缩 .zip 文件。您还可以使用 payload_script = "autorun.sh" 选项指定在文件解密后运行的脚本。

    例如,使用以下命令,lime_tenant127.0.0.1 中置备一个新的 Keylime 代理,其带有 UUID d432fbb3-d2f1-4a97-9ef7-75bd81c00000,将它连接到位于 127.0.0.2 的 verifier,并加载一个名为 allowlist1.txt 的允许列表。它还会加密名为 payload1 的文件,并将其发送到代理。只有满足 /etc/keylime/verifier.conf 中的 TPM 策略才对文件进行解密:

    $ keylime_tenant -c add -t 127.0.0.1 -v 127.0.0.2 -u d432fbb3-d2f1-4a97-9ef7-75bd81c00000 -f payload1 --allowlist allowlist1.txt
  10. 启动 keylime_agent 服务:

    $ systemctl start keylime_agent
    注意

    您可以使用网络中的任何系统以及正确的密钥和证书来停止对节点进行 Keylime:

    $ keylime_tenant -c delete -t <agent.ip> -u <agent.uuid>

验证

  1. 创建一个名为 的新文件,如 bad-script.sh,并插入以下内容来执行允许列表不允许执行的操作:

    #!/bin/sh
    
    echo -e "Hello Evil!"
  2. 使脚本可执行:

    # chmod +x bad-script.sh
  3. 尝试运行脚本。如果正确配置了允许列表,则此代理的 Keylime attestation 会失败并显示类似的输出:

    # ./bad-script.sh
    keylime.tpm - INFO - Checking IMA measurement list...
    keylime.ima - WARNING - File not found in allowlist: /root/bad-script.sh
    keylime.ima - ERROR - IMA ERRORS: template-hash 0 fnf 1 hash 0 good 781
    keylime.cloudverifier - WARNING - agent D432FBB3-D2F1-4A97-9EF7-75BD81C00000 failed, stopping polling

其他资源