Claude CodeとAgent SDKは、コードの実行、ファイルへのアクセス、外部サービスとのやり取りをユーザーに代わって行うことができる強力なツールです。これらの機能を持つあらゆるツールと同様に、適切な制御を維持しながらメリットを得るためには、慎重にデプロイすることが重要です。
事前に決められたコードパスに従う従来のソフトウェアとは異なり、これらのツールはコンテキストと目標に基づいてアクションを動的に生成します。この柔軟性が有用である理由ですが、同時にその動作が処理するコンテンツ(ファイル、ウェブページ、ユーザー入力)の影響を受ける可能性があることも意味します。これはプロンプトインジェクションと呼ばれることがあります。例えば、リポジトリのREADMEに通常とは異なる指示が含まれている場合、Claude Codeはオペレーターが予期しない方法でそれらをアクションに組み込む可能性があります。このガイドでは、このリスクを軽減するための実践的な方法を説明します。
良いニュースは、エージェントのデプロイメントを保護するために特殊なインフラストラクチャは必要ないということです。半信頼コードの実行に適用されるのと同じ原則がここでも適用されます:分離、最小権限、多層防御です。Claude Codeには一般的な懸念に対応するいくつかのセキュリティ機能が含まれており、このガイドではそれらに加えて、より強化が必要な場合の追加オプションについても説明します。
すべてのデプロイメントに最大限のセキュリティが必要なわけではありません。ラップトップでClaude Codeを実行する開発者と、マルチテナント環境で顧客データを処理する企業では、要件が異なります。このガイドでは、Claude Codeの組み込みセキュリティ機能から強化された本番アーキテクチャまでのオプションを提示しているため、状況に合ったものを選択できます。
エージェントは、プロンプトインジェクション(処理するコンテンツに埋め込まれた指示)やモデルエラーにより、意図しないアクションを実行する可能性があります。Claudeモデルはこれに耐性を持つよう設計されており、モデルカードで分析したように、Claude Opus 4.6は利用可能な最も堅牢なフロンティアモデルであると考えています。
それでも多層防御は良い実践です。例えば、エージェントが顧客データを外部サーバーに送信するよう指示する悪意のあるファイルを処理した場合、ネットワーク制御によりそのリクエストを完全にブロックできます。
Claude Codeには一般的な懸念に対応するいくつかのセキュリティ機能が含まれています。詳細についてはセキュリティドキュメントを参照してください。
Claude Codeのデフォルトを超える追加の強化が必要なデプロイメントでは、以下の原則が利用可能なオプションの指針となります。
セキュリティ境界は、異なる信頼レベルのコンポーネントを分離します。高セキュリティのデプロイメントでは、機密リソース(認証情報など)をエージェントを含む境界の外側に配置できます。エージェントの環境で何か問題が発生しても、その境界の外側にあるリソースは保護されたままです。
例えば、エージェントにAPIキーへの直接アクセスを与える代わりに、エージェントの環境の外側でプロキシを実行し、リクエストにキーを注入することができます。エージェントはAPI呼び出しを行えますが、認証情報自体を見ることはありません。このパターンは、マルチテナントデプロイメントや信頼できないコンテンツを処理する場合に有用です。
必要に応じて、エージェントを特定のタスクに必要な機能のみに制限できます:
| リソース | 制限オプション |
|---|---|
| ファイルシステム | 必要なディレクトリのみをマウント、読み取り専用を推奨 |
| ネットワーク | プロキシ経由で特定のエンドポイントに制限 |
| 認証情報 | 直接公開するのではなくプロキシ経由で注入 |
| システム機能 | コンテナ内でLinux capabilityを削除 |
高セキュリティ環境では、複数の制御を重ねることで追加の保護を提供します。オプションには以下が含まれます:
適切な組み合わせは、脅威モデルと運用要件によって異なります。
異なる分離技術は、セキュリティ強度、パフォーマンス、運用の複雑さの間で異なるトレードオフを提供します。
これらすべての構成において、Claude Code(またはAgent SDKアプリケーション)は分離境界内(サンドボックス、コンテナ、またはVM)で実行されます。以下で説明するセキュリティ制御は、エージェントがその境界内からアクセスできるものを制限します。
| 技術 | 分離強度 | パフォーマンスオーバーヘッド | 複雑さ |
|---|---|---|---|
| サンドボックスランタイム | 良好(安全なデフォルト) | 非常に低い | 低い |
| コンテナ(Docker) | セットアップに依存 | 低い | 中程度 |
| gVisor | 優秀(正しいセットアップの場合) | 中/高 | 中程度 |
| VM(Firecracker、QEMU) | 優秀(正しいセットアップの場合) | 高い | 中/高 |
コンテナなしの軽量な分離には、sandbox-runtimeがOSレベルでファイルシステムとネットワークの制限を適用します。
主な利点はシンプルさです:Docker設定、コンテナイメージ、ネットワーク設定は不要です。プロキシとファイルシステムの制限が組み込まれています。許可するドメインとパスを指定する設定ファイルを提供します。
仕組み:
bubblewrap、macOSではsandbox-exec)を使用して、設定されたパスへの読み取り/書き込みアクセスを制限セットアップ:
npm install @anthropic-ai/sandbox-runtime次に、許可するパスとドメインを指定する設定ファイルを作成します。
セキュリティに関する考慮事項:
同一ホストカーネル: VMとは異なり、サンドボックス化されたプロセスはホストカーネルを共有します。カーネルの脆弱性により理論的にはエスケープが可能になる可能性があります。一部の脅威モデルではこれは許容されますが、カーネルレベルの分離が必要な場合は、gVisorまたは別のVMを使用してください。
TLSインスペクションなし: プロキシはドメインを許可リストに登録しますが、暗号化されたトラフィックは検査しません。エージェントが許可されたドメインに対して寛容な認証情報を持っている場合、そのドメインを使用して他のネットワークリクエストをトリガーしたり、データを流出させたりすることができないことを確認してください。
多くの単一開発者やCI/CDのユースケースでは、sandbox-runtimeは最小限のセットアップでセキュリティレベルを大幅に向上させます。以下のセクションでは、より強力な分離が必要なデプロイメント向けのコンテナとVMについて説明します。
コンテナはLinux名前空間を通じて分離を提供します。各コンテナはファイルシステム、プロセスツリー、ネットワークスタックの独自のビューを持ちながら、ホストカーネルを共有します。
セキュリティ強化されたコンテナ設定は次のようになります:
docker run \
--cap-drop ALL \
--security-opt no-new-privileges \
--security-opt seccomp=/path/to/seccomp-profile.json \
--read-only \
--tmpfs /tmp:rw,noexec,nosuid,size=100m \
--tmpfs /home/agent:rw,noexec,nosuid,size=500m \
--network none \
--memory 2g \
--cpus 2 \
--pids-limit 100 \
--user 1000:1000 \
-v /path/to/code:/workspace:ro \
-v /var/run/proxy.sock:/var/run/proxy.sock:ro \
agent-image各オプションの説明:
| オプション | 目的 |
|---|---|
--cap-drop ALL | 権限昇格を可能にするNET_ADMINやSYS_ADMINなどのLinux capabilityを削除 |
--security-opt no-new-privileges | setuidバイナリを通じたプロセスの権限取得を防止 |
--security-opt seccomp=... | 利用可能なsyscallを制限;Dockerのデフォルトは約44をブロック、カスタムプロファイルでさらに多くをブロック可能 |
--read-only | コンテナのルートファイルシステムを不変にし、エージェントが変更を永続化するのを防止 |
--tmpfs /tmp:... | コンテナ停止時にクリアされる書き込み可能な一時ディレクトリを提供 |
--network none | すべてのネットワークインターフェースを削除;エージェントは以下のマウントされたUnixソケットを通じて通信 |
--memory 2g | リソース枯渇を防ぐためにメモリ使用量を制限 |
--pids-limit 100 | フォーク爆弾を防ぐためにプロセス数を制限 |
--user 1000:1000 | 非rootユーザーとして実行 |
-v ...:/workspace:ro | コードを読み取り専用でマウントし、エージェントが分析はできるが変更はできないようにする。~/.ssh、~/.aws、~/.configなどの機密ホストディレクトリのマウントは避けてください |
-v .../proxy.sock:... | コンテナの外側で実行されているプロキシに接続されたUnixソケットをマウント(以下参照) |
Unixソケットアーキテクチャ:
--network noneを使用すると、コンテナにはネットワークインターフェースがまったくありません。エージェントが外部と通信する唯一の方法は、マウントされたUnixソケットを通じてであり、これはホスト上で実行されているプロキシに接続されています。このプロキシは、ドメイン許可リストの適用、認証情報の注入、すべてのトラフィックのログ記録を行えます。
これはsandbox-runtimeで使用されているのと同じアーキテクチャです。エージェントがプロンプトインジェクションにより侵害されたとしても、任意のサーバーにデータを流出させることはできません—プロキシを通じてのみ通信でき、プロキシがどのドメインに到達可能かを制御します。詳細については、Claude Codeサンドボックスに関するブログ記事を参照してください。
追加の強化オプション:
| オプション | 目的 |
|---|---|
--userns-remap | コンテナのrootを非特権ホストユーザーにマッピング;デーモン設定が必要だが、コンテナエスケープからの被害を制限 |
--ipc private | プロセス間通信を分離し、コンテナ間攻撃を防止 |
標準的なコンテナはホストカーネルを共有します:コンテナ内のコードがシステムコールを行うと、ホストを実行しているのと同じカーネルに直接送られます。これは、カーネルの脆弱性がコンテナエスケープを可能にする可能性があることを意味します。gVisorは、システムコールがホストカーネルに到達する前にユーザースペースでインターセプトし、実際のカーネルを関与させずにほとんどのsyscallを処理する独自の互換性レイヤーを実装することで、この問題に対処します。
エージェントが悪意のあるコード(おそらくプロンプトインジェクションによる)を実行した場合、そのコードはコンテナ内で実行され、カーネルエクスプロイトを試みる可能性があります。gVisorを使用すると、攻撃対象面ははるかに小さくなります:悪意のあるコードはまずgVisorのユーザースペース実装をエクスプロイトする必要があり、実際のカーネルへのアクセスは制限されます。
gVisorをDockerで使用するには、runscランタイムをインストールしてデーモンを設定します:
// /etc/docker/daemon.json
{
"runtimes": {
"runsc": {
"path": "/usr/local/bin/runsc"
}
}
}次に、以下のようにコンテナを実行します:
docker run --runtime=runsc agent-imageパフォーマンスに関する考慮事項:
| ワークロード | オーバーヘッド |
|---|---|
| CPU集約型の計算 | 約0%(syscallインターセプションなし) |
| 単純なsyscall | 約2倍遅い |
| ファイルI/O集約型 | 頻繁なopen/closeパターンで最大10-200倍遅い |
マルチテナント環境や信頼できないコンテンツを処理する場合、追加の分離はオーバーヘッドに見合う価値があることが多いです。
VMはCPU仮想化拡張機能を通じてハードウェアレベルの分離を提供します。各VMは独自のカーネルを実行し、強力な境界を作成します—ゲストカーネルの脆弱性がホストを直接侵害することはありません。ただし、VMがgVisorなどの代替手段よりも自動的に「より安全」であるわけではありません。VMのセキュリティはハイパーバイザーとデバイスエミュレーションコードに大きく依存します。
Firecrackerは軽量なmicroVM分離向けに設計されており、125ms未満でVMを起動でき、メモリオーバーヘッドは5 MiB未満で、不要なデバイスエミュレーションを排除して攻撃対象面を削減します。
このアプローチでは、エージェントVMには外部ネットワークインターフェースがありません。代わりに、vsock(仮想ソケット)を通じて通信します。すべてのトラフィックはvsockを通じてホスト上のプロキシにルーティングされ、プロキシがリクエストを転送する前に許可リストの適用と認証情報の注入を行います。
クラウドデプロイメントでは、上記の分離技術のいずれかをクラウドネイティブのネットワーク制御と組み合わせることができます:
credential_injectorフィルターを備えたEnvoyなど)を実行エージェントはAPIの呼び出し、リポジトリへのアクセス、クラウドサービスとのやり取りに認証情報が必要になることがよくあります。課題は、認証情報自体を公開せずにこのアクセスを提供することです。
推奨されるアプローチは、エージェントのセキュリティ境界の外側でプロキシを実行し、送信リクエストに認証情報を注入することです。エージェントは認証情報なしでリクエストを送信し、プロキシがそれらを追加して、リクエストを宛先に転送します。
このパターンにはいくつかの利点があります:
Claude Codeは、サンプリングリクエストをプロキシ経由でルーティングする2つの方法をサポートしています:
オプション1: ANTHROPIC_BASE_URL(シンプルだがサンプリングAPIリクエストのみ)
export ANTHROPIC_BASE_URL="http://localhost:8080"これにより、Claude CodeとAgent SDKはAnthropicのAPIに直接ではなく、プロキシにサンプリングリクエストを送信するようになります。プロキシはプレーンテキストのHTTPリクエストを受信し、検査・変更(認証情報の注入を含む)してから、実際のAPIに転送できます。
オプション2: HTTP_PROXY / HTTPS_PROXY(システム全体)
export HTTP_PROXY="http://localhost:8080"
export HTTPS_PROXY="http://localhost:8080"Claude CodeとAgent SDKはこれらの標準環境変数を尊重し、すべてのHTTPトラフィックをプロキシ経由でルーティングします。HTTPSの場合、プロキシは暗号化されたCONNECTトンネルを作成します:TLSインターセプションなしではリクエストの内容を見たり変更したりすることはできません。
独自のプロキシを構築するか、既存のものを使用できます:
credential_injectorフィルターを備えた本番グレードのプロキシAnthropic APIからのサンプリング以外にも、エージェントはgitリポジトリ、データベース、内部APIなど、他のサービスへの認証済みアクセスが必要になることがよくあります。主に2つのアプローチがあります:
エージェントのセキュリティ境界の外側で実行されているサービスにリクエストをルーティングするMCPサーバーまたはカスタムツールを通じてアクセスを提供します。エージェントはツールを呼び出しますが、実際の認証済みリクエストは外側で行われます—ツールは認証情報を注入するプロキシを呼び出します。
例えば、git MCPサーバーはエージェントからのコマンドを受け入れますが、ホスト上で実行されているgitプロキシに転送し、リモートリポジトリに接続する前に認証を追加します。エージェントは認証情報を見ることはありません。
利点:
Anthropic API呼び出しの場合、ANTHROPIC_BASE_URLを使用してリクエストをプレーンテキストで検査・変更できるプロキシにルーティングできます。しかし、他のHTTPSサービス(GitHub、npmレジストリ、内部API)の場合、トラフィックはエンドツーエンドで暗号化されていることが多く、HTTP_PROXY経由でプロキシにルーティングしても、プロキシは不透明なTLSトンネルしか見えず、認証情報を注入できません。
カスタムツールを使用せずに任意のサービスへのHTTPSトラフィックを変更するには、トラフィックを復号化し、検査または変更してから、転送前に再暗号化するTLS終端プロキシが必要です。これには以下が必要です:
HTTP_PROXY/HTTPS_PROXYを設定してトラフィックをプロキシ経由でルーティングこのアプローチはカスタムツールを書かずにHTTPベースのサービスを処理できますが、証明書管理に関する複雑さが増します。
すべてのプログラムが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接続を処理できます。
どちらのアプローチでも、TLS終端プロキシと信頼されたCA証明書は必要です—トラフィックが実際にプロキシに到達することを保証するだけです。
ファイルシステム制御は、エージェントが読み書きできるファイルを決定します。
エージェントがコードを分析する必要があるが変更する必要がない場合、ディレクトリを読み取り専用でマウントします:
docker run -v /path/to/code:/workspace:ro agent-imageコードディレクトリへの読み取り専用アクセスでも認証情報が公開される可能性があります。マウント前に除外またはサニタイズすべき一般的なファイル:
| ファイル | リスク |
|---|---|
.env、.env.local | APIキー、データベースパスワード、シークレット |
~/.git-credentials | プレーンテキストのGitパスワード/トークン |
~/.aws/credentials | AWSアクセスキー |
~/.config/gcloud/application_default_credentials.json | Google Cloud ADCトークン |
~/.azure/ | Azure CLI認証情報 |
~/.docker/config.json | Dockerレジストリ認証トークン |
~/.kube/config | Kubernetesクラスター認証情報 |
.npmrc、.pypirc | パッケージレジストリトークン |
*-service-account.json | GCPサービスアカウントキー |
*.pem、*.key | 秘密鍵 |
必要なソースファイルのみをコピーするか、.dockerignoreスタイルのフィルタリングの使用を検討してください。
エージェントがファイルを書き込む必要がある場合、変更を永続化するかどうかに応じていくつかのオプションがあります:
コンテナ内の一時的なワークスペースには、メモリ内にのみ存在しコンテナ停止時にクリアされるtmpfsマウントを使用します:
docker run \
--read-only \
--tmpfs /tmp:rw,noexec,nosuid,size=100m \
--tmpfs /workspace:rw,noexec,size=500m \
agent-image変更を永続化する前にレビューしたい場合、オーバーレイファイルシステムを使用すると、エージェントは基盤となるファイルを変更せずに書き込みができます—変更は検査、適用、または破棄できる別のレイヤーに保存されます。完全に永続的な出力には、専用のボリュームをマウントしますが、機密ディレクトリとは別に保持してください。
Was this page helpful?