セキュリティで保護された AI エージェントの構築は、Agent Framework とアプリケーション開発者の間で共有される責任です。 Agent Framework には、抽象化、プロバイダー、オーケストレーションという構成要素が用意されていますが、開発者は、入力の検証、データ フローのセキュリティ保護、およびシナリオに適したツールの構成を担当します。
この記事では、Agent Framework を使用して安全で安全なエージェントを構築するためのベスト プラクティスについて説明します。
信頼の境界を理解する
エージェントの実行時には、ユーザー入力、チャット履歴プロバイダー、コンテキスト プロバイダー、LLM サービス、関数ツールなど、複数のコンポーネントがデータフローされます。 データがアプリケーションに出入りする各境界は、潜在的な攻撃対象領域を表します。
考慮すべき主要な信頼境界:
- AI サービス — チャット メッセージ (PII とシステム命令を含む可能性があります) を受信し、LLM で生成された出力を返します。
- チャット履歴ストレージ — プロバイダーは、外部ストレージを介して会話メッセージを読み込んで保持する場合があります。
- コンテキスト サービス — コンテキスト プロバイダーは、外部サービス (メモリ、ユーザー プロファイル、RAG 結果) からデータを取得または格納できます。
- ツール アクセス サービス — 関数ツールは、外部 API またはデータベースを呼び出す可能性がある開発者が提供するコードを実行します。
すべての外部サービス通信は、開発者が選択したクライアント SDK によって処理されます。 エージェント フレームワークでは、これらのサービスの認証、暗号化、接続の詳細は管理されません。
ベスト プラクティス
関数の入力を検証する
AI は、ツールとして指定した任意の関数を呼び出し、引数を選択できます。 LLM で提供される引数は、Web API のユーザー入力と同様に、信頼されていない入力として扱います。
-
許可リストを使用 する - 既知の不適切なパターンをフィルター処理するのではなく、既知の適切な値に対して入力を検証します。 たとえば、
..トラバーサル シーケンスをチェックするのではなく、ファイル パスが許可されたディレクトリ内にあることを確認します。 - 型と範囲の制約を適用 する - 引数が想定される型であり、許容される範囲内 (数値の境界、文字列の長さの制限、日付範囲) であることを確認します。
- 文字列の長さを制限する - リソースの枯渇やインジェクション攻撃を防ぐために、文字列引数に最大長を適用します。
- パス トラバーサルを防止 する — 関数がファイル パスを受け入れる場合は、絶対パスに解決し、許可されたディレクトリ内に収まるようにします。
- パラメーター化されたクエリを使用 する — 引数が SQL クエリ、シェル コマンド、またはその他の解釈されたコンテキストで使用される場合は、パラメーター化クエリまたはエスケープを使用します。文字列連結は使用しません。
危険度の高いツールの承認を要求する
既定では、エージェントに提供されるすべてのツールは、ユーザーの承認なしに呼び出されます。 ツール承認メカニズムを使用して、人間の確認の背後にある危険度の高い操作をゲートします。
承認が必要なツールを決定する場合は、次の点を考慮してください。
- 副作用 - データの変更、通信の送信、購入、またはその他の副作用を持つツールには、通常、承認が必要です。
- データの機密性 — 機密データ (PII、財務データ、資格情報) にアクセスまたは返すツールは、承認を保証します。
- 反転性 - 元に戻せない操作 (削除、電子メールの送信) は、読み取り専用クエリよりもリスクが高くなります。
- 影響の範囲 — 広範な影響を与えるツール (一括操作) では、狭い範囲のツールよりも詳細な調査が必要です。
システム メッセージの開発者による制御を維持する
チャット メッセージには、AI サービスがそれらを解釈する方法を決定する役割 (system、 user、 assistant、 tool) が含まれます。 これらのロールを理解することは重要です。
| 役割 | 信頼レベル |
|---|---|
system |
最高信頼 — LLM 動作を直接形作ります。 信頼されていない入力を含めてはなりません。 |
user |
信頼されていない — プロンプト挿入の試行または悪意のあるコンテンツが含まれている可能性があります。 |
assistant |
信頼されていない — 外部システムである LLM によって生成されます。 |
tool |
信頼されていない — 外部システムまたはユーザーが影響を受けたコンテンツからのデータを含む場合があります。 |
エンド ユーザーの入力を systemロール メッセージに配置しないでください。 Agent Framework では、型指定されていないテキストが既定でロール user されますが、プログラムでメッセージを作成するときは注意が必要です。
Vet 拡張機能プロバイダー
コンテキスト プロバイダー と 履歴プロバイダー は、 systemを含め、任意のロールでメッセージを挿入できます。 信頼できるプロバイダーのみをアタッチします。
間接的なプロンプト挿入に注意してください。基になるデータ ストアが侵害された場合、敵対的なコンテンツが LLM の動作に影響する可能性があります。 たとえば、RAG を使用して取得されたドキュメントには、LLM が意図した動作から逸脱したり、ツール呼び出しによってデータを流出させたりする非表示の命令が含まれている場合があります。
LLM 出力の検証と安全化
LLM 応答は、信頼されていない出力として扱う必要があります。 AI サービスは、Agent Framework が制御しない外部エンドポイントです。 注意事項:
- Hallucination — LLMは、もっともらしいが実際には間違った情報を生成する可能性があります。 検証なしで LLM 出力を権限のあるものとして扱わないでください。
- 間接的なプロンプト挿入 — ツール、コンテキスト プロバイダー、またはチャット履歴プロバイダーによって取得されたデータには、LLM に影響を与えるために設計された敵対的なコンテンツが含まれている場合があります。
- 悪意のあるペイロード — LLM 出力には、サニタイズなしでレンダリングまたは実行された場合に有害なコンテンツが含まれる可能性があります (XSS の場合は HTML/JavaScript、インジェクション用の SQL、シェル コマンド)。
LLM 出力を HTML でレンダリングする前、コードとして実行する前、データベース クエリで使用する前、またはセキュリティに依存するコンテキストに渡す前に、LLM 出力を常に検証してサニタイズします。
ログ内の機密データを保護する
Agent Framework では、 OpenTelemetry を使用したログ記録とテレメトリがサポートされています。 機密データは、明示的に有効になっている場合にのみログに記録されます。
-
ログ — ログ レベルの
Traceで、完全なChatMessagesコレクションがログに記録されます。 これには PII を含めることができます。Traceレベルを運用環境で有効にしないでください。 -
テレメトリ —
EnableSensitiveDataが設定されている場合、テレメトリには、関数呼び出しや結果を含むチャット メッセージのフルテキストが含まれます。 運用環境ではこれを有効にしないでください。
セッション データをセキュリティで保護する
セッション (AgentSession) は会話コンテキストを表し、永続化のためにシリアル化できます。 シリアル化されたセッションを機密データとして扱います。
- セッションは、会話コンテンツまたはセッション識別子を参照する場合があります。
- 信頼されていないソースからセッションを復元することは、信頼されていない入力を受け入れるのと同じです。 侵害されたストレージ バックエンドによってロールが変更され、信頼がエスカレートされる可能性があります。
- 適切なアクセス制御とエンリプションを使用して、セキュリティで保護されたストレージにセッションを格納します。
リソース制限を実装する
エージェント フレームワークでは、入力/出力の長さや要求レートに制約はありません。これは、シナリオに適した内容がわからないためです。 お客様の責任は次のとおりです。
- 入力長の制限 - コンテキスト オーバーフローや DoS 攻撃を防ぐために入力の長さを制限します。
-
出力長の制限 — サービス提供の制限 (チャット オプションの
MaxOutputTokensなど) を使用します。 - レート制限 - レート制限機能を使用して、コスト超過や同時要求からの不正使用を防ぎます。