8.3. 測定されたブート設定証明のための Keylime のデプロイ

警告

現在、Keylime は、Integrity Measurement Architecture (IMA) によって測定された複数のファイルにすばやく連続してアクセスするシステムの認証に失敗する可能性があります。詳細は、RHBZ#2138167 を参照してください。

測定されたブート設定証明の場合は、監視対象システムで Keylime エージェントが実行されている必要があります。keylime_tenant ユーティリティーを使用して、Keylime エージェントをリモートでプロビジョニングできます。

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

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

デフォルトでは、Keylime エージェントはすべてのデータを監視対象システムの /var/lib/keylime/ ディレクトリーに保存します。

注記

設定ファイルをドロップインディレクトリー内で整理するには、/etc/keylime/agent.conf.d/00-registrar-ip.conf のように、2 桁の数字の接頭辞を付けたファイル名を使用します。設定処理は、ドロップインディレクトリー内のファイルを辞書順で読み取り、各オプションを最後に読み取った値に設定します。

前提条件

  • Keylime verifier と registrar へのネットワークアクセス。詳細は、「Keylim verifier と registrar の設定」 を参照してください。
  • Keylim コンポーネントをインストールするシステムに対する管理者権限
  • システム上の TPM チップ

    • tpm2_pcrread コマンドを入力して、システムに TPM があることを確認できます。このコマンドの出力に複数のハッシュが表示される場合は、TPM があります。
  • エージェントシステムで有効になっている整合性測定アーキテクチャー (IMA)。詳細は、整合性測定アーキテクチャーと拡張検証モジュールの有効化 を参照してください。

手順

  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 エージェントの設定は、他のコンポーネントの設定に使用される INI 形式とは異なる TOML 形式を使用するため、IP アドレスは引用符で囲む必要があります。

  3. オプション:エージェントの既存の鍵と証明書をロードします。エージェントが server_keyserver_cert を受信しない場合、エージェントは独自のキーと自己署名証明書を生成します。エージェントは、次のキーと証明書を受け入れます。

    • server_key (オプション)
    • server_cert (オプション)
    • trusted_client_ca

      • verifier クライアント 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>
    注記

    絶対パスを使用して、キーと証明書の場所を定義します。Keylim エージェントは相対パスを受け入れません。

  4. システムの現在の状態の測定されたブートログからポリシーを生成します。

    注意

    一部のシナリオでは、Keylime 測定ブートポリシー生成スクリプトがセグメンテーションエラーとコアダンプを引き起こす可能性があります。詳細は、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 測定から除外するファイルとディレクトリーのリストを定義するには、<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 許可リストに準拠している場合にのみ復号化します。デフォルトでは、Keylime は .zip ファイルを解凍します。また、payload_script = "autorun.sh" オプションを使用して、ファイルが復号化された後に実行するスクリプトを指定することもできます。

    例として、次のコマンドを使用すると、keylime_tenant127.0.0.1 で UUID d432fbb3-d2f1-4a97-9ef7-75bd81c00000 で新しい Keylime エージェントをプロビジョニングし、それを 127.0.0.2 で verifier に接続します。また、payload1 という名前のファイルを暗号化し、エージェントに送信します。Keylime は、エージェントのシステムが TPM ポリシーと IMA 許可リストに準拠している場合にのみ、ファイルを復号します。

    $ 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/ ディレクトリーの設定スニペットで registrar の 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}}

    verifier と agent が正しく設定されている場合、出力には正しいエージェント 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"}}}

    registrar と agent が正しく設定されている場合、出力にはエージェントの IP アドレスとポートが表示され、その後に "operational_state":"Registered" が表示されます。

関連情報

  • keylime_tenant ユーティリティーの追加の詳細オプションは、keylime_tenant -h コマンドを入力します。