8.8. ランタイム監視のための Keylime のデプロイ

監視対象システムの状態が正しいことを確認するには、Keylime エージェントが監視対象システム上で実行されている必要があります。

重要

Keylime のランタイム監視は、Integrity Measurement Architecture (IMA) を使用して多数のファイルを測定するため、システムのパフォーマンスに重大な影響を与える可能性があります。

エージェントをプロビジョニングするときに、Keylime が監視対象システムに送信するファイルを定義することもできます。Keylime はエージェントに送信されたファイルを暗号化し、エージェントのシステムが TPM ポリシーと IMA 許可リストに準拠している場合にのみ復号化します。

Keylime の除外リストを設定することで、Keylime が特定のファイルまたは特定のディレクトリー内の変更を無視するようにできます。

RHEL 9.3 で提供される Keylime バージョン 7.3.0 以降、許可リストと除外リストは Keylime ランタイムポリシーに統合されます。

前提条件

手順

  1. Keylime エージェントが設定され実行されている監視対象システムで、システムの現在の状態から許可リストを生成します。

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

    <allowlist.txt> を許可リストのファイル名に置き換えます。

    重要

    SHA-256 ハッシュ関数を使用します。SHA-1 は安全ではなく、RHEL 9 で廃止されました。追加情報は、SHA-1 deprecation in Red Hat Enterprise Linux 9 を参照してください。

  2. 生成された許可リストを、keylime_tenant ユーティリティーが設定されているシステムにコピーします。次に例を示します。

    # scp <allowlist.txt> root@<tenant.ip>:/root/<allowlist.txt>
  3. オプション: Keylime の測定から除外するファイルまたはディレクトリーのリストを定義するには、テナントシステム上にファイルを作成し、除外するファイルとディレクトリーを入力します。除外リストでは、1 行に 1 つの Python 正規表現を使用できます。特殊文字の完全なリストについては、docs.python.org の Regular expression operations を参照してください。たとえば、/tmp/ ディレクトリー内のすべてのファイルと /var/ ディレクトリーの一部のサブディレクトリーを Keylime の測定から除外するには、次の内容を含む /root/<excludelist.txt> ファイルを作成します。

    /var/cache/.*
    /var/lock/.*
    /var/log/.*
    /var/run/.*
    /var/spool/.*
    /var/tmp/.*
    /tmp/.*

    除外リストをテナントシステムに保存します。

  4. 許可リストと除外リストを Keylime ランタイムポリシーに統合します。

    # keylime_create_policy -a <allowlist.txt> -e <excludelist.txt> -o <policy.json>
  5. Keylime テナントが設定されているシステムで、keylime_tenant ユーティリティーを使用してエージェントをプロビジョニングします。

    # keylime_tenant -c add -t <agent_ip> -u <agent_uuid> --runtime-policy <policy.json> --cert default
    • <agent_ip> は、エージェントの IP アドレスに置き換えます。
    • <agent_uuid> は、エージェントの UUID に置き換えます。
    • <policy.json> を Keylime ランタイムポリシーファイルへのパスに置き換えます。
    • --cert オプションを使用すると、テナントは、指定されたディレクトリーまたはデフォルトの /var/lib/keylime/ca/ ディレクトリーにある CA 証明書と鍵を使用して、エージェントの証明書を生成し、署名します。ディレクトリーに CA 証明書と鍵が含まれていない場合、テナントは /etc/keylime/ca.conf ファイルの設定に従ってそれらを自動的に生成し、指定されたディレクトリーに保存します。その後、テナントはこれらの鍵と証明書をエージェントに送信します。

      CA 証明書を生成するとき、またはエージェント証明書に署名するとき、次のメッセージが表示され、CA 秘密鍵にアクセスするためのパスワードの入力を求められる場合があります。Please enter the password to decrypt your keystore:

      証明書を使用したくない場合は、代わりに -f オプションを使用してファイルをエージェントに配信します。エージェントをプロビジョニングするには、空のファイルであっても、ファイルを送信する必要があります。

      注記

      Keylime はエージェントに送信されたファイルを暗号化し、エージェントのシステムが TPM ポリシーと IMA 許可リストに準拠している場合にのみ復号化します。デフォルトでは、Keylime は .zip ファイルを解凍します。

    たとえば、次のコマンドを使用すると、keylime_tenant は UUID d432fbb3-d2f1-4a97-9ef7-75bd81c00000 を持つ新しい Keylime エージェントを 127.0.0.1 にプロビジョニングし、policy.json というランタイムポリシーをロードします。また、デフォルトのディレクトリーに証明書を生成し、その証明書ファイルをエージェントに送信します。Keylime は、/etc/keylime/verifier.conf で設定された TPM ポリシーが満たされている場合にのみ、ファイルを復号化します。

    # keylime_tenant -c add -t 127.0.0.1 -u d432fbb3-d2f1-4a97-9ef7-75bd81c00000 --cert default --runtime-policy policy.json
    注記

    # keylime_tenant -c delete -u <agent_uuid> コマンドを使用して、Keylime によるノードの監視を停止できます。

    keylime_tenant -c update コマンドを使用して、すでに登録されているエージェントの設定を変更できます。

検証

  1. オプション: 検証の前に監視対象システムを再起動して、設定が永続的であることを確認します。
  2. エージェントのアテステーションが成功することを確認します。

    # keylime_tenant -c cvstatus -u <agent.uuid>
    ...
    {"<agent.uuid>": {"operational_state": "Get Quote"..."attestation_count": 5
    ...

    <agent.uuid> をエージェントの UUID に置き換えます。

    Operational_state の値が Get Quote で、attestation_count が 0 以外の場合、このエージェントのアテステーションは成功です。

    Operational_state の値が Invalid QuoteFailed の場合、アテステーションは失敗し、次のようなコマンド出力が表示されます。

    {"<agent.uuid>": {"operational_state": "Invalid Quote", ... "ima.validation.ima-ng.not_in_allowlist", "attestation_count": 5, "last_received_quote": 1684150329, "last_successful_attestation": 1684150327}}
  3. アテステーションが失敗した場合は、verifier ログで詳細を表示します。

    # journalctl -u keylime_verifier
    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

関連情報