Model Context Protocol を使用したエージェントのインタラクションを保護するためのベスト プラクティス
Model Context Protocol(MCP)は、生成 AI エージェントが Bigtable に接続する方法を標準化します。自律型エージェントには固有のリスクがあるため、プロンプト インジェクションなどの脆弱性を軽減するには、プラットフォーム制御と安全なアプリケーション設計を組み合わせた責任共有モデルが必要です。
Google Cloud Model Context Protocol(MCP)ツールを使用する AI アプリケーションを設計してデプロイするには、このガイドのベスト プラクティスに従ってください。
始める前に
MCP ツールを使用する場合、アプリケーションのセキュリティ ポスチャーはエージェントのインタラクション モデルによって異なります。エージェントの使用が、エージェントと MCP サーバーの統合に関連するセキュリティ リスクにどのように影響するかについては、AI のセキュリティと安全性をご覧ください。
セキュリティの責任
お客様は、エージェント プラットフォームの安全な構成と運用に責任を負います。
最小権限の原則に従う
最小限のスコープのサービス アカウントでエージェントを実行します。これは、最初で最も重要な防御レイヤです。
- 専用 ID: MCP ツールを使用して、一意のエージェントまたはアプリケーションごとに個別の専用サービス アカウントを作成します。既存の SA、特に広範な権限を持つ SA を再利用しないでください。
- 最小限のスコープ: サービス アカウントに必要な Identity and Access Management(IAM)ロール(
alloydb.adminではなくalloydb.viewerなど)のみを付与します。エージェントが特定のデータセットに対する読み取りアクセス権のみを必要とする場合は、カスタム IAM ロールを使用して、その機能に必要な最小限のアクセス権に制限します。 - 職務の分離: エージェントにデータへの読み取りアクセスとログまたは一時ストレージへの書き込みアクセスの両方が必要な場合は、2 つの別々のサービス アカウントを使用します。1 つはリスクの高いデータアクセス(最小限のスコープ)用、もう 1 つはリスクの低い運用タスク用です。
データベース ネイティブのきめ細かい制御を使用する
最も強力な防御を実現するには、IAM ロールとデータベース自体が提供するきめ細かいアクセス制御を組み合わせます。これにより、攻撃者がエージェントの IAM トークンを不正使用した場合でも、データベース エンジンの内部権限によって損害の範囲が制限されます(たとえば、DROP TABLE コマンドの実行を防止します)。
プロダクト |
きめ細かい制御メカニズム |
フォーカス |
|---|---|---|
Cloud SQL と AlloyDB |
PostgreSQL や MySQL の CREATE ROLE などのデータベース レベルのロール。 |
特定のデータベース インスタンスとスキーマの権限を管理します。 |
BigQuery |
列レベルのアクセス制御(ポリシータグを使用) |
承認済みテーブルであっても、エージェントによる機密性の高い列(PII など)へのアクセスを制限します。 |
Spanner |
きめ細かいアクセス制御( GRANT/REVOKE を含むデータベース ロール) |
テーブルと列に対する読み取り、書き込み、更新の権限を正確に適用します。 |
Firestore |
IAM ロールと IAM 条件 |
IAM ロールと IAM 条件を使用して、データベースごとのアクセス権限を構成します。 |
Bigtable |
IAM ロール |
Bigtable では、プロジェクト、インスタンス、テーブルの各レベルで IAM ロールを使用してきめ細かい制御が可能です。 |
安全なエージェント設計
エージェント専用モデルでは、システム プロンプトをオーバーライドしようとするプロンプト インジェクション攻撃に対する堅牢なアプリケーション レベルの防御が必要です。詳細については、AI の安全性とセキュリティをご覧ください。
データとユーザー入力を信頼できないものとして扱う
エンドユーザーからの入力、またはエージェントが外部ソース(ウェブ検索結果やサードパーティのドキュメントなど)から取得したデータは、信頼できないものとして扱います。
アクション選択パターンを実装する
システムが上位レベルのタスク仕様を機械的な実行から切り離す、オープンエンドの計画と実行 アーキテクチャを避けます。代わりに、モデルの自由度を制限する設計パターンを使用します。
- アクション セレクタ パターン: モデルの唯一のジョブは、ユーザー リクエストを、事前定義された安全な関数の小さなセットの 1 つに変換することです。アクション ロジックはハードコードされており、LLM で変更することはできません。これにより、エージェントは制御フローを標的とするインジェクション攻撃に対して免疫を持つようになります。
- デュアル LLM パターン: コアタスクを実行するプライマリ LLM(アクション LLM)と、悪意のある意図がないかユーザー プロンプトを事前スクリーニングし、アクション LLM の出力で不正なアクションやデータ漏洩がないか事後スクリーニングするセカンダリの高度に安全な LLM(ガードレール LLM)を使用します。
不正なツールチェーンを防止する
エージェントは、タスクに必要なツールのみを呼び出す必要があります。オーケストレーション コードで次の処理が防止されていることを確認します。
- 動的ツール: エージェントは、新しいツールを動的に登録したり、既存のツールの権限を変更したりすることはできません。
- 許可リストの適用: エージェントがアクセスできる関数またはデータベース テーブルの許可リストを、初期システム プロンプトとバックエンド コードで宣言します。Gemini CLI の例については、ツールのアクセスを制限するをご覧ください。
マルチテナント データベースでデータアクセスを制限する
execute_sql などの一般的なツールを使用すると、呼び出し元は IAM とデータベースの権限でアクセスが許可されている任意のデータを読み取ることができるデータベース クエリを実行できます。信頼できる人間が介在せずにマルチテナント アプリケーションのデータにアクセスするエージェントを作成する場合は、データアクセスをさらに制限する必要がある場合があります。
エージェントがアクセスできるデータのサブセットのみを読み取れるようにするには、データベース向け MCP ツールボックスなどのフレームワークを使用してカスタムツールを作成することをおすすめします。詳細については、事前構築ツールとカスタムツールをご覧ください。
たとえば、データベースの Orders テーブルにすべてのエンドユーザーの注文が保存されているとします。ユーザーとやり取りし、注文を検索できるチャット エージェントを開発しています。チャット エージェントは Orders テーブル全体を読み取る権限を持っていますが、1 人のエンドユーザーが別のユーザーの注文に関する情報をリクエストすることはできません。
安全でないシナリオでは、エージェントに execute_sql ツールのみを装備するため、データ漏洩のリスクが生じます。悪意のあるユーザーは、エージェントをだまして他のユーザーの注文を読み取らせ、返させることができます。通常、エージェントにアクセスルールを適用するように指示するだけでは、データを保護するのに十分ではありません。
安全なシナリオでは、エージェントに lookup_active_order などのより具体的なカスタムツールを付与します。この場合、クエリフィルタ内のユーザーの ID はエージェントの制御外で設定されます。
セキュリティと安全に関する構成
Bigtable は、プラットフォーム レベルで安全性の境界を適用する Model Armor を提供します。これらの設定を有効にして構成する必要があります。
Model Armor を有効にする
Google Cloud CLI を使用して、モデルのデプロイで Model Armor を有効にします。これにより、インジェクションやジェイルブレイクなどの既知の攻撃ベクトルに対する組み込みの保護が有効になります。
次の例では、Vertex AI エンドポイントで Model Armor を有効にします。
# Example: Enable Model Armor on a Vertex AI endpoint
gcloud ai endpoints update ENDPOINT_ID \
--region=REGION \
--enable-model-armor
詳細と例については、 Google Cloudで MCP の Model Armor 保護を構成するをご覧ください。
機密データのオペレーションに最小限の安全しきい値を適用する
Model Armor を使用すると、センシティブ データ オペレーション(個人情報(PII)の検出や匿名化など)の最小安全しきい値を適用できます。モデルが侵害された場合でも、Sensitive Data Protection DeidentifyTemplate を使用して、機密情報がユーザーに返される前に秘匿化またはマスキングします。
構成の概念的な例を次に示します。
# Example: Apply a DeidentifyTemplate to filter PII
gcloud ai endpoints update ENDPOINT_ID \
--region=REGION \
--model-armor-config-file=model_armor_config.json
次の例では、model_armor_config.json は DLP テンプレートを参照している可能性があります。
{
"safety_thresholds": {
"injection": "HIGH",
"harmful_content": "MEDIUM"
},
"data_protection_config": {
"dlp_deidentify_template": "projects/PROJECT_NUMBER/locations/LOCATION/deidentifyTemplates/DLP_TEMPLATE_ID"
}
}
監査とオブザーバビリティ
インシデント後の分析と、不正使用されたエージェントの検出には、エージェントのアクションの可視化が不可欠です。
データ復旧戦略を実装する
IAM やデータベース ネイティブ ロールなどの多層制御は、破壊的なアクションを防ぐように設計されていますが、防御が失敗した場合に備えて復元計画を立てておく必要があります。書き込み権限を持つ侵害されたエージェントまたは未熟なエージェント(「エージェントのみ」のリスク)が、DROP TABLE などの破壊的なコマンドを実行するように騙されたり、データを破損させられたりする可能性があります。
このシナリオに対する主な防御策は、堅牢な復元戦略です。
ほぼすべてのデータクラウド プロダクトには、従来のバックアップ、ポイントインタイム リカバリ(PITR)、データ スナップショットのいずれかを通じて、データ復元機能が用意されています。これらの機能を有効にして構成する責任はお客様にあります。
| プロダクト | バックアップと復元のメカニズム |
|---|---|
| Cloud SQL | オンデマンド バックアップと自動バックアップの両方をサポートしているため、インスタンスを以前の状態に復元できます。ポイントインタイム リカバリ(PITR)もサポートしています。 |
| AlloyDB | デフォルトで継続的なバックアップと復元を提供します。これにより、マイクロ秒単位の PITR が有効になり、保持期間内の任意の時点にクラスタを復元できます。 |
| BigQuery | データ復元は「タイムトラベル」を使用して行われます。これにより、過去 7 日間の任意の時点のデータにアクセスして復元できます。長期保存には、テーブル スナップショットを作成できます。 |
| Spanner | オンデマンド バックアップと PITR の両方をサポートします。 |
| Firestore | データベースを以前の状態に復元できる自動バックアップをサポートします。また、PITR を使用して、誤って削除されたり書き込まれたりしないように保護することもできます。これらの機能はどちらもデフォルトで無効になっています。 |
| Bigtable | オンデマンド バックアップと自動バックアップをサポートします。これらのバックアップはフルマネージドで、新しいテーブルに復元できます。 |
Cloud Audit Logs を有効にする
MCP と、BigQuery、Cloud SQL、AlloyDB、Firestore、Spanner などの関連するすべての Google Cloud サービスで、データ アクセス監査ログが有効になっていることを確認します。デフォルトでは、管理アクティビティ監査ログのみが有効になっています。データアクセス監査ログには、エージェントによって実行されたすべての読み取りオペレーションと書き込みオペレーションが記録されます。詳細については、MCP のデータアクセス監査ログをご覧ください。
機密情報に関する操作を監査する
Cloud Logging でアラートを構成して、異常なアクションやリスクの高いアクションを検出します。ログ エクスプローラ クエリは、Firestore でデータ書き込みオペレーションを実行しているサービス アカウントを特定します。これは、データ漏洩や破壊的な攻撃の一般的なターゲットです。
resource.type="firestore_database" # Filter for data write operations AND protoPayload.methodName="google.firestore.v1.Firestore.Commit" # Ensure the caller is an agent service account (modify regex as needed) AND protoPayload.authenticationInfo.principalEmail=~".*@.*.gserviceaccount.com" # Exclude expected system calls to reduce noise AND NOT protoPayload.authenticationInfo.principalEmail=~"system-managed-service-account"
エージェント固有のロギングを使用する
Cloud Audit Logs に加えて、アプリケーション コードがエージェントの決定ごとに次のデータをログに記録していることを確認します。
- ツールの実行: 呼び出された MCP ツール。
- 未加工のコマンド: LLM によって生成された正確なコマンド(
SQLクエリやドキュメント パスなど)。 - 最終アクション: アクションが実行されたか(エージェント専用モデル)、承認されたか(Human-in-the-Middle)。詳細については、エージェントの使用状況を把握するをご覧ください。
- ユーザー ID とセッション ID: リクエストを開始したエンドユーザーの識別子。