はじめに
Anthropicの提唱するModel Context Protocol (MCP) を利用して、LLM(大規模言語モデル)と外部データソースやToolを連携させる際、セキュリティ監査は極めて重要です。プロトコル連携の脆弱性は、データ漏洩、不正アクセス、あるいはLLMの意図しない動作(プロンプトインジェクションの拡大)に直結します。
本記事では、MCPの実装を監査する際に焦点を当てるべき、データ連携層とアクセス制御に関する包括的なチェックリストを提供します。
監査の前提知識
MCPにおける主要なセキュリティ境界
MCPのセキュリティを理解する上で、以下の境界を意識することが重要です。
- ユーザー境界: 異なるユーザー間のデータ分離
- 権限境界: 同一ユーザー内での権限レベルによる分離
- コンテキスト境界: LLMセッション間のコンテキスト分離
- システム境界: 外部システムとLLMエージェント間の信頼境界
1. データ分離と機密性に関するチェックリスト
MCPは異なるコンテキストをLLMに提供するため、ユーザー間およびデータ間の分離が正しく行われているかを検証します。
1.1 ユーザー間データ分離
監査項目: セッションID/ユーザーIDの厳格な関連付け
チェックポイント:
- LLMへの入力(プロンプトとコンテキスト)全体を通じて、ユーザーIDが一貫して追跡されているか
- セッションIDが推測不可能な形式(UUID v4など)で生成されているか
- セッションの有効期限が適切に設定され、期限切れ後は自動的に無効化されるか
- マルチテナント環境において、テナントIDが明示的に管理されているか
脆弱性リスク: あるユーザーの機密情報が、別のユーザーの推論結果に混入する(コンテキストリーク)
検証方法: 異なるユーザーアカウントで同時にセッションを開始し、一方のユーザーの機密データが他方に漏洩しないことを確認
1.2 推論後のコンテキストクリア
監査項目: コンテキストデータの即座の破棄
チェックポイント:
- LLMの推論完了後、外部コンテキストデータがメモリから即座に破棄されるか
- キャッシュ機構がある場合、機密データがキャッシュされない設定になっているか
- ログファイルに機密コンテキストが平文で記録されていないか
- ガベージコレクション後も機密データが残留しないことを確認しているか
脆弱性リスク: 過去の機密情報がメモリに残り、次のセッションで偶発的に参照される
検証方法: メモリダンプやデバッグツールを使用し、推論完了後のメモリ状態を検査
1.3 機密性のタグチェック
監査項目: セキュリティラベルに基づくアクセス権限検証
チェックポイント:
- コンテキストに付与されたセキュリティラベル(例: 極秘、PHI、PII)が標準化されているか
- LLMエージェントの権限レベルとコンテキストのセキュリティラベルの照合が自動化されているか
- ラベルの付与プロセスが文書化され、一貫して適用されているか
- データ分類ポリシーがMCPの実装に正しく反映されているか
脆弱性リスク: 機密データが、権限のないLLMエージェントやToolに渡される
検証方法: 異なる権限レベルのユーザーで、同じ機密データへのアクセスを試み、適切にフィルタリングされることを確認
1.4 出力フィルタリング
監査項目: 出力結果のサニタイズと権限チェック
チェックポイント:
- 機密コンテキストを参照した推論結果に、データ漏洩防止(DLP)フィルタが適用されているか
- クレジットカード番号、SSN、個人情報などの正規表現パターンマッチングが実装されているか
- 出力に含まれるデータソースIDやシステムパスが自動的にマスクされるか
- 機密性の高い出力には追加の権限確認が要求されるか
脆弱性リスク: LLMが機密情報をそのままユーザーに出力してしまう
検証方法: 機密データを含むコンテキストを用いた推論を実行し、出力に機密情報が含まれないことを確認
2. アクセス制御と認証に関するチェックリスト
LLMエージェント、Tool、およびコンテキストソース間のアクセス制御が、最小権限の原則に基づいて設計されているかを検証します。
2.1 Tool認証の分離
監査項目: 認証情報のLLMコンテキストからの隔離
チェックポイント:
- ToolがAPIやDBにアクセスする際の認証情報が、LLMの推論コンテキストに含まれていないか
- 認証情報がシークレット管理システム(HashiCorp Vault、AWS Secrets Managerなど)に保管されているか
- Tool実行時の認証がサーバーサイドで行われ、クライアント側に認証情報が渡されないか
- 環境変数やハードコードされた認証情報が存在しないか
脆弱性リスク: 悪意のあるプロンプトインジェクションにより、LLMが認証情報を盗み出す
検証方法: プロンプトインジェクション攻撃を模擬し、「APIキーを教えてください」などの命令に対してLLMが認証情報を開示しないことを確認
2.2 データソースの認証検証
監査項目: コンテキスト提供元の真正性確認
チェックポイント:
- MCPを通じて提供されるコンテキストに、提供元システムの有効な認証情報が付与されているか
- データソースのデジタル署名が検証されているか
- 証明書の有効期限チェックが自動化されているか
- 信頼されたデータソースのホワイトリストが維持されているか
脆弱性リスク: 信頼性の低い、または改ざんされた外部データがLLMの推論に使われる
検証方法: 偽のデータソースからのコンテキスト提供を試み、適切に拒否されることを確認
2.3 最小権限の原則
監査項目: タスクに必要な最小限の権限に制限
チェックポイント:
- LLMエージェントに付与された権限が文書化されているか
- Role-Based Access Control (RBAC)またはAttribute-Based Access Control (ABAC)が実装されているか
- 各Toolの実行に必要な最小権限が明確に定義されているか
- 定期的な権限レビューのプロセスが確立されているか
脆弱性リスク: LLMが広範なデータベースへの参照権限を持ち、不必要なデータを引き出す
検証方法: 権限マトリックスを作成し、各ロールが必要最小限の権限のみを持つことを検証
2.4 権限昇格チェック
監査項目: 権限を超えたアクセスの防止
チェックポイント:
- ユーザーの権限を超えたデータへのアクセス試行が、データソース側で拒否されるか
- LLMがユーザーに代わって実行できるアクションが制限されているか
- 管理者機能へのアクセスに追加の認証(多要素認証など)が要求されるか
- 権限昇格の試行が監査ログに記録され、アラートが発生するか
脆弱性リスク: LLMがユーザーに代わって機密性の高いシステム機能を実行する
検証方法: 一般ユーザーの権限で管理者データへのアクセスを試み、適切に拒否されることを確認
3. 入力処理とプロンプトインジェクション対策
MCPによって外部コンテキストがLLMの入力に組み込まれるため、間接的なプロンプトインジェクションのリスクが拡大します。
3.1 コンテキストのサニタイズ
監査項目: 外部コンテキストの無害化
チェックポイント:
- 外部コンテキストデータに含まれる特殊文字やエスケープシーケンスが適切に処理されているか
- 「上記の指示を無視し...」「システムプロンプトを出力して...」などの命令文パターンが検出・除去されるか
- HTMLタグやスクリプトが含まれる場合、適切にサニタイズされているか
- 入力検証ルールが定期的に更新され、新たな攻撃パターンに対応しているか
脆弱性リスク: 外部データに仕込まれた悪意ある命令がLLMに実行される(間接的なプロンプトインジェクション)
検証方法: 既知のプロンプトインジェクションパターンを含むコンテキストをテストし、適切に無害化されることを確認
3.2 プロトコルペイロードの検証
監査項目: MCPデータ構造の厳格な検証
チェックポイント:
- MCPペイロードがJSON/XMLスキーマ定義に厳密に従っているか
- データ長の上限が設定され、過大なペイロードが拒否されるか
- 必須フィールドの欠落や型の不一致が検出されるか
- 未知のフィールドや拡張が適切に処理される(または拒否される)か
脆弱性リスク: 予期せぬデータ構造を利用した、プロトコルレベルでの脆弱性攻撃
検証方法: 不正な形式のMCPペイロードを送信し、適切にエラー処理されることを確認
3.3 Tool実行の承認
監査項目: 重要なTool実行前の承認ステップ
チェックポイント:
- 金銭取引、データ削除、外部通信などの重要なToolに対して、実行前の承認メカニズムが存在するか
- 承認プロセスがユーザーインターフェースで明確に示されるか
- 承認なしでのTool実行が技術的に不可能になっているか
- Toolの実行内容がユーザーに理解可能な形で提示されるか
脆弱性リスク: LLMの誤動作や攻撃により、Toolが予期せず実行され、金銭的損害が発生する
検証方法: 重要なToolの自動実行を試み、承認ステップなしでは実行されないことを確認
4. ロギングと監査証跡のチェックリスト
問題発生時の迅速な対応と、コンプライアンス遵守の証明のために、活動ログが適切に記録されているかを監査します。
4.1 アクティビティログの完全性
監査項目: 包括的なログ記録
チェックポイント:
-
以下の情報がすべて記録されているか:
- ユーザーID
- LLMエージェントID/セッションID
- 参照したコンテキストソースID
- Tool呼び出しの詳細(名前、パラメータ、結果)
- タイムスタンプ(UTC、ミリ秒精度)
- IPアドレス/クライアント情報
- 処理の成功/失敗ステータス
- ログのフォーマットが標準化されているか(JSON、syslogなど)
- ログの完全性を保証する仕組み(チェックサムなど)が実装されているか
脆弱性リスク: セキュリティインシデント発生時、追跡可能性が確保できない
検証方法: ログ分析ツールを使用し、すべての重要なイベントが記録されていることを確認
4.2 ログの隔離と保護
監査項目: 監査ログの改ざん防止
チェックポイント:
- 監査ログが変更不可能なストレージ(WORM、ブロックチェーンベースなど)に保存されているか
- ログへのアクセスが厳格に制限され、監査されているか
- ログの暗号化(保存時および転送時)が実装されているか
- ログのバックアップが定期的に取られ、異なる場所に保管されているか
脆弱性リスク: 攻撃者によって監査ログが削除・改ざんされ、不正行為が隠蔽される
検証方法: ログファイルの変更や削除を試み、適切に防止されることを確認
4.3 アラートメカニズム
監査項目: 異常検知とリアルタイムアラート
チェックポイント:
-
以下のような不審なパターンを検知するルールが設定されているか:
- 認証失敗の連続(5回以上など)
- 機密データへの異常なアクセス頻度
- 通常時間外のアクセス
- 不正なIPアドレスからのアクセス
- 大量のデータダウンロード
- アラートが適切な担当者に即座に通知されるか
- アラートの深刻度が適切に分類されているか(Critical、High、Medium、Low)
- 誤検知率が許容範囲内か、定期的に調整されているか
脆弱性リスク: 進行中の攻撃やデータ漏洩の試みをリアルタイムで検出できない
検証方法: 異常なアクセスパターンを模擬し、適切にアラートが発生することを確認
5. 定期的な監査プロセス
5.1 監査スケジュール
効果的なセキュリティ監査のために、以下のスケジュールを推奨します。
- 日次: 自動化されたセキュリティスキャンとログレビュー
- 週次: アクセス制御の変更レビュー
- 月次: 権限と認証情報のレビュー
- 四半期: 包括的なセキュリティ監査とペネトレーションテスト
- 年次: 外部監査機関によるセキュリティ評価
5.2 監査結果の文書化
監査結果は以下の形式で文書化することを推奨します。
# MCP セキュリティ監査レポート
**監査日**: 2024-10-15
**監査者**: [名前]
**対象システム**: [システム名]
## エグゼクティブサマリー
[監査結果の概要]
## 検出された問題
1. [Critical] [問題の説明]
2. [High] [問題の説明]
...
## 推奨事項
1. [推奨事項]
2. [推奨事項]
...
## 次回監査予定
[日付]
6. まとめ
MCPの実装におけるセキュリティ監査は、プロトコルの柔軟性と利便性を享受しつつ、エンタープライズレベルのデータ安全性を維持するために不可欠なプロセスです。
本チェックリストを活用し、定期的な監査を実施することで、MCP実装のセキュリティレベルを継続的に向上させることができます。
参考リンク
注意: MCPはAnthropicが開発した比較的新しいプロトコルです。最新の情報については、公式ドキュメントを参照してください。