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

警告

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

監視対象システムの初期状態が正しいことを確認するには、監視対象システムで Keylime エージェントが実行している必要があり、Keylime に許可リストを提供する必要があります。新しいエージェントをプロビジョニングすると、Keylime は、システム上のファイルが許可リストで定義した状態に対応しているかどうかを確認し、ファイルを継続的に監視します。

重要

最大限のセキュリティーを確保するには、完全に暗号化され、インターネットから永久に隔離されたエアギャップされたコンピューターで許可リストを作成します。許可リストを他のシステムに転送する際の改ざんを防ぐには、すべてのネットワークカードを無効にし、許可リストハッシュに署名します。

Keylime スクリプトを使用して initramfs から許可リストを生成できますが、リモートで監視されているシステムで実行していアプリケーションファイルまたは管理スクリプトのハッシュを生成し、許可リストファイルに手動で入力することもできます。

注記

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

エージェントをプロビジョニングするときに、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. /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. システムの現在の状態から許可リストを生成します。

    # /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 を参照してください。

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

  7. オプション:エージェントの既存の鍵と証明書をロードします。エージェントが 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 エージェントは相対パスを受け入れません。

  8. オプション:<excludelist> などの名前のファイルを作成し、除外するファイルとディレクトリーを入力することで、Keylime 測定から除外するファイルまたはディレクトリーのリストを定義できます。除外リストは、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> を許可リストファイルへのパスに置き換えます。
    • <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 に接続して、allowlist1.txt という名前の許可リストを読み込みます。また、payload1 という名前のファイルを暗号化し、エージェントに送信します。Keylime は、/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 設定証明は失敗し、同様の出力が表示されます。

    # ./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

関連情報