Claude Code の操作ログを監査に残す方法:OpenTelemetry と SIEM 連携

結論

  • 公式ドキュメントによると、Claude Code(Anthropic 社が提供する、ターミナルで動く AI コーディングエージェント)の監査データ源は OpenTelemetry のイベントで、ユーザーの識別属性が付き、OTLP ログエクスポーターで SIEM に送れます。
  • コマンドや MCP の詳細は OTEL_LOG_TOOL_DETAILS=1 を設定すると記録されます(Claude Desktop が所有するセッションの組み込みサーバーでは、フラグなしでも mcp_server_name/mcp_tool_name が記録されます)。機微な内容を含み得るため、収集先が承認されている場合に限って有効にします。
  • API キーや Bedrock などでの認証ではユーザーの識別情報を自分で付ける必要があり、異常検知やアラートは SIEM 側の役割です。

監査データの源は OpenTelemetry のイベント

公式ドキュメントによると、Claude Code の活動の監査データ源は OpenTelemetry(監視用のデータを共通の形式で出力する仕組み)のイベントです。各イベントに識別用の属性が付き、ツール呼び出し、MCP の活動、権限の判断を、操作したユーザーに結びつけられます。

OTLP ログエクスポーターを使うと、OTLP の受信口を持つ SIEM(セキュリティ関連のログを集めて分析する基盤)に送れます。OpenTelemetry Collector 経由で SIEM に転送する構成もあります。

役割分担にも注意が必要です。Claude Code が出すのは生のイベントストリームだけで、異常検知、ベースライン作成、セッションをまたぐ相関、アラートは SIEM や監視基盤の責任とされています。

出典: Monitoring

誰の操作として記録されるか

標準属性には認証されたユーザーの識別情報が入ります。Claude アカウントでサインインしている場合は user.email、user.account_uuid、user.account_id、organization.id が入り、加えて user.id とセッションごとの session.id が入ります。user.id はインストール単位の識別子です(/login で Claude apps gateway にサインインしたセッションでは IdP subject になります)。

開発者が開始したセッションでは、MCP ツール呼び出し、Bash コマンド、ファイル編集はその開発者の操作として記録され、別のサービスアカウントでは動きません。Claude Tag チャンネルのセッションは組織の共有アイデンティティで動きます。

API キーや Bedrock などの場合

直接の API キー、Amazon Bedrock、Google Cloud の Agent Platform、Microsoft Foundry で認証すると、入るのは user.id と session.id だけです。この場合は OTEL_RESOURCE_ATTRIBUTES で利用者の識別情報を自分で付けます。managed settings(管理者が配布する設定)のユーザーごとの設定か、起動用ラッパーで指定します。値は公式の例です。

export OTEL_RESOURCE_ATTRIBUTES="enduser.id=jdoe@example.com,enduser.directory_id=S-1-5-21-..."

出典: Monitoring

どのイベントで何が分かるか

公式ドキュメントには、監視したい事象とイベントの対応表があります。主なものは次のとおりです。

  • ツール呼び出しの許可・拒否と判断元:tool_decision
  • 権限モードの引き上げ:permission_mode_changed
  • ポリシー用フックによる阻止:hook_execution_complete
  • ログイン、ログアウト、認証失敗:auth
  • MCP サーバーの接続や失敗:mcp_server_connection
  • 実行されたコマンドや触れたファイル:tool_result(実行)、tool_decision(拒否)。OTEL_LOG_TOOL_DETAILS=1 が前提です

MCP の操作を詳しく残す

MCP の操作を詳細に残すには、ログエクスポーターを有効にして OTEL_LOG_TOOL_DETAILS=1 を設定します。サーバー名、ツール名、呼び出しの引数が、識別属性と一緒に記録されます。

設定しない場合、ユーザーが設定した MCP サーバーの tool_name は "mcp_tool" という固定の文字列に置き換わり、引数の内容も出ません。mcp_server_connection は server_name とエラーメッセージを含みません。Claude Desktop の組み込みサーバーには例外とバージョン条件があるので、公式ドキュメントで確認してください。

出典: Monitoring

SIEM への送信設定と疎通確認

OTEL_EXPORTER_OTLP_LOGS_ENDPOINT を、SIEM の OTLP 受信口、または SIEM の取り込み API に転送する OpenTelemetry Collector に向けます。公式ドキュメントの managed settings の例は、イベントだけを出力し、MCP と Bash の監査用にツール詳細を有効にしています。

{
  "env": {
    "CLAUDE_CODE_ENABLE_TELEMETRY": "1",
    "OTEL_LOGS_EXPORTER": "otlp",
    "OTEL_LOG_TOOL_DETAILS": "1",
    "OTEL_EXPORTER_OTLP_LOGS_PROTOCOL": "http/protobuf",
    "OTEL_EXPORTER_OTLP_LOGS_ENDPOINT": "https://siem.example.com:4318/v1/logs",
    "OTEL_EXPORTER_OTLP_HEADERS": "Authorization=Bearer your-siem-token"
  }
}

疎通確認は、この設定のセッションでプロンプトを送り、SIEM に claude_code.user_prompt イベントが届くかを見ます。届かないときは claude --debug-file <path> で起動し、ログの [3P telemetry] のエクスポートエラーを確認します。エンドポイントとトークンは例の値です。

出典: Monitoring

記録される内容と注意点

OpenTelemetry の出力は明示的な設定が必要なオプトインで、イベントにファイルの生の内容やコードの断片は含まれません。ただし、既定で記録されない項目を有効にすると機微な内容が入り得ます。

  • プロンプト:既定では長さだけです。内容は OTEL_LOG_USER_PROMPTS=1 で含められ、user_prompt イベントでは prompt と prompt_text の両方に入ります。コレクターで除外するなら両方を指定します
  • 応答テキスト:既定では長さだけです。含めるには OTEL_LOG_ASSISTANT_RESPONSES=1 を設定します。未設定の場合は OTEL_LOG_USER_PROMPTS の値が代わりに使われるため、プロンプトだけを含めたいときは OTEL_LOG_ASSISTANT_RESPONSES=0 を設定します。
  • ツールの引数:既定では記録されません。OTEL_LOG_TOOL_DETAILS=1 で Bash コマンド、MCP のサーバー名・ツール名、ファイルパスなどが入ります
  • user.email:OAuth で認証した場合に入り、送信先は自分で設定した OTel エンドポイントだけです(Anthropic には送られません)。懸念があれば、バックエンドで除外やマスクをします

公式ドキュメントでは、OTEL_LOG_TOOL_DETAILS=1 の詳細はセッションそのものと同じ機微な内容を含み得るため、収集先が承認されている場合にだけ有効にするとしています。トレースや生の API 本文(OTEL_LOG_RAW_API_BODIES)は別の経路で会話履歴全体を含み得るので、使う前に公式ドキュメントで確認してください。執筆時点(2026年10月)の公式ドキュメントに基づく内容です。

ローカルの保持期間は managed settings の cleanupPeriodDays でそろえ、retention_sweep イベントで各マシンが実際に適用しているか確認できます。

出典: Monitoring

よくある質問

API キーや Bedrock で使うと、監査ログに誰の操作か残りますか?

公式ドキュメントによると、この場合は Claude アカウントが無く、入るのは user.id と session.id だけです。利用者を特定するには OTEL_RESOURCE_ATTRIBUTES で識別情報を自分で付けます。

出典: Monitoring

プロンプトの内容も監査ログに残りますか?

既定では内容は収集されず、長さだけが記録されます。OTEL_LOG_USER_PROMPTS=1 を設定すると内容を含められますが、機微な内容が入り得るため、収集先の扱いを確認してください。

出典: Monitoring

SIEM にイベントが届かないときは何を確認しますか?

公式ドキュメントでは、まずプロンプトを送り claude_code.user_prompt イベントを確認します。届かなければ claude --debug-file <path> で起動し、ログの [3P telemetry] のエクスポートエラーを確認するとしています。

出典: Monitoring

関連する無料ツール

Claude Code 権限設定(settings.json)ジェネレーター: deny / ask / allow のルールを選ぶと、置き場所つきで settings.json を出力します。配る前の設定の下書きに使えます。

参考(執筆時点)

この記事は、上の出典の内容を中小DXラボが要約・再構成したものです。仕様は変わることがあります。社内で使う・配る前に、公式ドキュメントで最新の情報を確認してください。