9.3. 在测试时为测量的引导部署主精简

警告

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

为了在测试时测量的引导,必须在被监控的系统上运行 Keylime 代理。您可以使用 keylime_tenant 程序远程置备 Keylime 代理。

在置备代理时,您还可以定义 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. 在配置文件中定义注册的 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 地址必须处于引号中。

  3. 可选:加载代理的现有密钥和证书。如果代理没有接收 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 代理不接受相对路径。

  4. 从系统当前状态的衡量引导日志生成策略:

    小心

    在某些情况下,测量的引导策略生成脚本可能会导致分段故障和内核转储。如需更多信息,请参阅 RHBZ#2140670

    $ /usr/share/keylime/scripts/create_mb_refstate /sys/kernel/security/tpm0/binary_bios_measurements <./measured_boot_reference_state.json>

    <./measured_boot_reference_state.json> 替换为保存所生成的策略的路径。

    重要

    使用 create_mb_refstate 脚本生成的策略基于系统的当前状态,非常严格。任何系统修改,包括内核更新和系统更新都会更改引导过程,系统就会失败。

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

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

    $ keylime_tenant -c add -t <agent.ip> -v <verifier.ip> -u <agent-uuid> --mb_refstate <./measured_boot_reference_state.json> --exclude <excludelist> -f <filetosend>
    • <agent.ip> 替换为代理的 IP 地址。
    • <verifier.ip> 替换为 verifier 的 IP 地址。
    • <agent-uuid> 替换为代理的 UUID。
    • <./measured_boot_reference_state.json> 替换为计算引导策略的路径。
    • 使用到排除列表的路径替换 <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 的验证器。它还会加密名为 payload1 的文件,并将其发送到代理。只有在代理系统与 TPM 策略和 IMA allowlist 满足时才解密文件:

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

    $ systemctl start keylime_agent
    注意

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

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

验证

  1. 列出使用 registrar 注册的所有代理的 UUID:

    $ keylime_tenant -c reglist -r <registrar_IP_address> -rp <registrar_port>
    2022-10-07 13:52:54.388 - keylime.tenant - INFO - From registrar 127.0.0.1 port 8891 retrieved {"code": 200, "status": "Success", "results": {"uuids": ["d432fbb3-d2f1-4a97-9ef7-75bd81c00000"]}}
    • <registrar_IP_address> 替换为 registrar 的 IP 地址。
    • 另外,您还可以使用 registrar_port = <registrar_port> 选项修改 registrar 的默认端口 8891
    注意

    如果需要重复列出代理,您可以在 /etc/keylime/tenant.conf.d/ 目录中的配置代码段中定义注册的 IP 地址和端口。然后,您可以输入不带 -r-rp 选项的命令。

  2. 检查 verifier 的状态:

    $ keylime_tenant -c cvstatus
    Reading configuration from ['/etc/keylime/logging.conf']
    ...
    {"d432fbb3-d2f1-4a97-9ef7-75bd81c00000": {"operational_state": "Get Quote", "v": "rMUdRQtojhtoufQGLS5mur9yrH7ZDhivxAVihhMlLTc=", "ip": "127.0.0.1", "port": 9002, "tpm_policy": "{\"mask\": \"0x0\"}", "meta_data": "{\"cert_serial\": 2, \"subject\": \"OU=53,O=MITLL,L=Lexington,ST=MA,CN=d432fbb3-d2f1-4a97-9ef7-75bd81c00000,C=US\"}", "allowlist_len": 6, "mb_refstate_len": 0, "accept_tpm_hash_algs": ["sha512", "sha384", "sha256", "sha1"], "accept_tpm_encryption_algs": ["ecc", "rsa"], "accept_tpm_signing_algs": ["ecschnorr", "rsassa"], "hash_alg": "sha256", "enc_alg": "rsa", "sign_alg": "rsassa", "verifier_id": "default", "verifier_ip": "127.0.0.1", "verifier_port": 8881, "severity_level": null, "last_event_id": null, "attestation_count": 7, "last_received_quote": 1665753341}}

    如果正确配置了验证器和代理,输出会显示正确的代理 UUID,后跟 {"operational_state":"get Quote"

  3. 检查 registrar 的状态。

    $ keylime_tenant -c regstatus
    Reading configuration from ['/etc/keylime/logging.conf']
    ...
    ==\n-----END CERTIFICATE-----\n", "ip": "127.0.0.1", "port": 9002, "regcount": 1, "operational_state": "Registered"}}}

    如果正确配置了注册商和代理,输出会显示代理的 IP 地址和端口,后跟 "operational_state":"Registered"

其他资源

  • 对于 keylime_tenant 工具程序的额外高级选项,请输入 keylime_tenant -h 命令。