7.10. ランタイム監視用に Keylime を設定する
監視対象システムの状態が正しいことを確認するには、Keylime エージェントが監視対象システム上で実行されている必要があります。
Keylime のランタイム監視は、Integrity Measurement Architecture (IMA) を使用して多数のファイルを測定するため、システムのパフォーマンスに重大な影響を与える可能性があります。
エージェントをプロビジョニングするときに、Keylime が監視対象システムに送信するファイルを定義することもできます。Keylime はエージェントに送信されたファイルを暗号化し、エージェントのシステムが TPM ポリシーと IMA 許可リストに準拠している場合にのみ復号化します。
Keylime の除外リストを設定することで、Keylime が特定のファイルまたは特定のディレクトリー内の変更を無視するようにできます。ファイルを除外しても、そのファイルは引き続き IMA によって測定されます。
RHEL 9.3 で提供される Keylime バージョン 7.3.0 以降、許可リストと除外リストは Keylime ランタイムポリシーに統合されます。
前提条件
Keylime コンポーネントが設定されているシステムへのネットワークアクセスがある。
- verifier
- 詳細は、「パッケージから Keylime verifier をデプロイする」 を参照してください。
- registrar
- 詳細は、「パッケージから Keylime registrar をデプロイする」 を参照してください。
- テナント
- 詳細は、「パッケージから Keylime テナントをデプロイする」 を参照してください。
- エージェント
- 詳細は、「パッケージから Keylime エージェントをデプロイする」 を参照してください。
手順
Keylime エージェントが設定され実行されている監視対象システムに、
keylime-policy
ツールを含むpython3-keylime
パッケージをインストールします。dnf -y install python3-keylime
# dnf -y install python3-keylime
Copy to Clipboard Copied! Toggle word wrap Toggle overflow エージェントシステムの現在の状態からランタイムポリシーを作成します。
keylime-policy create runtime --ima-measurement --rootfs '/' --ramdisk-dir '/boot/' --output <policy.json>
# keylime-policy create runtime --ima-measurement --rootfs '/' --ramdisk-dir '/boot/' --output <policy.json>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドの詳細は次のとおりです。
-
<policy.json>
はランタイムポリシーのファイル名に置き換えます。 次のディレクトリーは測定から自動的に除外されます。
-
/sys
-
/run
-
/proc
-
/lost+found
-
/dev
-
/media
-
/snap
-
/mnt
-
/var
-
/tmp
-
-
必要に応じて、
--excludelist <excludelist.txt>
オプションを追加して、追加の特定のパスを測定から除外することもできます。除外リストでは、1 行に 1 つの Python 正規表現を使用できます。特殊文字の完全なリストは、docs.python.org の Regular expression operations を参照してください。
-
生成されたランタイムポリシーを、
keylime_tenant
ユーティリティーが設定されているシステムにコピーします。次に例を示します。scp <policy.json> root@<tenant.ip>:/root/<policy.json>
# scp <policy.json> root@<tenant.ip>:/root/<policy.json>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Keylime テナントが設定されているシステムで、
keylime_tenant
ユーティリティーを使用してエージェントをプロビジョニングします。keylime_tenant --command add --targethost <agent_ip> --uuid <agent_uuid> --runtime-policy <policy.json> --cert default
# keylime_tenant --command add --targethost <agent_ip> --uuid <agent_uuid> --runtime-policy <policy.json> --cert default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
<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:
) 場合があります。注記Keylime はエージェントに送信されたファイルを暗号化し、エージェントのシステムが TPM ポリシーと IMA 許可リストに準拠している場合にのみ復号化します。デフォルトでは、Keylime は送信された
.zip
ファイルを展開します。
たとえば、次のコマンドを使用すると、
keylime_tenant
は UUIDd432fbb3-d2f1-4a97-9ef7-75bd81c00000
を持つ新しい Keylime エージェントを127.0.0.1
にプロビジョニングし、policy.json
というランタイムポリシーをロードします。また、デフォルトのディレクトリーに証明書を生成し、その証明書ファイルをエージェントに送信します。Keylime は、/etc/keylime/verifier.conf
で設定された TPM ポリシーが満たされている場合にのみ、ファイルを復号化します。keylime_tenant --command add --targethost 127.0.0.1 --uuid d432fbb3-d2f1-4a97-9ef7-75bd81c00000 --runtime-policy policy.json --cert default
# keylime_tenant --command add --targethost 127.0.0.1 --uuid d432fbb3-d2f1-4a97-9ef7-75bd81c00000 --runtime-policy policy.json --cert default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記# keylime_tenant --command delete --uuid <agent_uuid>
コマンドを使用して、Keylime によるノードの監視を停止できます。keylime_tenant --command update
コマンドを使用して、すでに登録されているエージェントの設定を変更できます。-
検証
- オプション: 監視対象システムを再起動して、設定が永続的であることを確認します。
エージェントのアテステーションが成功することを確認します。
keylime_tenant --command cvstatus --uuid <agent.uuid>
# keylime_tenant --command cvstatus --uuid <agent.uuid> ... {"<agent.uuid>": {"operational_state": "Get Quote"..."attestation_count": 5 ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow <agent.uuid>
をエージェントの UUID に置き換えます。operational_state
の値がGet Quote
で、attestation_count
が 0 以外の場合、このエージェントのアテステーションは成功しています。Operational_state
の値がInvalid Quote
かFailed
の場合、アテステーションは失敗し、次のようなコマンド出力が表示されます。{"<agent.uuid>": {"operational_state": "Invalid Quote", ... "ima.validation.ima-ng.not_in_allowlist", "attestation_count": 5, "last_received_quote": 1684150329, "last_successful_attestation": 1684150327}}
{"<agent.uuid>": {"operational_state": "Invalid Quote", ... "ima.validation.ima-ng.not_in_allowlist", "attestation_count": 5, "last_received_quote": 1684150329, "last_successful_attestation": 1684150327}}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow アテステーションが失敗した場合は、verifier ログで詳細を表示します。
journalctl --unit keylime_verifier
# journalctl --unit 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow