脅威モデル
エージェントは、プロンプトインジェクション(処理するコンテンツに埋め込まれた指示)またはモデルエラーが原因で、意図しないアクションを実行する可能性があります。Claude モデルはこれに対する耐性を持つように設計されています。詳細については、モデル概要とデプロイするモデルのシステムカードを参照してください。 ただし、多層防御は依然として良い実践です。たとえば、エージェントが顧客データを外部サーバーに送信するよう指示する悪意のあるファイルを処理する場合、ネットワーク制御がそのリクエストを完全にブロックできます。組み込みセキュリティ機能
Claude Code には、一般的な懸念に対応するいくつかのセキュリティ機能が含まれています。詳細については、セキュリティドキュメントを参照してください。- 権限システム: すべてのツールと bash コマンドは、許可、ブロック、またはユーザーの承認をプロンプトするように設定できます。「すべての npm コマンドを許可」または「sudo を含むコマンドをブロック」などのルールを作成するには、glob パターンを使用します。組織は、すべてのユーザーに適用されるポリシーを設定できます。権限を参照してください。
- 権限のためのコマンド解析: bash コマンドを実行する前に、Claude Code はそれを AST に解析し、結果を権限ルールと照合します。きれいに解析できないコマンド、または許可ルールと一致しないコマンドは、明示的な承認が必要です。
evalなどの小さなコンストラクトセットは、許可ルールに関係なく常に承認が必要です。これは権限ゲートであり、サンドボックスではありません。ターゲットパスまたは効果からコマンドが危険かどうかを推測しません。 - ウェブ検索の要約: 検索結果は、生のコンテンツをコンテキストに直接渡すのではなく、要約されます。これにより、悪意のあるウェブコンテンツからのプロンプトインジェクションのリスクが軽減されます。
- サンドボックスモード: Bash コマンドは、ファイルシステムとネットワークアクセスを制限するサンドボックス環境で実行できます。詳細については、サンドボックスドキュメントを参照してください。
セキュリティの原則
Claude Code のデフォルトを超えた追加の強化が必要なデプロイの場合、これらの原則は利用可能なオプションをガイドします。セキュリティ境界
セキュリティ境界は、異なる信頼レベルを持つコンポーネントを分離します。高セキュリティのデプロイの場合、機密リソース(認証情報など)をエージェントを含む境界の外に配置できます。エージェントの環境で何か問題が発生した場合、その境界外のリソースは保護されたままです。 たとえば、エージェントに API キーへの直接アクセスを与える代わりに、エージェントの環境外で実行されるプロキシを実行して、キーをリクエストに注入することができます。エージェントは API 呼び出しを実行できますが、認証情報自体は見ることはありません。このパターンは、マルチテナント デプロイメントまたは信頼できないコンテンツを処理する場合に役立ちます。最小権限
必要に応じて、エージェントを特定のタスクに必要な機能のみに制限できます。多層防御
高セキュリティ環境では、複数の制御をレイヤー化することで追加の保護が提供されます。オプションには以下が含まれます。- コンテナ分離
- ネットワーク制限
- ファイルシステム制御
- プロキシでのリクエスト検証
分離テクノロジー
異なる分離テクノロジーは、セキュリティ強度、パフォーマンス、運用の複雑さの間で異なるトレードオフを提供します。これらすべての構成では、Claude Code(または Agent SDK アプリケーション)は分離境界(サンドボックス、コンテナ、または VM)内で実行されます。以下で説明するセキュリティ制御は、エージェントがその境界内からアクセスできるものを制限します。
Sandbox runtime
コンテナなしで軽量な分離を行うには、sandbox-runtime が OS レベルでファイルシステムとネットワークの制限を強制します。 主な利点はシンプルさです。Docker 設定、コンテナイメージ、またはネットワーク設定は必要ありません。プロキシとファイルシステムの制限は組み込まれています。許可されたドメインとパスを指定する設定ファイルを提供します。 動作方法:- ファイルシステム: OS プリミティブ(Linux では
bubblewrap、macOS ではsandbox-exec)を使用して、設定されたパスへの読み取り/書き込みアクセスを制限します - ネットワーク: ネットワーク名前空間を削除(Linux)または Seatbelt プロファイルを使用(macOS)して、ネットワークトラフィックを組み込みプロキシ経由でルーティングします
- 設定: ドメインとファイルシステムパスの JSON ベースの許可リスト
- 同一ホストカーネル: VM とは異なり、サンドボックス化されたプロセスはホストカーネルを共有します。カーネルの脆弱性は理論的には脱出を可能にする可能性があります。一部の脅威モデルではこれは許容可能ですが、カーネルレベルの分離が必要な場合は、gVisor または別の VM を使用してください。
- TLS インスペクションなし: プロキシは、クライアントが提供するホスト名に基づいてドメインを許可リストに登録し、暗号化されたトラフィックを終了または検査しません。サンドボックス内で実行されているコードは、ドメインフロンティングまたは同様の技術を使用して、許可リスト外のホストに到達する可能性があります。脅威モデルがより強力な保証を必要とする場合は、TLS 終了プロキシを設定してください。詳細については、サンドボックスセキュリティの制限を参照してください。別途、エージェントが許可されたドメインに対する寛容な認証情報を持っている場合、そのドメインを使用して他のネットワークリクエストをトリガーしたり、データを流出させたりできないようにしてください。
コンテナ
コンテナは Linux 名前空間を通じて分離を提供します。各コンテナはファイルシステム、プロセスツリー、ネットワークスタックの独自のビューを持ちながら、ホストカーネルを共有します。 セキュリティが強化されたコンテナ設定は次のようになります。
Unix ソケットアーキテクチャ:
--network none を使用すると、コンテナはネットワークインターフェースを持ちません。エージェントが外部世界に到達する唯一の方法は、マウントされた Unix ソケット経由です。これはホストで実行されているプロキシに接続します。このプロキシはドメイン許可リストを強制し、認証情報を注入し、すべてのトラフィックをログに記録できます。
これは sandbox-runtime で使用されるのと同じアーキテクチャです。エージェントがプロンプトインジェクション経由で侵害された場合でも、任意のサーバーにデータを流出させることはできません。プロキシ経由でのみ通信でき、プロキシは到達可能なドメインを制御します。詳細については、Claude Code サンドボックスブログ投稿を参照してください。
追加の強化オプション:
gVisor
標準コンテナはホストカーネルを共有します。コンテナ内のコードがシステムコールを実行すると、ホストを実行するのと同じカーネルに直接移動します。これは、カーネルの脆弱性がコンテナエスケープを許可する可能性があることを意味します。gVisor はユーザースペースでシステムコールをインターセプトしてホストカーネルに到達する前に、ほとんどのシステムコールを実際のカーネルを関与させずに処理する独自の互換性レイヤーを実装することでこれに対処します。 エージェントが悪意のあるコードを実行する場合(おそらくプロンプトインジェクションが原因)、そのコードはコンテナ内で実行され、カーネルエクスプロイトを試みる可能性があります。gVisor を使用すると、攻撃面は大幅に小さくなります。悪意のあるコードは最初に gVisor のユーザースペース実装を悪用する必要があり、実際のカーネルへのアクセスは限定的です。 Docker で gVisor を使用するには、runsc ランタイムをインストールしてデーモンを設定します。
マルチテナント環境または信頼できないコンテンツを処理する場合、追加の分離はしばしば価値があります。
仮想マシン
VM は CPU 仮想化拡張機能を通じてハードウェアレベルの分離を提供します。各 VM は独自のカーネルを実行し、強力な境界を作成します。ゲストカーネルの脆弱性はホストを直接侵害しません。ただし、VM は自動的に gVisor などの代替案より「より安全」ではありません。VM セキュリティはハイパーバイザーとデバイスエミュレーションコードに大きく依存します。 Firecracker は軽量マイクロ VM 分離用に設計されています。125ms 以下で VM をブートでき、メモリオーバーヘッドは 5 MiB 未満で、不要なデバイスエミュレーションを削除して攻撃面を削減します。 このアプローチでは、エージェント VM は外部ネットワークインターフェースを持ちません。代わりに、vsock(仮想ソケット)を通じて通信します。すべてのトラフィックは vsock 経由でホスト上のプロキシにルーティングされ、プロキシが許可リストを強制し、リクエストを転送する前に認証情報を注入します。
クラウドデプロイメント
クラウドデプロイメントの場合、上記の分離テクノロジーのいずれかをクラウドネイティブネットワーク制御と組み合わせることができます。- エージェントコンテナをインターネットゲートウェイなしのプライベートサブネットで実行します
- クラウドファイアウォールルール(AWS セキュリティグループ、GCP VPC ファイアウォール)を設定して、プロキシ以外へのすべての送信をブロックします
- リクエストを検証し、ドメイン許可リストを強制し、認証情報を注入し、外部 API に転送する Envoy などのプロキシ(
credential_injectorフィルター付き)を実行します - エージェントのサービスアカウントに最小限の IAM 権限を割り当て、機密アクセスをプロキシ経由でルーティングします
- 監査目的でプロキシですべてのトラフィックをログに記録します
認証情報管理
エージェントは、API を呼び出し、リポジトリにアクセスし、クラウドサービスと相互作用するために認証情報が必要なことがよくあります。課題は、認証情報自体を公開することなく、このアクセスを提供することです。プロキシパターン
推奨されるアプローチは、エージェントのセキュリティ境界の外でプロキシを実行して、送信リクエストに認証情報を注入することです。エージェントは認証情報なしでリクエストを送信し、プロキシがそれらを追加して、リクエストを宛先に転送します。 このパターンにはいくつかの利点があります。- エージェントは実際の認証情報を見ることはありません
- プロキシは許可されたエンドポイントの許可リストを強制できます
- プロキシはすべてのリクエストを監査用にログに記録できます
- 認証情報は各エージェントに分散されるのではなく、1 つの安全な場所に保存されます
Claude Code をプロキシを使用するように設定する
Claude Code は、サンプリングリクエストをプロキシ経由でルーティングするための 2 つの方法をサポートしています。 オプション 1: ANTHROPIC_BASE_URL(シンプルですがサンプリング API リクエストのみ)プロキシの実装
独自のプロキシを構築するか、既存のプロキシを使用できます。- Envoy Proxy: 認証ヘッダーを追加するための
credential_injectorフィルター付きのプロダクショングレードプロキシ - mitmproxy: HTTPS トラフィックを検査および変更するための TLS 終了プロキシ
- Squid: アクセス制御リスト付きのキャッシングプロキシ
- LiteLLM: 認証情報注入とレート制限を備えた LLM ゲートウェイ
他のサービスの認証情報
Claude API からのサンプリングを超えて、エージェントは git リポジトリ、データベース、内部 API などの他のサービスへの認証済みアクセスが必要なことがよくあります。主に 2 つのアプローチがあります。カスタムツール
MCP サーバーまたはカスタムツールを通じてアクセスを提供し、エージェントのセキュリティ境界の外で実行されているサービスにリクエストをルーティングします。エージェントはツールを呼び出しますが、実際の認証済みリクエストは外部で発生します。ツール呼び出しはプロキシに対して行われ、プロキシが認証情報を注入します。 たとえば、git MCP サーバーはエージェントからのコマンドを受け入れることができますが、ホストで実行されている git プロキシにそれらを転送し、プロキシがリモートリポジトリに接続する前に認証を追加します。エージェントは認証情報を見ることはありません。 利点:- TLS インターセプションなし: 外部サービスは認証済みリクエストを直接実行します
- 認証情報は外部に留まる: エージェントはツールインターフェースのみを見て、基礎となる認証情報は見ません
トラフィック転送
Claude API 呼び出しの場合、ANTHROPIC_BASE_URL を使用すると、プレーンテキストでリクエストを検査および変更できるプロキシにリクエストをルーティングできます。ただし、他の HTTPS サービス(GitHub、npm レジストリ、内部 API)の場合、トラフィックはしばしばエンドツーエンドで暗号化されます。HTTP_PROXY 経由でプロキシ経由でルーティングしても、プロキシは不透明な TLS トンネルのみを見て、認証情報を注入することはできません。
カスタムツールを使用せずに任意のサービスへの HTTPS トラフィックを変更するには、トラフィックを復号化し、検査または変更してから、転送する前に再暗号化する TLS 終了プロキシが必要です。これには以下が必要です。
- エージェントのコンテナの外でプロキシを実行する
- プロキシの CA 証明書をエージェントの信頼ストアにインストールする(エージェントがプロキシの証明書を信頼するため)
HTTP_PROXY/HTTPS_PROXYを設定してトラフィックをプロキシ経由でルーティングする
HTTP_PROXY/HTTPS_PROXY を尊重するわけではないことに注意してください。ほとんどのツール(curl、pip、npm、git)は尊重しますが、これらの変数をバイパスして直接接続する場合もあります。たとえば、Node.js fetch() はデフォルトではこれらの変数を無視します。Node 24 以降では、NODE_USE_ENV_PROXY=1 を設定してサポートを有効にできます。包括的なカバレッジの場合、proxychains を使用してネットワーク呼び出しをインターセプトするか、iptables を設定して送信トラフィックを透過プロキシにリダイレクトできます。
透過プロキシはネットワークレベルでトラフィックをインターセプトするため、クライアントはそれを使用するように設定する必要がありません。通常のプロキシはクライアントが明示的に接続して HTTP CONNECT または SOCKS を話す必要があります。透過プロキシ(Squid または透過モードの mitmproxy など)は、リダイレクトされた生の TCP 接続を処理できます。
ファイルシステム設定
ファイルシステム制御は、エージェントが読み取りおよび書き込みできるファイルを決定します。読み取り専用コードマウント
エージェントがコードを分析する必要があるが変更しない場合は、ディレクトリを読み取り専用でマウントします。書き込み可能な場所
エージェントがファイルを書き込む必要がある場合、変更を永続化するかどうかに応じて、いくつかのオプションがあります。 コンテナ内の一時的なワークスペースの場合、メモリ内にのみ存在し、コンテナが停止したときにクリアされるtmpfs マウントを使用します。