サンドボックス化された Bash ツールを設定する
組み込みのサンドボックスを使用して、Claude Code のシェルコマンドがアクセスできるファイルとネットワークホストを制限します。サンドボックスをオンにし、境界を設定し、それによって生じる問題を解決します。
Bash サンドボックスは、Claude がユーザーのマシン上で実行するシェルコマンドの周囲に、オペレーティングシステムが適用する境界です。これらのコマンドがアクセスできるファイルとネットワークドメインを設定すると、その制限は Bash、PowerShell、Monitor の各コマンドと、それらが起動するプロセスに適用されます。コマンドの実行中にオペレーティングシステムが制限を適用するため、Claude Code はサンドボックス化されたコマンドを 1 つずつ承認を求めることなく実行できます。
サンドボックスの対象はシェルコマンドのみです。Claude のファイルツール、MCP サーバー、フックはサンドボックスの外で実行されます。
サンドボックスは macOS、Linux、WSL2 で動作します。ネイティブ Windows では、Claude Code はコマンドをサンドボックス化せずに実行します。Windows マシンでサンドボックスを使用するには、WSL2 ディストリビューション内で Claude Code を実行してください。
サンドボックスが制限する内容
サンドボックスがオンの間、Claude が実行するシェルコマンドはその境界内で起動し、それらのコマンドが起動するプロセスも同様に境界内で起動します。サンドボックスはデフォルトでオフです。オンにするには、はじめにで示すようにセッションで /sandbox を実行するか、~/.claude/settings.json などの設定ファイルで sandbox.enabled を true に設定します。
次の表は、サンドボックス化されたコマンドがデフォルトでアクセスできる範囲と、各デフォルトを変更する設定を示しています。
| アクセス | デフォルト | 変更方法 |
|---|---|---|
| 書き込み | 作業ディレクトリ、ユーザーごとの一時ディレクトリ、および追加したディレクトリ。保護されたパスは書き込みが拒否されたままです | filesystem.allowWrite、filesystem.denyWrite |
| 読み取り | ~/.ssh や ~/.aws/credentials などの認証情報ファイルを含む、マシンの大部分 |
filesystem.denyRead、credentials |
| ネットワーク | 外部への直接のルートはありません。接続はマシン上のプロキシを経由し、プロキシが各ホストを許可ドメインと照合します。許可ドメインは最初は空です。その他のホストの扱いは権限モードによって決まります | network.allowedDomains、network.deniedDomains |
| 環境変数 | Claude Code から継承され、その環境内のシークレットも含まれます | credentials、CLAUDE_CODE_SUBPROCESS_ENV_SCRUB |
Claude Code は、オープンソースの @anthropic-ai/sandbox-runtime パッケージを基にサンドボックスをビルドしています。
サンドボックスの外で実行されるもの
サンドボックスはシェルコマンドをラップします。次のツールとプロセスはサンドボックスの外で実行されます。
- 組み込みのファイルツールと Web ツール:Read、Edit、Write、WebFetch、WebSearch などのツールは、代わりに権限ルールに従います。
denyReadエントリは Read ツールを止めず、allowedDomainsは WebFetch を制限しません - Claude Code が起動するその他のプロセス:コマンドフック、ローカルの MCP サーバー、プラグインモニター、LSP サーバー、およびステータスラインコマンドや
apiKeyHelperなどのヘルパーコマンドは、ユーザーの完全なアクセス権で実行されます
設定によっては、一部のシェルコマンドもサンドボックスの外で実行されます。
- 自分で入力したコマンド:
!シェルモードのプロンプトで入力したコマンドは、ほとんどのセッションでサンドボックス化されずに実行されます。入力したコマンドがサンドボックス内で実行されるセッションについては、厳格サンドボックスモードを参照してください - 除外されたコマンド:
excludedCommandsに一致するコマンドは、サンドボックス化されずに実行されます - サンドボックス外での再試行:Claude は、通常はサンドボックス内でコマンドが失敗した後に、そのコマンドをサンドボックス外で実行するよう求めることがあります
このセクションで挙げたツール、プロセス、コマンドを 1 つの境界の内側に置くには、Claude Code プロセス自体をコンテナ、仮想マシン、またはサンドボックスランタイム内で実行します。
はじめに
サンドボックスは Claude Code に組み込まれています。インストールが必要なものはプラットフォームによって異なります。
- macOS:サンドボックス化には組み込みの Seatbelt フレームワークが使われるため、そのまま手順に進めます
- Linux と WSL2:サンドボックスは
bubblewrapとsocatに依存しています。これらについては Linux と WSL2 のセットアップで説明しています。まだインストールしていなくても、/sandboxから始められます。そのパネルに不足しているものが表示されるためです
/sandbox を実行する
Claude Code のセッションを開始し、/sandbox コマンドを実行します。
/sandbox
これによりサンドボックスパネルが開きます。パネルには 3 つのタブがあり、Linux でオプションの seccomp フィルターが不足している場合はさらに Dependencies タブが表示されます。
- Mode:サンドボックス化されたコマンドの承認方法を選択します。次のステップで説明します
- Overrides:サンドボックス内で失敗したコマンドを、サンドボックス外での実行にフォールバックできるかどうかを選択します。これは
allowUnsandboxedCommands設定です - Config:解決済みのサンドボックス設定を表示します
パネルに Dependencies タブしか表示されない場合は、必須パッケージが不足しています。Linux と WSL2 のセットアップの説明に従ってインストールし、Claude Code を再起動してから、もう一度 /sandbox を実行してください。
モードを選択する
Mode タブで、auto-allow または regular permissions を選択します。auto-allow ではサンドボックス化されたコマンドがプロンプトなしで実行され、regular permissions ではコマンドがサンドボックス化されていても通常の権限プロンプトが維持されます。auto-allow モードでもプロンプトが表示されるコマンドについては、サンドボックスモードを参照してください。
Bash コマンドを実行する
ビルドやテストスイートなどのコマンドを実行するよう Claude に依頼します。デフォルトでは、サンドボックス内のコマンドは、作業ディレクトリ、ユーザーごとの一時ディレクトリ、および --add-dir、/add-dir、permissions.additionalDirectories で追加したディレクトリに書き込めます。
コマンドが新しいネットワークドメインを初めて必要とするとき、Claude Code は承認を求めるプロンプトを表示します。auto モードでは代わりに、コマンドが必要とするホストを Claude がコマンド自体に記載し、分類器がそれをコマンドとともに審査します。
サンドボックスが許可する範囲を広げたり狭めたりするには、サンドボックス化の設定を参照してください。
コンテナ内でサンドボックス化されたコマンドが Operation not permitted で失敗する場合は、コンテナ内で Bubblewrap の起動に失敗するを参照してください。
パネルでモードを選択すると、Claude Code はそれをプロジェクトのローカル設定 .claude/settings.local.json に保存します。この設定は現在のプロジェクトに適用されます。Claude Code はそこに設定を保存するときに、そのファイルをグローバル gitignore に追加します。すべてのプロジェクトでサンドボックスを有効にするには、ユーザー設定 ~/.claude/settings.json で sandbox.enabled を true に設定します。組織内のすべての開発者にサンドボックス化を強制するには、管理設定を使用します。
設定ファイルに書き込まずに 1 つのセッションだけサンドボックスを変更するには、--settings を付けて Claude Code を起動します。たとえば次のコマンドは、ブロックされたコマンドを Claude がサンドボックス外で再試行できない、サンドボックス化されたセッションを開始します。
claude --settings '{"sandbox": {"enabled": true, "allowUnsandboxedCommands": false}}'
デフォルトでは、依存関係が不足している、またはプラットフォームがサポートされていないためにサンドボックスを起動できない場合、Claude Code はサンドボックス化せずにコマンドを実行します。代わりに起動時に Claude Code を終了させるには、sandbox.failIfUnavailable を true に設定します。サンドボックス化をセキュリティゲートとして必須とする管理されたデプロイでは、この設定を使用できます。
コマンドがサンドボックス内で実行されることを確認する
サンドボックスが機能していることを確認するには、表の各行を実行するよう Claude に依頼します。! プロンプトで入力したものは通常サンドボックス外で実行されるため、自分で行を入力してもテストにはなりません。
| コマンド | サンドボックス内での結果 |
|---|---|
touch ~/sandbox-probe |
macOS では Operation not permitted、Linux と WSL2 では Read-only file system で失敗します |
curl --noproxy '*' https://example.com |
コマンドにはサンドボックスプロキシを迂回する経路がないため、Could not resolve host で失敗します |
失敗したコマンドをサンドボックス外で再試行するよう Claude が求めてきた場合は、再試行を拒否してください。touch が成功し、ホームディレクトリがサンドボックスでコマンドの書き込みが許可されているディレクトリに含まれていない場合は、~/sandbox-probe を削除してください。その後、/sandbox を実行して、サンドボックスがオンになっていることと、その依存関係がインストールされていることを確認します。
Linux と WSL2 のセットアップ
Linux と WSL2 では、サンドボックスは次のパッケージに依存しています。
bubblewrap:ファイルシステムの分離を強制する、特権不要のサンドボックス化ツールsocat:ネットワークトラフィックをサンドボックスプロキシ経由でルーティングするために使われるリレー
ディストリビューションのパッケージマネージャーでインストールします。
sudo apt-get install bubblewrap socat
sudo dnf install bubblewrap socat
依存関係が不足している場合、/sandbox の Dependencies タブには、ripgrep、bubblewrap、socat、seccomp フィルターのうちプラットフォームに不足しているものが一覧表示されます。インストールして Claude Code を再起動した後にこのタブが表示されなければ、すべての依存関係がそろっています。
Ripgrep はネイティブの Claude Code バイナリに同梱されています。seccomp フィルターはオプションで、Unix ドメインソケットのブロックを追加します。不足している場合は npm install -g @anthropic-ai/sandbox-runtime でインストールしてください。
必須の依存関係が不足している場合、インストールするまで Dependencies タブだけが表示されます。オプションの seccomp フィルターだけが不足している場合は、Dependencies タブが他のタブと並んで表示されます。依存関係のチェックは起動時に実行されるため、/sandbox にパッケージを検出させるには、インストール後に Claude Code を再起動してください。
WSL2 内も含め、環境がこの制限を強制しているかどうかを確認するには、`sysctl kernel.apparmor_restrict_unprivileged_userns` を実行します。コマンドが `0` を返す場合は、このステップをスキップしてください。`No such file or directory` エラーが表示される場合は、キーが存在しないため、このステップをスキップできます。`1` を返す場合は、`bwrap` にこの機能を付与する AppArmor プロファイルを追加します。
```bash theme={null}
sudo tee /etc/apparmor.d/bwrap > /dev/null <<'EOF'
abi <abi/4.0>,
include <tunables/global>
profile bwrap /usr/bin/bwrap flags=(unconfined) {
userns,
include if exists <local/bwrap>
}
EOF
```
このプロファイルは `bwrap` 自体にのみ適用され、サンドボックス内で `bwrap` が実行するコマンドには適用されません。適用するには AppArmor を再読み込みします。
```bash theme={null}
sudo systemctl reload apparmor
```
WSL2 に関する注意事項
PowerShell から wsl -l -v を実行して WSL のバージョンを確認します。Sandboxing requires WSL2 と表示される場合、ディストリビューションは WSL1 で実行されています。WSL2 にアップグレードするか、サンドボックス化せずに Claude Code を実行してください。
WSL2 では、cmd.exe、powershell.exe、または /mnt/c/ 配下のものなど Windows バイナリの起動を、WSL が Unix ソケット経由で Windows ホストに引き渡します。そのため、サンドボックス化されたコマンドがそれらを起動できるかどうかは、サンドボックスの Unix ソケット設定に従います。そもそもソケットをブロックするには、オプションの seccomp フィルターがインストールされている必要があります。これらの起動を許可するには、allowAllUnixSockets を設定します。これにより、サンドボックス化されたコマンドにすべての Unix ソケットが開放されます。
サンドボックスモード
Claude Code には 2 つのサンドボックスモードがあります。どちらのモードでも、サンドボックスは同じファイルシステムとネットワークの制限を強制します。違いは、サンドボックス化されたコマンドが自動承認されるか、明示的な権限が必要かという点だけです。
auto-allow モード
コマンドがサンドボックス内で実行される場合、Claude Code はプロンプトなしでそのコマンドを自動的に承認します。コマンドが excludedCommands に一致するため、または Claude がサンドボックス外で再試行するためにサンドボックス外で実行される場合、そのコマンドは通常の権限フローを経由します。
許可していないホストに接続するサンドボックス化されたコマンドは、サンドボックス内にとどまります。接続を通すかどうかを誰が決めるかについては、許可されたドメイン外のホストで説明しています。
auto-allow モードでも、次の点は引き続き適用されます。
- 明示的な拒否ルールは常に尊重されます
- 重要なパスを対象とする
rmまたはrmdirコマンドは、引き続き通常の権限フローを経由します Bash(git push *)のような内容を限定した確認ルールは、サンドボックス化されたコマンドであっても引き続きプロンプトを強制します- 単独の
Bash確認ルール、またはそれと同等のBash(*)形式は、サンドボックス化されて実行されるコマンドではスキップされます。通常の権限フローにフォールバックするコマンドには引き続き適用されます。plan モードでは、このルールはスキップされず、読み取り専用のものも含め、サンドボックス化されたコマンドに対してもプロンプトを表示します
auto-allow モードは権限モードの設定とは独立して動作しますが、例外が 3 つあります。plan モード、コマンドごとの許可ドメインを持つ auto モードのコマンド、そして auto モードでのサンドボックス化されたコマンドに対するサーバー側の分類器による審査です。「accept edits」モードでなくても、auto-allow が有効な場合、サンドボックス化された Bash コマンドは自動的に実行されます。つまり、ファイル編集ツールであればプロンプトが表示される Manual モードでも、サンドボックスの境界内でファイルを変更する Bash コマンドはプロンプトなしで実行されます。
plan モードでは、auto-allow によって承認の範囲は広がりません。計画中に Claude Code がコマンドをどのように制御するかについては、plan モードを参照してください。
regular permissions モード
すべての Bash コマンドは、サンドボックス化されている場合でも通常の権限フローを経由します。より細かく制御できますが、より多くの承認が必要になります。
サンドボックス外での再試行という抜け道
サンドボックス外での再試行は、サンドボックスと互換性のないツールなど、サンドボックス内で失敗するコマンドのための抜け道です。サンドボックスがネットワーク接続をブロックすると、Claude Code はコマンドの結果の中で拒否されたホストを示すため、Claude は何がブロックされたかを把握できます。Claude は失敗を分析し、dangerouslyDisableSandbox パラメーターを付けてコマンドを再試行することがあります。
再試行されたコマンドはサンドボックス外で実行されます。インタラクティブなターミナルセッションでは、誰が承認するかは権限モードによって異なります。
bypassPermissionsモード:再試行はプロンプトなしで実行されます- Manual モードと
acceptEditsモード:「Bash command (unsandboxed)」というタイトルのプロンプトが表示されます - auto モード:別の分類器モデルが基になるコマンドを評価します
dontAskモード:Claude Code は再試行を拒否します- plan モード:計画中に Claude Code がコマンドをどのように制御するかを参照してください
次のルールと設定によって、再試行を誰が承認するかが変わります。
- 一致する許可ルール:
Bash(curl *)などの許可ルールがコマンドに一致する場合、そのルールは再試行も承認するため、コマンドはプロンプトなしでサンドボックス外で実行されます - パラメーターに対する確認ルール:Bash の再試行時にプロンプトを表示させるには、
Bash(dangerouslyDisableSandbox:true)に対する確認ルールを追加します。auto モードとbypassPermissionsモードでもプロンプトが表示され、このルールは一致する許可ルールより優先されます permissions.blockReadsOutsideWorkingDirectories:これがオンの間にプロンプトが表示される再試行については、どのモードでも自動承認されないアクションで説明しています
strict sandbox モードで再試行をオフにする
サンドボックス設定で "allowUnsandboxedCommands": false を設定すると、サンドボックス外での再試行を無効にできます。再試行が無効になると、Claude Code は dangerouslyDisableSandbox パラメーターを無視します。これにより、サンドボックスが動作している間、Claude が実行するコマンドは excludedCommands のエントリに一致しない限りサンドボックス化されます。サンドボックスを起動できないときに Claude Code がコマンドをサンドボックス外で実行しないようにするには、failIfUnavailable も設定します。/sandbox の Overrides タブでは、この設定は Strict sandbox mode として表示されます。
ユーザー設定、--settings、または管理設定での false は、プロジェクトの設定で true が設定されていても維持されます。ユーザー設定での false によってサンドボックスが管理者必須になることはないため、プロジェクトのその他のサンドボックス設定は引き続き適用されます。v2.1.285 より前は、プロジェクトの true がユーザー設定の false を上書きしていました。
ユーザーまたは管理者が管理設定または --settings フラグで再試行を無効にすると、サンドボックスは管理者必須になります。その場合、Claude Code は、excludedCommands のエントリも含め、リポジトリのファイル内にあるサンドボックスを緩める設定を無視します。それらの一覧は、管理者必須のサンドボックスにおけるリポジトリ設定に記載されています。
strict sandbox モードは、Claude が実行するコマンドに適用されます。! シェルモードのプロンプトで自分で入力したコマンドは、セッションが次のいずれかでない限り、サンドボックス外で実行されます。
- バックグラウンドセッション:strict sandbox モードはシェルモードのコマンドにも適用されます
CLAUDE_CODE_SUBPROCESS_ENV_SCRUBが設定された Linux セッション:シェルモードのコマンドも含め、すべてのコマンドがサンドボックス化されて実行されます
v2.1.260 より前は、strict sandbox モードはすべてのセッションでシェルモードのコマンドをサンドボックス化していました。
一時ディレクトリ
デフォルトでは、作業ディレクトリに加えて、ユーザーごとの一時ディレクトリにもサンドボックス内から書き込めます。ファイルシステムの分離を無効にする場合を除き、Claude Code はサンドボックス化されたコマンドに対して $TMPDIR をこのディレクトリに設定するため、一時ファイルを書き込むツールは追加の設定なしで動作します。
サンドボックス化されていないコマンドは、シェルの $TMPDIR が設定されていればそれを継承します。そのため、ファイルシステムの分離がオンの間は、サンドボックス化されたコマンドとされていないコマンドで $TMPDIR が異なるディレクトリに解決されます。シェルで $TMPDIR が未設定または空の場合、$TMPDIR を参照するサンドボックス外のコマンドには、CLAUDE_CODE_TMPDIR による上書き値が渡されます。上書き値を設定していない場合や上書き値が長いパスである場合はオペレーティングシステムの一時ディレクトリが渡されるため、変数が空文字列に展開されることはありません。両者の間で一時ファイルを受け渡すには、代わりに作業ディレクトリ配下に書き込んでください。
サンドボックスを設定する
サンドボックスの動作は settings.json ファイルでカスタマイズできます。設定の完全なリファレンスについては、設定を参照してください。
デフォルトでは、サンドボックス化されたコマンドが書き込めるのは、現在の作業ディレクトリ、ユーザーごとの一時ディレクトリ、そして --add-dir、/add-dir、または permissions.additionalDirectories で追加したディレクトリです。kubectl、terraform、npm などのサブプロセスコマンドがこれらのディレクトリの外に書き込む必要がある場合は、sandbox.filesystem.allowWrite を使用して特定のパスへのアクセスを付与します。
{
"sandbox": {
"enabled": true,
"filesystem": {
"allowWrite": ["~/.kube", "/tmp/build"]
}
}
}
これらのパスは OS レベルで適用されるため、サンドボックス内で実行されるすべてのコマンドは、その子プロセスも含めてこれらに従います。ツールが特定の場所への書き込みアクセスを必要とする場合は、excludedCommands でツールをサンドボックスから完全に除外するのではなく、この方法を使用することを推奨します。
同じファイルシステム配列を複数の設定スコープで定義した場合、Claude Code はそれらをマージし、あるスコープの配列を別のスコープの配列で置き換えるのではなく、すべてのスコープのパスを結合します。開発者がポリシーを広げないようにするで説明しているロックがエントリを対象としている場合、Claude Code はそのエントリをマージから除外します。
CLI の --setting-sources や Agent SDK の settingSources で設定ソースを除外した場合、Claude Code はサンドボックス設定を構築する際に、そのソースの sandbox.filesystem エントリ、Edit 権限ルール、Read 拒否ルールを無視します。Claude Code v2.1.246 以降が必要です。
セッション中にこれらのファイルシステムリストを編集すると、Claude Code は実行中のセッションに変更を適用するため、次にサンドボックス化されたコマンドは新しいパスのもとで実行されます。
サンドボックスのファイルシステムパスは標準的な規則に従います。/tmp/build は絶対パスで、~/.kube はホームディレクトリからの相対パスです。これは、絶対パスに //path、プロジェクト相対パスに /path を使用する Read と Edit の権限ルールとは異なります。相対パス、末尾のスラッシュ、ワイルドカードについては、サンドボックスのパスプレフィックスを参照してください。
sandbox.filesystem.denyWrite と sandbox.filesystem.denyRead を使用して書き込みや読み取りのアクセスを拒否することもでき、sandbox.filesystem.allowRead を使用して拒否された領域内の特定のパスを再び許可することもできます。読み取りルールが重なる場合は、より狭いパスのルールが適用されます。
| ルールの例 | 結果 |
|---|---|
"denyRead": ["~/"] と "allowRead": ["~/projects"] |
~/projects は読み取り可能で、ホームディレクトリの残りはブロックされたままになります。より狭い許可が、拒否された領域のその部分を再び開きます |
"allowRead": ["~/"] と "denyRead": ["~/.env"] |
~/.env はブロックされたままで、ホームディレクトリの残りは読み取り可能です。拒否はより広い許可の内側でも維持されるため、広範な許可によってシークレットが気付かないうちに再び公開されることはありません |
"allowRead": ["~/"] と "denyRead": ["~/**/.env"] |
ホームディレクトリ配下のすべての .env はブロックされたままで、残りは読み取り可能です。ワイルドカードによる拒否も、正確なパスと同じようにより広い許可の内側で維持されます |
以下の例では、現在のプロジェクトからの読み取りを許可しつつ、ホームディレクトリ全体からの読み取りをブロックします。相対パス . がプロジェクトルートに解決されるのは設定がプロジェクト設定にある場合のみなので、この設定はプロジェクトの .claude/settings.json に配置してください。
{
"sandbox": {
"enabled": true,
"filesystem": {
"denyRead": ["~/"],
"allowRead": ["."]
}
}
}
同じ設定を ~/.claude/settings.json に配置した場合、. は代わりに ~/.claude に解決され、プロジェクトファイルは denyRead ルールによってブロックされたままになります。
作業ディレクトリを読み取り可能に保ちつつ、サンドボックス化されたコマンドによるホームディレクトリやマウントされたボリュームへの読み取りアクセスを拒否するには、パスルールを書く代わりに permissions.blockReadsOutsideWorkingDirectories を設定します。
`excludedCommands` でコマンドをサンドボックスの外で実行する
sandbox.excludedCommands にコマンドパターンを記載すると、一致するコマンドがサンドボックスの外で実行されます。つまり、ファイルシステムの制限もネットワークプロキシもありません。サンドボックス内では動作せず、完全なアクセス権を委ねても信頼できるツールに使用してください。ディレクトリやホストが 1 つ追加で必要なだけのツールであれば、コマンドをサンドボックス化したままにできる allowWrite や allowedDomains で動作する場合があります。
この例では、docker compose コマンドをサンドボックスから外します。すべてのプロジェクトに適用するには、~/.claude/settings.json に保存してください。
{
"sandbox": {
"enabled": true,
"excludedCommands": ["docker compose *"]
}
}
Claude Code は、Bash と Monitor の各呼び出しに対してエントリを照合します。呼び出しとは Claude が送信するコマンドライン全体であり、複数のコマンドが連結されている場合があります。呼び出しがサンドボックスの外に出るかどうかは、以下のルールによって決まります。
- パターンの末尾は
*にする: エントリはBash(...)の権限ルールと同じ構文を使用し、ワイルドカードのないパターンは完全一致になります。dockerは引数のないdockerのみに一致します。docker *は引数の有無にかかわらずdockerに一致します - 呼び出し内のすべてのコマンドが一致する必要がある:
npm ci && docker compose buildは、別のエントリがnpm ciをカバーしていない限り、サンドボックス化されたままです - Claude Code は呼び出しのテキストを照合する: 内部で
dockerを呼び出すスクリプトやmakeターゲットは一致せず、/usr/local/bin/dockerも一致しません - サンドボックス化されたままになる呼び出しがある: ファイルへのリダイレクト、
cd、または$(...)のようなコマンド置換があると、呼び出し全体がサンドボックス化されたままになります。サンドボックス化されたままになるその他の呼び出しについては、リファレンスのエントリに記載されています - エントリの保存場所が影響する場合がある: サンドボックスが管理者によって必須化されている間、Claude Code は
.claude/settings.jsonと.claude/settings.local.json内のエントリを無視します
除外されたコマンドは、通常の権限フローを経由します。
- 読み取り専用コマンドと、許可ルールでカバーされているコマンドは、プロンプトなしで実行されます
- auto モードでは、その他の除外されたコマンドを分類器がレビューします
bypassPermissionsモードでは、除外されたコマンドは確認ルールに一致しない限りプロンプトなしで実行されます
エントリが一致することを確認するには、Manual モードに切り替えて、docker compose up -d のような何かを変更する一致コマンドを実行するよう Claude に依頼します。権限プロンプトのタイトルは「Bash command (unsandboxed)」になります。
除外されたコマンドは、ユーザーの完全なアクセス権で実行されます。docker * のような広範なエントリは、そのツールができることすべてをカバーします。インタープリター、作業ディレクトリ内のスクリプト、またはそこにあるファイルに作用するツール(docker compose が compose ファイルに対して行うように)をカバーするパターンを書くと、Claude はそのファイルを書き込み、その後サンドボックスの外で実行できてしまいます。パターンを狭くするほど、Claude がサンドボックスの外で実行できるものは少なくなります。
ファイルシステム分離を無効にする
sandbox.filesystem.disabled を true に設定すると、ネットワーク分離を維持したままファイルシステム分離をスキップできます。以下の例では、ネットワークドメインの許可リストを維持したまま、ファイルシステム分離をオフにします。
{
"sandbox": {
"enabled": true,
"filesystem": {
"disabled": true
},
"network": {
"allowedDomains": ["github.com", "*.npmjs.org"]
}
}
}
サンドボックスには独立した 2 つのレイヤーがあります。ファイルシステム分離はサンドボックス化されたコマンドが読み書きできるパスを制御し、ネットワーク分離はそれらが到達できるドメインを制御します。ファイルシステムレイヤーをオフにすると、サンドボックス化されたコマンドはホストのファイルシステムに対して無制限の読み書きアクセスを得ますが、ネットワークの送信先は許可したドメインに限定されたままです。コマンドが何を書き込むかではなく、どこに接続するかを制御する目的でサンドボックスを使う場合に、このレイヤーをオフにしてください。
sandbox.filesystem.disabled のデフォルトは false です。Claude Code v2.1.216 以降が必要です。
ファイルシステム分離がオフでコマンドが自動許可されている場合、サンドボックス化されたコマンドは、シェルの起動ファイル、$PATH 上の実行ファイル、~/.claude/settings.json など、後続のコマンドが実行または読み取るファイルを書き込み、それを利用して次回の実行時に自身のアクセス権を広げることができます。filesystem.disabled を true に設定するのは、自身のアクセス権を昇格させないと信頼できるワークロードに限定してください。allowManagedDomainsOnly でネットワークドメインをロックするとリスクは狭まりますが、このロックはサンドボックス内で実行されるコマンドにのみ適用されるため、リスクがなくなるわけではありません。
無効にできる設定
ファイルシステム分離をオフにすると、サンドボックス化されたコマンドができることが広がるため、Claude Code は以下の設定ソースからの filesystem.disabled のみを尊重します。
- ユーザー設定、管理設定、および
--settingsCLI フラグで設定できます。.claude/settings.jsonと.claude/settings.local.jsonのプロジェクト設定では設定できないため、チェックアウトしたプロジェクトがファイルシステム分離をオフにすることはできません。 - 管理設定が
sandbox.filesystemを何らかの形で設定している場合、または"mode": "deny"のsandbox.credentials.filesエントリを記載している場合は、管理設定のみがこのキーを設定できます。これにより、管理者がデプロイしたファイルシステムの制限が有効なまま維持されます。そのようなデプロイを緩和するには、管理設定で"disabled": trueを設定します。 CLAUDE_CODE_SUBPROCESS_ENV_SCRUBが設定されている場合、Claude Code は管理設定を含むすべてのソースからのfilesystem.disabledを無視し、ファイルシステム分離をオンのまま維持します。
有効な mask エントリは、起動時に Claude Code がそのエントリについて deny にフォールバックした場合でも、このキーを固定しません。認証情報ディレクトリのようにマスクできないパスは、管理設定で明示的な deny エントリとして記載してください。これによりキーが固定されます。
ファイルシステム分離がオフのときに変わること
filesystem.disabled を設定すると、ファイルシステムレイヤー自体が適用している保護が解除されます。他のレイヤーが適用している保護は引き続き適用されます。
| 保護 | ファイルシステム分離がオフの場合 |
|---|---|
filesystem.denyRead と credentials.files の deny による読み取りブロック |
適用されません。どちらもファイルシステムレイヤーが適用しています |
credentials.envVars の deny と mask エントリ |
適用されます。環境変数の除去はファイルシステムレイヤーから独立しています |
マスクとして適用された credentials.files の mask エントリ |
適用されます。マスキングはファイルシステムレイヤーから独立しています。deny にフォールバックしたエントリは、他の deny エントリと同様に適用されません |
その他に 2 つの点が変わります。
-
サンドボックス化されたコマンドは、ユーザーごとの一時ディレクトリではなく、シェルの
$TMPDIRを継承します。すべての一時ディレクトリが書き込み可能になり、Claude Code がコマンドをユーザーごとの一時ディレクトリにリダイレクトしなくなるためです。Linux では、親シェルでこの変数が設定されていないことがよくあります。Bash ツールのガイダンスは、
$TMPDIRに頼るのではなくmktemp -dで作業用ディレクトリを作成するよう Claude に指示します。 -
autoAllowBashIfSandboxedのデフォルトは引き続きtrueであるため、サンドボックス化されたコマンドはプロンプトなしで実行され続けます。サンドボックス化されたコマンドでプロンプトを表示するには、falseに設定します。
認証情報を保護する
sandbox.credentials 設定では、サンドボックス化されたコマンドから保護する認証情報ファイルと環境変数を宣言します。各エントリには、ファイルパスまたは環境変数と、mode を指定します。専用の credentials ブロックを使うことで、認証情報のルールをまとめて、一般的なファイルシステムのルールとは分けて管理できます。
"mode": "deny" のエントリでは、ファイルパスはサンドボックス内での読み取りが拒否され(filesystem.denyRead が適用するのと同じ制限)、環境変数はサンドボックス化された各コマンドの実行前に未設定にされます。ファイルの保護はファイルシステムレイヤーの一部であるため、ファイルシステム分離を無効にした場合は適用されませんが、環境変数の保護は引き続き適用されます。
以下の例では、AWS の認証情報ファイルと SSH ディレクトリの読み取りをブロックし、サンドボックス化されたコマンドの環境から GITHUB_TOKEN と NPM_TOKEN を削除します。
{
"sandbox": {
"enabled": true,
"credentials": {
"files": [
{ "path": "~/.aws/credentials", "mode": "deny" },
{ "path": "~/.ssh", "mode": "deny" }
],
"envVars": [
{ "name": "GITHUB_TOKEN", "mode": "deny" },
{ "name": "NPM_TOKEN", "mode": "deny" }
]
}
}
}
環境変数のエントリとファイルのエントリは "mode": "mask" も受け付けます。これについては認証情報をマスクするで説明します。
ファイルパスは、sandbox.filesystem.* 設定と同じプレフィックスのルールに従います。
Claude Code は、セッションが読み込むすべての設定スコープの deny エントリをマージします。deny エントリはアクセスを狭めることしかしないため、どのスコープでも追加できますが、別のスコープが追加したエントリをどのスコープも削除することはできません。
設定ソースを除外した場合:
- プロジェクト設定またはローカル設定: Claude Code はそれらの
credentialsエントリをいずれも適用しません。Claude Code v2.1.246 以降が必要です。 - ユーザー設定: Claude Code は
~/.claude/settings.json内のdenyエントリを引き続き適用し、ファイルのmaskエントリも制限として維持します(ただし、それらはプロキシが実際の値に置換することを認可しなくなります)が、環境変数のmaskエントリは破棄します。
組み込みの認証情報拒否リストはないため、制限されるのは記載したファイルと変数のみです。
sandbox.credentials は、サンドボックス化された Bash コマンドにのみ影響します。サンドボックス化にかかわらずすべてのサブプロセスから認証情報を除去するには、CLAUDE_CODE_SUBPROCESS_ENV_SCRUB を設定します。
認証情報をマスクする
認証情報をマスクすると、Claude Code はサンドボックス化されたコマンドにセンチネルと呼ばれるセッションごとのプレースホルダーを見せ、サンドボックスプロキシが許可したホストへの送信リクエストで実際の値に置き換えます。認証情報を保護するで説明した deny エントリは、代わりに認証情報をブロックします。macOS 上のファイルについては、Claude Code はマスクする代わりにファイルをブロックします。すべてのフィールドは sandbox.credentials のリファレンスに記載されています。
マスキングには以下が必要です。
- TLS 終端: プロキシはリクエストの内容の中で実際の値を置換するため、その内容を参照できる必要があります。プロキシ自体が TLS を終端するように、
network.tlsTerminateを設定してください。これを設定しない場合、マスキングは何も漏らさずに失敗します。コマンドにはセンチネルしか見えませんが、センチネルはそのままサーバーに届き、認証が失敗します。Claude Code は起動時にこの設定ミスを報告します。 - 許可された送信先: 各
maskエントリにはinjectHosts(実際の値の送信先として許可されるホスト)を記載できます。プロキシはドメイン許可リストが許可する接続でのみ注入を行うため、各injectHostsのホストはnetwork.allowedDomainsを通じても到達可能である必要があります。injectHostsのないmaskエントリの場合、プロキシはnetwork.allowedDomains内のすべてのホストへのリクエストで実際の値に置換します。 - 信頼できる設定スコープ: マスキングはプロキシが実際の認証情報をどこかに送信することを認可するため、Claude Code は
maskエントリ、network.tlsTerminate、credentials.allowPlaintextInject、awsPairs、sigv4を、ユーザー設定、管理設定、および--settingsフラグからのみ尊重します。リポジトリの.claude/settings.jsonや.claude/settings.local.json内のこれらは無視されます。管理者がサーバー管理設定を通じてmaskエントリ、network.tlsTerminate、またはcredentials.allowPlaintextInjectを配布する場合、それらは承認が必要な設定として扱われます。
環境変数をマスクする
環境変数をマスクするには、その credentials.envVars エントリに "mode": "mask" を設定します。コマンドやそれがログに記録するものが実際の認証情報を保持することはありませんが、リクエストは引き続き認証されます。同じ変数がいずれかのスコープで deny として記載されている場合は、deny が優先されます。
以下の例では、2 つのトークンをマスクします。GH_TOKEN は api.github.com へのリクエストでのみ置換され、NPM_TOKEN は injectHosts がないため、network.allowedDomains 内のすべてのホストへのリクエストで置換されます。
{
"sandbox": {
"enabled": true,
"network": {
"tlsTerminate": {},
"allowedDomains": ["*.github.com", "registry.npmjs.org"]
},
"credentials": {
"envVars": [
{ "name": "GH_TOKEN", "mode": "mask", "injectHosts": ["api.github.com"] },
{ "name": "NPM_TOKEN", "mode": "mask" }
]
}
}
}
マスキングはデフォルトで値全体を置き換えます。DATABASE_URL 接続文字列や JWT のように構造を持つ値には、extract、decode、maskClaims、onExtractNoMatch フィールドを使用して、値を解析するツールが動作し続けるようにしてください。
IPv6 の送信先は、2 つのリストで異なる書き方をしてください。
network.allowedDomains:"[::1]"のような角括弧付きの形式injectHosts:"::1"のような、正規の圧縮形式による角括弧なしのアドレス
プロキシはポートを無視して各 injectHosts エントリを接続の角括弧なしの送信先アドレスと照合するため、角括弧付き、ゾーン ID 付き、または異なる圧縮方法で書かれたものは決して一致しません。claude doctor は、決して一致しないエントリを Sandbox credential injectHosts entries can never match their destination という警告で指摘します。このチェックには Claude Code v2.1.229 以降が必要です。
AWS リクエストを再署名する
AWS リクエストはリクエストの内容に対する SigV4 署名を持つため、AWS_ACCESS_KEY_ID と AWS_SECRET_ACCESS_KEY は一緒にマスクしてください。プロキシはアクセスキーのセンチネルによって SigV4 リクエストを検出し、実際の値でリクエストを再署名します。これには Claude Code v2.1.221 以降が必要です。シークレットのみをマスクすると、リクエストはプロキシが検出できないプレースホルダーで署名されるため、AWS で失敗します。
Claude Code は、慣例的な変数である AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN の値全体をマスクすると、それらを自動的に 1 つの認証情報として関連付けます。AWS の認証情報が別の名前の変数にある場合は、credentials.awsPairs でグループ化してください。これには Claude Code v2.1.224 以降が必要です。
ストリーミングアップロード、署名付き URL、SigV4A リクエストは、プロキシが再計算できない署名を持ちます。これらのリクエストがマスクされたペアのプレースホルダーで署名されている場合、プロキシは壊れた署名を転送するのではなく、リクエストを失敗させます。マスクされていない認証情報で署名されたリクエストが影響を受けることはありません。これらのリクエスト形式のいずれかを代わりに転送するには、credentials.sigv4 を使用します。これには Claude Code v2.1.224 以降が必要です。AWS は依然としてリクエストを拒否するため、呼び出し元のツールはプロキシエラーではなく AWS 自身の拒否レスポンスを受け取ります。
認証情報ファイルをマスクする
認証情報ファイルをマスクするには、その credentials.files エントリに "mode": "mask" を設定します。ファイルのマスキングには Claude Code v2.1.221 以降が必要です。サンドボックス化されたコマンドに何が見えるかは、プラットフォームによって異なります。
- Linux と WSL2: サンドボックス化されたコマンドはファイルのセンチネルコピーを読み取り、プロキシが送信リクエストで実際の値に置換します。
- macOS: サンドボックス化されたコマンドはファイルをまったく読み取れません。Claude Code はセンチネルコピーを作成しないため、そのファイルを使って認証するツールはサンドボックス内で動作しません。これは
denyと同じ効果です。ファイルシステム分離を無効にした場合でも、読み取りブロックは維持されます。
以下の例では、~/.config/gh/hosts.yml に保存された GitHub トークンをマスクします。extract パターンはファイルのどの部分がシークレットであるかを示すため、Linux と WSL2 では gh が設定の残りの部分を引き続き解析できます。
{
"sandbox": {
"enabled": true,
"network": {
"tlsTerminate": {},
"allowedDomains": ["*.github.com"]
},
"credentials": {
"files": [
{
"path": "~/.config/gh/hosts.yml",
"mode": "mask",
"extract": "oauth_token:\\s*(\\S+)",
"injectHosts": ["api.github.com"]
}
]
}
}
}
マスクが有効であることを確認するには、サンドボックス化されたコマンドで cat ~/.config/gh/hosts.yml を実行するよう Claude に依頼します。Linux と WSL2 では出力にトークンの代わりにセンチネルが表示され、macOS では読み取りが失敗します。
extract または decode がない場合、Claude Code はファイル全体を 1 つのセンチネルに置き換えます。これは、単独のシークレットだけを保持するファイルに適しています。部分的なマスキングと、パターンが何にも一致しない場合の動作を制御するには、extract、decode、maskClaims、onExtractNoMatch、maskDuplicates フィールドを使用してください。
照合でマスクするものが見つからなかった場合、onExtractNoMatch のデフォルト値である warn はエントリをスキップするため、サンドボックス化されたコマンドはマスクされていない実際のファイルを読み取れます。macOS では、ファイルシステム分離がオンのときは常に Claude Code がパターンの実行前に mask エントリを deny として適用するため、一致しない場合の結果が有効になるのはファイルシステム分離がオフの場合のみです。このデフォルトは正当に存在しない場合がある認証情報に適しています。シークレットが存在する可能性があるもののパターンがそれを見逃す可能性がある場合は、deny を使用してください。
mask は単一のファイルに適用されるため、各認証情報ファイルを個別に記載してください。Claude Code は、安全にマスクできない mask エントリ(ディレクトリパス、glob パターン、8 MiB を超えるファイル、UTF-8 テキストではないファイル)については deny にフォールバックします。
サンドボックス化の仕組み
ファイルシステムの分離
サンドボックス化された Bash ツールは、ファイルシステムへのアクセスを特定のディレクトリに制限します。
- デフォルトの書き込み動作: 現在の作業ディレクトリとそのサブディレクトリ、
--add-dir、/add-dir、またはpermissions.additionalDirectoriesで追加したディレクトリ、さらに$TMPDIRが指すユーザーごとの一時ディレクトリへの読み取りおよび書き込みアクセス - デフォルトの読み取り動作: 特定の拒否されたディレクトリを除き、コンピューター全体への読み取りアクセス。このデフォルトでは認証情報ファイルの読み取りも許可されるため、コマンドに読み取らせたくない認証情報を保護してください。
- 読み取りブロック:
permissions.blockReadsOutsideWorkingDirectoriesをオンにすると、サンドボックス化されたコマンドは、ブロック下のサンドボックス化されたコマンドに記載されたパスを除き、ホームディレクトリおよびユーザーファイルを保持するその他のディレクトリへの読み取りアクセスも失います。このセクションでは、ブロックのこの部分が適用されない場合についても説明しています。 - Git worktree: 作業ディレクトリがリンクされた git worktree である場合、サンドボックスはメインリポジトリの共有
.gitディレクトリへの書き込みも許可するため、git commitなどのコマンドで ref やインデックスを更新できます。そのディレクトリ内のhooks/とconfigへの書き込みは引き続き拒否されます。
ネットワークの分離を維持したままファイルシステムの分離を完全にスキップするには、sandbox.filesystem.disabled を設定します。
保護されたパス
サンドボックス化されたコマンドが書き込み可能なディレクトリ内であっても、サンドボックスは Claude Code が設定やコードを読み込むファイルへの書き込みを引き続き拒否します。これらのファイルを編集できるコマンドは、自身に権限を付与したり、Claude Code がサンドボックスの外で実行するフックや MCP サーバーを追加したりできてしまうためです。権限システムには独自の保護されたパスがあり、ツールの実行前に Claude Code が何を承認するかを制御します。サンドボックスのリストは、すでに実行中のコマンドに適用されます。対象となるパスは次の 4 つのグループです。
- 作業ディレクトリとその上位のディレクトリ:
.claude設定ファイル、.claude/skills、.claude/agents、.claude/commands、.claude/hooksディレクトリ、.mcp.json、および.claude/workflowsや.claude/scheduled_tasks.jsonなど Claude Code が自ら実行するファイル - 作業ディレクトリのみ:
.bashrcや.zshrcなどのシェル起動ファイル、.gitconfig、.vscodeおよび.ideaディレクトリ、.git内のhooksとconfig - 作業ディレクトリをベア git リポジトリに変えてしまうファイル: 最上位の
HEAD、objects、refs、およびHEADが隣にある場合の既存のconfigとhooksエントリ。configという名前のファイルは、HEADがなくても拒否されます。Linux と WSL2 では、サンドボックス化されたコマンドの実行中に最上位のHEADファイルやobjectsまたはrefsディレクトリが出現すると、サンドボックスがそれを削除します ~/.claude、またはCLAUDE_CONFIG_DIRが指すディレクトリ内: その内容の大部分、および~/.claude.jsonと.credentials.json認証情報ストア
セッション中に保護された設定ファイルのパスにシンボリックリンクが出現した場合、サンドボックスは次のコマンドから、そのリンク先のファイルへの書き込みも拒否します。
これらのパスのいずれかを除外する方法はありません。パスを対象とする allowWrite エントリや Edit 許可ルールでは保護は解除されません。保護をオフにする唯一の方法は filesystem.disabled で、これはすべてのパスでファイルシステムの分離をオフにします。ご使用のマシンで解決されたこれらのパスの大部分を確認するには、/sandbox を実行して Config タブを開きます。ここでは、これらのパスがユーザー自身の denyWrite エントリと混在して Denied within allowed の下に一覧表示されます。
これらのパスのいずれかで git merge または git checkout が unable to unlink old で失敗する場合は、git コマンドが unable to unlink old で失敗するを参照してください。
ネットワークの分離
サンドボックス化されたコマンドには、ネットワークへの直接の経路がありません。
- Linux と WSL2: コマンドは、ユーザーのネットワークに接続されていない別のネットワーク名前空間で実行されます
- macOS: Seatbelt サンドボックスフレームワークが、デフォルトでサンドボックスプロキシへの接続以外の接続をブロックします
Claude Code はサンドボックスの外、ユーザーのマシン上でサンドボックスプロキシを実行し、HTTP_PROXY、HTTPS_PROXY、ALL_PROXY および関連する環境変数を使ってコマンドをプロキシに向けます。プロキシは、各接続のホスト名を許可ドメインおよび拒否ドメインと照合します。
ツールが到達できる範囲は、そのツールがプロキシを使用するかどうかによって異なります。
- プロキシ変数を読み取るツール:
curl、npm、HTTPS 経由のgitなどのツールは、ホストが許可されると接続できます。ポートを指定しないallowedDomainsエントリは、そのホストのすべてのポートを許可します - プロキシ変数を無視するツール: 素の
ssh、ほとんどのデータベースドライバーなどのツールは、許可されたホストであっても接続できません。データベースクライアントやその他の非 HTTP ツールが許可されたホストに到達できないを参照してください - TCP 以外のもの: UDP、QUIC 上の HTTP/3、および
pingなどの ICMP ツールはサンドボックスの外に出られません
以下の設定と動作により、プロキシが許可するホストが制御されます。
- ドメイン制限: 許可ドメインは最初は空です。コマンドが新しいドメインを初めて必要とした場合の動作については、許可ドメイン外のホストで説明しています。
- 承認の選択: プロンプトで Yes を選択すると、Claude Code は現在のセッションの残りの間、そのホストを許可します。「Yes, and don't ask again」を選択すると、Claude Code は
WebFetch(domain:...)許可ルールをローカル設定に保存するため、今後のセッションでもそのホストは許可されたままになります。サンドボックスが管理者必須の場合、Claude Code はルールをユーザー設定に保存し、すべてのプロジェクトに適用されます。 - 事前許可ドメイン:
allowedDomainsでドメインを事前に許可すると、プロンプトを完全に回避できます。権限ルールで説明しているように、Claude Code はWebFetch(domain:...)許可ルールのドメインも事前に許可します。 - 厳格な許可リスト: ユーザー設定、管理設定、または CLI の
--settings設定でstrictAllowlistをtrueに設定すると、Claude Code はプロンプトを表示する代わりに、サンドボックス化されたコマンドから許可リスト外のホストへのアクセスを拒否します。許可リストはallowedDomainsとWebFetch(domain:...)許可ルールのドメインの合計で、allowManagedDomainsOnlyが設定されている場合は管理設定のエントリのみとなります。リポジトリのエントリについては、管理者必須のサンドボックスなしで適用されるロックで説明しています。Claude Code はこれをサンドボックス化されたコマンドにのみ適用します。WebFetchなどのプロセス内ツールは引き続き権限ルールに従います。リポジトリの.claude/settings.jsonまたは.claude/settings.local.jsonで設定しても効果はありません。Claude Code v2.1.219 以降が必要です。 - 管理設定によるロックダウン: 管理設定で
allowManagedDomainsOnlyが設定されている場合、許可されていないドメインはプロンプトを表示せずに自動的にブロックされ、管理設定のallowedDomainsとWebFetch(domain:...)許可ルールのみが適用されます。 - 企業プロキシ: ネットワークで送信トラフィックを企業プロキシ経由にする必要がある場合は、プロキシ設定の説明に従って
HTTPS_PROXY、HTTP_PROXY、NO_PROXYを設定します。バックグラウンドエージェントにも適用されるよう設定のenvブロックで設定するか、Claude Code を起動する環境で設定してください。Claude Code はドメイン許可リストを適用したうえで、許可された接続をその上流プロキシ経由でトンネリングします。http://とhttps://のプロキシ URL が使用でき、必要に応じて URL に Basic 認証を含めることもできます。
WebFetch(domain:...) ルールでは、サンドボックスは 2 つのワイルドカード形式を認識します。*.example.com のような先頭の *. と、単独の * です。単独の * 形式には Claude Code v2.1.186 以降が必要です。WebFetch(domain:example.*) のようにそれ以外の位置にあるワイルドカードは、フェッチには引き続き一致しますが、サンドボックス化されたコマンドには効果がありません。
組み込みプロキシは、要求されたホスト名に基づいて許可リストを適用し、デフォルトでは TLS トラフィックの終端や検査を行いません。実験的な network.tlsTerminate 設定を使用すると、組み込みプロキシ自体が TLS を終端します。これは mask 認証情報エントリに必要です。デフォルトの影響についてはセキュリティ上の制限を、脅威モデルで TLS の検査が必要な場合はカスタムプロキシ設定を参照してください。
許可ドメイン外のホスト
サンドボックス化されたコマンドが許可ドメインにないホストに接続すると、コマンドはサンドボックス内にとどまり、判断を待ちます。インタラクティブなターミナルセッションでは、判断は権限モードによって異なります。
| 権限モード | 接続の扱い |
|---|---|
bypassPermissions モード、および権限のバイパスが利用可能な plan モード |
プロンプトなしで許可 |
手動モード、acceptEdits モード、およびそれ以外の plan モード |
プロンプトが表示される |
| auto モード | コマンドがホストを列挙し、分類器がそのリストを承認した場合を除き拒否 |
dontAsk モード |
拒否 |
strictAllowlist または allowManagedDomainsOnly がオンの場合、組み込みのサンドボックスプロキシはすべての権限モードで接続を拒否します。bypassPermissions モードでは、これらのいずれかがオンでない限り、許可ドメイン外のホストは許可されます。そのモードでコマンドがサンドボックスの外に出られる場合については、サンドボックスなしでの再試行というエスケープハッチで説明しています。deniedDomains にあるホストへの接続も、すべての権限モードで拒否されます。
ローカルアドレスに解決されるホスト名
ホスト名が許可リストを通過した後、サンドボックスプロキシはその名前を解決し、ローカルアドレスのみに解決される場合は接続を拒否します。ローカルアドレスには、127.0.0.1 などのループバックアドレス、169.254.169.254 クラウドメタデータエンドポイントなどのリンクローカルアドレス、およびユーザー自身のマシンに割り当てられたアドレスが含まれます。localhost および *.localhost という名前は、ループバックへの解決が許可されます。
10.0.0.0/8 などのプライベート範囲に解決される許可済みのイントラネットホスト名は接続できます。名前が拒否されるアドレスに解決されることを許可するには、"127.0.0.1:8080" のように、その IP アドレスを allowedDomains に追加します。
このチェックはホスト名に適用されます。IP アドレスへの接続は、許可ドメインと権限モードによって判断されます。また、プロキシは上流の企業プロキシ経由で送信する接続についてはこのチェックをスキップします。名前の解決はその企業プロキシが行うためです。
auto モードでのコマンドごとの許可ドメイン
サンドボックス化がオンの auto モードでは、Claude は接続ごとにネットワーク承認をトリガーする代わりに、コマンドが必要とするホストをコマンド自体に指定します。サンドボックス内で実行される各 Bash、PowerShell、または Monitor コマンドは、サンドボックスの許可リストを超えるホストのリストを持つことができます。registry.npmjs.org のようなドメイン、*.pythonhosted.org のようなワイルドカード、または IP アドレスで、それぞれにオプションで :port を付けられます。分類器はホストをコマンドと一緒に審査します。Claude Code v2.1.271 以降が必要です。
承認されたリストは、そのコマンドの実行中に限り、そのコマンドに対してのみそれらのホストを開放します。セッションの許可ホストや設定には何も追加されず、次のコマンドは独自のホストを指定します。
ホストを持つコマンドは、権限ルールやサンドボックスの自動許可モードによって承認されるのではなく、分類器に送られます。確認ルールによってコマンドにプロンプトが強制される場合、ターミナルの権限ダイアログではコマンドの横にホストが一覧表示され、そこで承認すると両方が対象になります。
コマンドごとのリストは、サンドボックスがデフォルトで拒否する範囲のみを広げます。deniedDomains のエントリは引き続きブロックされます。strictAllowlist または allowManagedDomainsOnly が許可リストをロックしている場合、Claude Code はコマンドごとのリストを拒否します。
コマンドごとのリストが適用されている間、Claude Code は、承認されたどのコマンドにも列挙されていないホストへの接続を、プロンプトや分類器のチェックなしに拒否します。拒否の際はコマンドの結果にホスト名が示され、Claude はそのホストを追加してコマンドを再実行します。
ドメインリスト内の IPv6 アドレス
allowedDomains、deniedDomains、または WebFetch(domain:...) ルールで IPv6 アドレスに一致させるには、アドレスを角括弧で囲んで記述します。"[::1]" はすべてのポートでそのアドレスに一致し、"[::1]:443" はポート 443 でのみ一致します。角括弧形式には Claude Code v2.1.229 以降が必要です。
::1:443 のような角括弧のないエントリは、アドレスとポート付きのアドレスのどちらとも解釈できるため曖昧です。
- 拒否リスト: Claude Code はエントリが解釈され得るすべての読み方を拒否するため、意図した読み方がどちらであってもブロックされます。解釈可能な読み方がないエントリについては、Claude Code は何もブロックしません
- 許可リスト: Claude Code は記述された以上のものを許可しません。曖昧なエントリは、ホストとポートとしての読み方が正しく解析できる場合はその読み方に書き換え、許可リストを広げるよりはエントリを完全に破棄することがあります
曖昧なエントリを見つけるには、ターミナルで claude doctor を実行し、Sandbox network domain entries have unreliable spellings という警告を確認します。曖昧なエントリはそれぞれ角括弧形式で書き直してください。
OS レベルの適用
サンドボックス化された Bash ツールは、オペレーティングシステムのセキュリティプリミティブを使用します。
- macOS: サンドボックスの適用に Seatbelt を使用します
- Linux: 分離に bubblewrap を使用します
- WSL2: Linux と同じく bubblewrap を使用します
@anthropic-ai/sandbox-runtime パッケージを単独で実行して、Claude Code プロセスをラップすることもできます。サンドボックスランタイムを参照してください。
サンドボックスが権限と権限モードにどのように関連するか
サンドボックス、権限ルール、および権限モードは補完的なレイヤーです。以下のセクションでは、サンドボックスが各レイヤーとどのように相互作用するかについて説明します。
権限ルール
権限ルールとサンドボックスは異なるものを制御します。
- 権限ルールは Claude Code が使用できるツールを制御し、ツールが実行される前に評価されます。Bash、Read、Edit、WebFetch、MCP、およびその他のツールを含むすべてのツールに適用されます。ただし、deny ルールまたは ask ルールは、他のツールが残っている間は
EndConversationをブロックできません。 - サンドボックスは OS レベルの強制を提供し、シェルコマンドがファイルシステムおよびネットワークレベルでアクセスできるものを制限します。Bash、PowerShell、およびMonitorコマンドとその子プロセスにのみ適用されます。
この 2 つのレイヤーは、強制方法も異なります。Claude Code は、コマンド文字列に基づいて、またはオートモードでは別の分類器がコマンドが安全かどうかについての判断に基づいて、コマンドが実行される前に権限の決定を評価します。オペレーティングシステムは、実行中のプロセスにサンドボックス境界を強制するため、モデルが実行することを選択したものに関係なく、また許可されたコマンドがその名前が示唆するもの以上のことを行う場合でも、それが保持されます。
ファイルシステムおよびネットワーク制限は、サンドボックス設定と権限ルールの両方を通じて構成されます。
| 設定またはルール | 機能 |
|---|---|
sandbox.filesystem.allowWrite |
作業ディレクトリ外のパスへのサブプロセス書き込みアクセスを許可します |
sandbox.filesystem.denyWrite および sandbox.filesystem.denyRead |
特定のパスへのサブプロセスアクセスをブロックします |
sandbox.filesystem.allowRead |
denyRead 領域内の特定のパスの読み取りを再度許可します |
sandbox.filesystem.disabled |
ネットワーク分離を維持しながら、ファイルシステムレイヤーを完全にオフにします |
Edit allow ルール |
sandbox.filesystem.allowWrite と同じ方法で、特定のパスへの書き込みアクセスを許可します |
Read および Edit deny ルール |
特定のファイルまたはディレクトリへのアクセスをブロックします |
WebFetch(domain:...) allow および deny ルール |
ドメインアクセスを制御します |
サンドボックス allowedDomains |
Bash コマンドが到達できるドメインを制御します |
サンドボックス deniedDomains |
より広い allowedDomains ワイルドカードが許可する場合でも、特定のドメインをブロックします |
サンドボックス設定と権限ルールの両方からのパスとドメインは、最終的なサンドボックス構成にマージされます。
claude-code リポジトリの examples ディレクトリには、サンドボックス固有の例を含む、一般的なデプロイメントシナリオ用のスターター設定構成が含まれています。これらを出発点として使用し、ニーズに合わせて調整してください。
権限モード
/sandbox は権限モードではありません。権限モードは、ツール呼び出しが実行されるかどうか、および最初にプロンプトが表示されるかどうかを決定しますが、サンドボックスは Bash コマンドが実行されたら何にアクセスできるかを制限します。制御対象と、アクション単位のプロンプトに代わるものが異なります。
| 制御対象 | プロンプトに代わるもの | |
|---|---|---|
/sandbox |
Bash コマンドが実行されたら何にアクセスできるか | オートアロー モードのサンドボックス境界自体 |
| オートモード | 各ツール呼び出しが実行されるかどうか | アクションをレビューする分類器 |
--dangerously-skip-permissions |
各ツール呼び出しが実行されるかどうか | なし。保護されたパスチェックもスキップされます。モードが自動承認しないアクションは引き続き適用されます |
サンドボックスのオートアロー モードはオートモードとは別です。オートアロー はサンドボックス境界がそれらを含むため Bash コマンドを承認し、オートモードはアクションをレビューするために分類器を使用します。この 2 つは独立して機能し、サンドボックス モードの下にリストされている例外を除いて組み合わせることができます。無人実行の分離境界を選択するには、サンドボックス環境を参照してください。各フラグを開始する一般的な権限モードとサンドボックスペアリングのテーブルについては、一般的なセットアップを参照してください。
組織のサンドボックスを設定する
管理者はすべてのユーザーにサンドボックス化を要求し、開発者がポリシーを広げるのを防ぎ、サンドボックストラフィックを企業プロキシを通じてルーティングできます。
管理設定でサンドボックス化を実施する
すべての開発者にサンドボックスを要求するには、管理設定を通じて sandbox キーを配信します。MDM で管理されるファイルまたは claude.ai のサーバー管理設定を通じて配信します。
以下の管理設定はサンドボックスを有効化し、プラットフォームがサポートされていない場合や依存関係が不足している場合は Claude Code の起動を拒否し、モデルがサンドボックス外でコマンドを再試行するのを防止します。
{
"sandbox": {
"enabled": true,
"failIfUnavailable": true,
"allowUnsandboxedCommands": false
}
}
enabled 以外の 2 つのキーは、サンドボックスがコマンドを実行できない場合に何が起こるかを制御します。
failIfUnavailable:Linux の bubblewrap などの依存関係が不足している場合、サンドボックス化されていない実行にフォールバックするのではなく、Claude Code の起動をブロックしますallowUnsandboxedCommands: false:Claude Code はdangerouslyDisableSandboxエスケープハッチを無視するため、サンドボックス内でコマンドが失敗しても、Claude はそれをサンドボックス外で再試行できません
これらと併せて、次の追加を検討してください。
- 分離なしで実行する必要がある組織承認済みのツールについて
excludedCommandsを追加します。この設定により、リポジトリの設定でコマンドをサンドボックスの外に出すことができなくなるためです ~/.awsや~/.sshなどの認証情報ディレクトリと、秘密の環境変数についてsandbox.credentialsエントリを追加します。デフォルトの読み取りポリシーではこれらが引き続き許可されるためです
この設定は Claude が実行するコマンドをサンドボックス化します。開発者は依然として ! シェルモードプロンプトでコマンドを入力し、Claude Code の外の任意のターミナルで既に持っているのと同じアクセス権でサンドボックス外で実行できます。入力されたコマンドがサンドボックス内で実行されるセッションについては、strict サンドボックスモードを参照してください。
サンドボックスはネイティブ Windows では実行されないため、failIfUnavailable が設定されていると、それらのマシンでは Claude Code が起動時に終了します。フリートに Windows ホストが含まれている場合は、次の方法を取れます。
- オペレーティングシステムごとに設定を配信する:MDM を通じて、または管理設定ファイルとして、macOS と Linux のマシンにのみデプロイします。サーバー管理設定は組織内のすべてのユーザーに適用されます
- Windows ユーザーをサポートされている環境に移行する:WSL2 またはコンテナ内で Claude Code を実行してもらいます
開発者がポリシーを広げるのを防ぐ
管理設定で enabled や failIfUnavailable などのブール値キーを設定した場合、Claude Code は管理値を使用し、開発者がローカルで設定したものを無視します。allowRead などの配列キーの場合、Claude Code はセッションが読み込むスコープからエントリをマージするため、そのキーがロックの対象になっていない限り、開発者はポリシーを広げるエントリを追加できます。
管理設定で設定されていない限り、開発者のユーザー設定または --settings で次のキーをオンにできます。サンドボックスが管理者必須でない限り、リポジトリの .claude/settings.json でもオンにできます。いずれもサンドボックスを弱めるため、使用させたくない場合は管理設定で false に設定してください。
enableWeakerNestedSandboxenableWeakerNetworkIsolationnetwork.allowAllUnixSocketsnetwork.allowLocalBindingallowAppleEvents(リポジトリではオンにできません)
管理設定で allowManagedReadPathsOnly を true に設定して、管理設定からの allowRead エントリのみが尊重されるようにします。これにより、開発者が組織承認済みのパスを超えて読み取りアクセスを広げるのを防止します。
ネットワークドメインを同じ方法で管理値にロックするには、allowManagedDomainsOnly を設定します。このロックがオンの場合、プロキシポートを設定できるのは管理設定のみです。
管理設定が sandbox.filesystem を設定するか、"mode": "deny" を含む sandbox.credentials.files エントリをリストする場合、管理設定のみが filesystem.disabled を設定できるため、開発者は管理者がデプロイしたファイルシステム制限をオフにすることはできません。有効な mask エントリはキーをロックしません。どの設定がそれを無効にできるかを参照してください。
管理者必須のサンドボックスにおけるリポジトリ設定
次のいずれかの設定が有効な間、サンドボックスは管理者必須になります。
allowUnsandboxedCommandsが管理設定でfalseに設定されている場合、または管理設定でtrueに設定されていない限り--settingsフラグでfalseに設定されている場合allowManagedDomainsOnlyが管理設定でtrueに設定されている場合
これらの設定はサンドボックスをオンにしないため、enabled も設定してください。
サンドボックスが管理者必須である間、Claude Code はサンドボックスを緩める設定を、管理設定、--settings フラグ、および各開発者の ~/.claude/settings.json からのみ取得します。リポジトリの .claude/settings.json および .claude/settings.local.json にある次の設定は無視されます。
| リポジトリの設定 | Claude Code が無視するもの |
|---|---|
excludedCommands、ignoreViolations、network.allowedDomains、network.allowUnixSockets、network.allowMachLookup、network.httpProxyPort、network.socksProxyPort |
すべてのエントリ |
filesystem.allowWrite、Edit(...) 許可ルール、permissions.additionalDirectories |
各エントリがサンドボックス化されたコマンドに与える書き込みアクセス。Claude のファイルツールは引き続き Edit(...) ルールと追加ディレクトリに従います |
WebFetch(domain:...) 許可ルール |
各ルールがサンドボックスの許可リストに追加するホスト。WebFetch ツールは引き続きそのルールに従います |
enableWeakerNestedSandbox、enableWeakerNetworkIsolation、network.allowAllUnixSockets、network.allowLocalBinding |
true。false は引き続き適用されます |
enabled、failIfUnavailable |
開発者の ~/.claude/settings.json が true を設定している場合の false |
filesystem.allowRead |
管理設定、--settings、またはユーザー設定で読み取りが拒否されているパスまたはその配下のエントリ、あるいはそれに一致する可能性のある glob |
サンドボックスが管理者必須である間も、次の設定は引き続き適用されます。
- リポジトリのファイル内:deny エントリと
autoAllowBashIfSandboxedの値。リポジトリによる変更を防ぐには、管理設定でこのキーを設定してください - 開発者自身の設定内:表にある設定は、
allowManagedDomainsOnlyなどの管理専用ロックの対象でない限り、~/.claude/settings.jsonまたは--settingsから引き続き適用されます。excludedCommandsやfilesystem.allowWriteなど、そのほとんどには管理専用ロックがありません
管理設定でサンドボックス化を実施するの設定により、サンドボックスは管理者必須になります。リポジトリからは指定できないため、承認済みのツールに必要な excludedCommands、allowWrite、およびソケットのエントリは管理設定に追加してください。
Claude Code v2.1.285 以降が必要です。v2.1.282 から v2.1.284 では、同じ設定によって Claude Code はリポジトリの excludedCommands エントリを無視していました。
管理者必須のサンドボックスがなくても適用されるロック
一部の設定は、サンドボックスが管理者必須でない場合でも、1 つの制限を直接上書きするリポジトリのキーを Claude Code に無視させます。各設定がこの効果を持つのは、その行に記載されたファイルで設定した場合のみであり、リポジトリのその他のサンドボックス設定は引き続き適用されます。Claude Code v2.1.285 以降が必要です。
| 設定 | 設定する場所 | Claude Code がリポジトリの設定で無視するもの |
|---|---|---|
network.deniedDomains または WebFetch(domain:...) 拒否ルール |
管理設定、--settings |
httpProxyPort と socksProxyPort |
network.strictAllowlist |
管理設定、--settings、ユーザー設定 |
プロキシポート、allowedDomains、および WebFetch(domain:...) 許可ルール |
filesystem.denyRead、Read(...) 拒否ルール、または credentials.files エントリ |
管理設定、--settings |
管理設定、--settings、またはユーザー設定で読み取りが拒否されているパスまたはその配下にある allowRead、allowWrite、Edit(...) 許可、または additionalDirectories のエントリ、あるいはそれに一致する可能性のある glob |
これらのロックは、サンドボックス化されたコマンドがアクセスできる範囲を変更します。WebFetch ツールと Claude のファイルツールは、引き続きリポジトリのルールと追加ディレクトリに従います。
カスタムプロキシ設定
独自のツールでサンドボックストラフィックを検査、フィルタリング、またはログに記録するには、組み込みのサンドボックスプロキシを、同じマシン上で実行する独自のプロキシに置き換えます。
ネットワーク上の別の場所にある企業プロキシを通じてサンドボックストラフィックをルーティングするには、代わりに ネットワーク分離の 企業プロキシ の項目で説明されているように HTTPS_PROXY を設定します。そうすることで、Claude Code の許可リストが引き続き適用されます。
サンドボックス化されたコマンドをプロキシに向けるには、サンドボックス設定でプロキシがリッスンする localhost のポートを設定します。
{
"sandbox": {
"network": {
"httpProxyPort": 8080,
"socksProxyPort": 8081
}
}
}
ポートを設定し、さらに HTTPS_PROXY または HTTP_PROXY も設定した場合、Claude Code はサンドボックス化されたコマンドが独自のプロキシに送信したものを、これらの変数で指定されたプロキシに転送しません。企業プロキシにアクセスするには、独自のプロキシがそこへ転送するように設定してください。
どのファイルでポートを設定できるかは、その他のサンドボックス設定によって異なります。最初に一致するケースが適用されます。
allowManagedDomainsOnlyがオンの場合:管理設定のみ- サンドボックスが管理者必須である場合、またはより限定的なネットワークロックが適用される場合:管理設定、
--settings、およびユーザー設定 - それ以外の場合:任意の設定ファイル
Claude Code はそれ以外の場所で設定されたポートを無視します。v2.1.285 より前は、任意の設定ファイルでポートを設定できました。
いずれかのポートが適用されると、そのプロキシに送信されるすべてのものをフィルタリングする責任は独自のプロキシが負います。allowedDomains、deniedDomains、strictAllowlist、承認プロンプト、ローカルアドレスのチェックなど、Claude Code 自体のネットワーク制御はそのトラフィックには適用されなくなります。サンドボックス化されたコマンドはどちらのプロキシにも接続できるため、ポートを 1 つだけ設定した場合、もう一方のプロキシにおける Claude Code のドメインリストでは、コマンドが独自のプロキシを通じてアクセスする先を制限できません。
トラブルシューティング
一部のコマンドは、サンドボックス外では機能するにもかかわらず、サンドボックス内では失敗します。症状やエラーメッセージに一致する見出しを探してください。
組織のサンドボックスが管理者必須の場合、Claude Code はプロジェクトの設定ファイル内にある、これらの修正で挙げる設定を無視します。そのため、すべてのプロジェクトで適用される ~/.claude/settings.json に保存してください。それでも修正が効果を持たない場合は、組織の管理設定がそのキーを設定している可能性があります。
excludedCommands パターンを追加する修正では、そのパターンに一致するコマンドからサンドボックスが外れます。除外されたコマンドでできることを参照してください。
コマンドがホスト許可なしエラーで失敗する
多くの CLI ツールは特定のホストに到達する必要があります。プロンプトが表示されたらホストを承認するか、allowedDomains に追加してください。組織が allowManagedDomainsOnly で許可リストをロックしている場合はプロンプトが表示されないため、管理者にホストの追加を依頼してください。
`jest` がハングまたは失敗する
watchman はサンドボックスと互換性がありません。代わりに jest --no-watchman を実行してください。
Go ベースの CLI が macOS で TLS 検証に失敗する
gh、gcloud、terraform などのツールは Seatbelt の下で TLS 検証に失敗する可能性があります。これらのツールをサンドボックス外で実行するには、各ツールのパターン(gh * など)を excludedCommands に追加してください。そのツールはユーザーの完全なアクセス権と保存された認証情報で実行されます。httpProxyPort を MITM プロキシとカスタム CA で使用している場合は、代わりに enableWeakerNetworkIsolation を true に設定してください。
`open`、`osascript`、またはブラウザベースの認証フローが macOS でエラー `-600` で失敗する
サンドボックスはデフォルトで Apple Events をブロックします。ユーザー、管理、または CLI 設定で allowAppleEvents を true に設定して、それらを許可してください。Claude Code はプロジェクト設定ではこのキーを無視します。
allowAppleEvents を有効にするとコード実行の分離が削除されます。サンドボックス化されたコマンドはユーザープロンプトなしで他のアプリケーションをサンドボックス化されていない状態で起動でき、macOS オートメーション同意プロンプト(TCC)の対象となる実行中のアプリケーションに AppleScript コマンドを送信できるためです。または、open * などのパターンを excludedCommands に追加してください。その場合、各 open 呼び出しは権限フローを経由します。また、open は Claude が書いたものを含め、任意のファイルやアプリを起動できます。
`docker` コマンドが失敗する
docker はサンドボックスと互換性がありません。必要な docker コマンドを、docker compose * などの excludedCommands パターンでサンドボックス外に出してください。除外された docker コマンドが到達できる範囲については、excludedCommands でサンドボックス外でコマンドを実行するで説明しています。パターンを狭くするほど、サンドボックス外に出るコマンドは少なくなります。
`pbcopy`、`xclip`、または `wl-copy` がクリップボードを更新しない
pbcopy、xclip、wl-copy のクリップボードユーティリティはサンドボックス内からシステムクリップボードに到達できない場合があり、その場合はパイプされたテキストが到達しません。
Claude の出力をクリップボードに配置するには、Claude に応答で出力するよう依頼してから、/copy を実行してください。/copy はサンドボックス化されたコマンドではなく Claude Code プロセスからクリップボードに書き込みます。
Claude がテキストをこれらのツールの 1 つにパイプする場合、ツールを excludedCommands に追加しても、それだけではその呼び出しはサンドボックス外に出ません。
git コマンドが `unable to unlink old` で失敗する
git merge、git checkout などのコマンドは、サンドボックスが書き込みを拒否するファイルを置き換える必要がある場合に unable to unlink old で失敗します。Linux と WSL2 ではエラーは Read-only file system で終わります。そのファイルは次のいずれかの場所にある可能性があります:
.claude/skillsなどの保護されたパスの下denyWriteエントリの 1 つの下- サンドボックスがコマンドに書き込みを許可するディレクトリの外
失敗後、Claude はコマンドをサンドボックス外で再実行することを提案する場合があります。その再試行を承認するか、別のターミナルで git コマンドを自分で実行してください。allowUnsandboxedCommands を false に設定している場合、Claude は再試行を提案できないため、コマンドを自分で実行してください。
Bubblewrap がコンテナ内で起動に失敗する
非特権コンテナでは、bubblewrap は新しい /proc ファイルシステムをマウントできないため、サンドボックス化されたコマンドは bwrap エラー(Can't mount proc on /newroot/proc: Operation not permitted など)で失敗します。enableWeakerNestedSandbox を true に設定して、サンドボックスが代わりにコンテナの既存の /proc をバインドマウントするようにしてください。この設定は、外部コンテナが既に必要な分離境界を提供する場合にのみ使用してください。新しい /proc マウントであれば隠されるプロセス情報を、この設定はサンドボックス化されたコマンドに公開するためです。
0 バイトの読み取り専用ファイルが `.claude` 設定パスに表示され、「はい、今後は聞かない」が保存されない
Linux と WSL2 では、サンドボックスはサンドボックス化されたコマンドが実行されている間に、まだ存在しないファイルに対する書き込み拒否を保持するために、そこに 0 バイトの読み取り専用プレースホルダーを作成します。サンドボックスはその後プレースホルダーを削除します。SIGKILL などによってセッションがそのクリーンアップが実行される前に強制終了された場合、プレースホルダーは残ります。後のセッションは毎回起動時にそれらを読み取り専用で再度バインドするため、プレースホルダーが残っている箇所では、権限の選択を保存するなどの設定書き込みが失敗します。
ターミナルで claude doctor を実行して、残されたプレースホルダーファイルをリストアップしてください。Stale sandbox mask files left by a killed session 警告はその一部の名前を表示し、残りをカウントします。そのプロジェクトで他の Claude Code セッションが実行されていない間に、rm で各ファイルを削除してください。v2.1.257 より前では、Claude Code は同じプレースホルダーを残していましたが、警告していませんでした。
サンドボックスがオンの状態で SSH 経由の `git` が失敗する
macOS では、SSH リモートに対する git fetch、git pull、git push は、ホストが許可されていてもサンドボックス内で失敗します。Linux と WSL2 では、ホストが許可されれば動作します。Claude Code は git の SSH 接続をサンドボックスプロキシ経由でトンネリングしますが、macOS のトンネルはそのプロキシに対して認証できません。
Linux と WSL2 でそれでも接続が失敗する場合は、以下を確認してください:
- ホストがポート 22 で許可されている:
"git.example.com"のようにポートを指定しないallowedDomainsエントリで対象になります - 企業プロキシがポート 22 を許可している:ネットワークでアップストリームプロキシが必要な場合、トンネルもそれを経由します
- 鍵がファイルとして読み取り可能である:サンドボックスは
ssh-agentソケットをブロックする場合があり、~/.sshに対するdenyReadまたはcredentialsエントリは鍵ファイルを隠します
macOS では、リモートを HTTPS に切り替えてください。これには個人用アクセストークンなどの HTTPS 認証情報が必要です:
git remote set-url origin https://git.example.com/example-org/example-repo.git
SSH リモートを維持する必要がある場合は、excludedCommands で git のネットワークコマンドをサンドボックス外に出してください:
{
"sandbox": {
"excludedCommands": ["git fetch *", "git pull *", "git push *"]
}
}
これらのエントリは git push origin main に一致します。cd を追加する呼び出し、git -C を使用する呼び出し、またはコマンド置換を含む呼び出しは、サンドボックス内のままです。除外された git コマンドは、allowedDomains にあるホストだけでなく、任意のホストに到達できます。
SSH 経由の単純な ssh、scp、rsync は、データベースクライアントの項目で説明している理由で失敗します。
データベースクライアントやその他の非 HTTP ツールが許可されたホストに到達できない
プロキシの環境変数を無視するツールは、allowedDomains にあるホストであっても、サンドボックス内から接続できません。サンドボックス化されたコマンドにはネットワークへの直接の経路がないため、独自に接続を開くツールは失敗します。ほとんどのデータベースドライバー、単純な ssh、UDP を使用するツールはこのように動作します。
失敗はネットワークエラーまたは名前解決エラーのように見えます:
- macOS:
Operation not permitted、またはCould not resolve hostなどの名前解決エラー - Linux と WSL2:
Network is unreachable、またはTemporary failure in name resolutionなどの名前解決エラー
プロキシを使用するツールは、ホストが許可されていない場合に異なる形で失敗します。ネットワークのプロンプトが表示されるか、ツールがプロキシから 403 レスポンスを受け取ります。
ツールが接続できるようにするには、それを必要とするコマンドを excludedCommands でサンドボックス外で実行してください。この例では 1 つのスクリプトを除外し、ask ルールを追加して、実行ごとに承認するようにしています:
{
"sandbox": {
"excludedCommands": ["python scripts/load_orders.py *"]
},
"permissions": {
"ask": ["Bash(python scripts/load_orders.py *)"]
}
}
スクリプトはユーザーの完全なアクセス権で実行され、Claude は作業ディレクトリ内にあるスクリプトを編集できるため、プロンプトが表示されたらスクリプトを確認してください。
コマンドが localhost 上のサーバーに到達できない
デフォルトでは、サンドボックス化されたコマンドは、開発サーバーやコンテナ内のデータベースなど、マシン上でサンドボックス外で実行されているサーバーに直接接続できません。変更できる内容はプラットフォームによって異なります:
- macOS:
network.allowLocalBindingをtrueに設定します。これにより、サンドボックス化されたコマンドはネットワークポートでリッスンし、localhost の任意のポートに接続できるようになります。これには、そこでリッスンしている他のすべてのサービスが含まれます。その結果、認証を必要としない localhost サービス(デバッガーなど)がサンドボックス外でコマンドの代わりに動作できるようになり、非ループバックアドレスでリッスンするコマンドは他のマシンからの接続を受け入れます - Linux と WSL2:サンドボックス化されたコマンドの
localhostはそのコマンド専用です。コマンドはポートでリッスンでき、自身が起動したサーバーに到達できます。localhostまたは127.0.0.1への直接接続はホスト上のサーバーには到達せず、allowLocalBindingは効果がありません。ホストのサーバーを必要とするコマンドは、excludedCommandsでサンドボックス外で実行してください。そこではファイルシステムやネットワークの制限はありません。サンドボックスプロキシを経由する接続については、ローカルアドレスに解決されるホスト名を参照してください
この例では macOS でこの設定をオンにします:
{
"sandbox": {
"network": {
"allowLocalBinding": true
}
}
}
localhost に対する allowedDomains エントリはプロキシを経由する接続に適用されるため、直接接続には影響しません。Claude Code はサンドボックス化されたコマンドに NO_PROXY を設定し、プロキシ経由ではなく localhost に直接接続するようにしています。また、このエントリは、プロキシを使用するコマンドに対して、マシンの localhost のすべてのポートを公開します。127.0.0.1 を指す開発用ホスト名については、許可されたホスト名が resolved to a loopback address で拒否されるを参照してください。
許可されたホスト名が `resolved to a loopback address` で拒否される
サンドボックスプロキシは、ローカルアドレスに解決される許可されたホスト名を拒否します。これは 127.0.0.1 を指す myapp.test などの開発用の名前に影響します。コマンドは 403 レスポンスを受け取り、その本文には Connection to myapp.test blocked: resolved to a loopback address のようにアドレスの種類が示されます。
名前の解決先の IP アドレスをホスト名と並べて allowedDomains に追加し、それぞれにサーバーがリッスンするポートを指定してください:
{
"sandbox": {
"network": {
"allowedDomains": ["myapp.test:3000", "127.0.0.1:3000"]
}
}
}
ポートを指定しない IP アドレスのエントリでは、サンドボックス化されたコマンドがそのアドレスでリッスンしているすべてのサービスに到達できるようになります。
v2.1.284 より前では、プロキシは許可されたホスト名がどのアドレスに解決されても接続していました。
`/sandbox` が `Sandbox settings are overridden by a higher-priority configuration` で失敗する
上位の設定レベルが sandbox.enabled、sandbox.autoAllowBashIfSandboxed、または sandbox.allowUnsandboxedCommands を設定している場合、/sandbox はパネルを開く代わりに Error: Sandbox settings are overridden by a higher-priority configuration and cannot be changed locally. を出力します。パネルは選択内容を .claude/settings.local.json に保存しますが、そこに保存された値はそれらのレベルを上書きできません。
管理設定と --settings はローカル設定より優先されます。このセッションでどれが読み込まれたかを確認するには、/status を実行して Setting sources 行を確認してください:
Command line arguments:--settingsを指定して Claude Code を起動した場合は、渡したファイルまたは JSON がこれらのキーのいずれかを設定しているか確認してください。設定している場合は、そこで値を変更するか、これらのキーを含めずに Claude Code を再起動してください。Enterprise managed settings:組織の管理設定が読み込まれています。それらがこれらのキーのいずれかを設定している場合、そのキーは/sandboxからも、ユーザーが管理するどの設定ファイルからも変更できないため、管理者に問い合わせてください。
制限事項
サンドボックス化はリスクを軽減しますが、完全な分離境界ではありません。ハードセキュリティ制御として依存する前に、以下の制限事項を確認してください。
セキュリティ上の制限
- ネットワークフィルタリング:サンドボックスは、プロセスが接続できるドメインを制限します。デフォルトでは、組み込みプロキシは発信トラフィックの TLS を終端または検査しないため、暗号化された接続の内容は検査されません。実験的な
network.tlsTerminate設定は、mask認証情報置換のためにプロキシで TLS を終了しますが、コンテンツフィルタリングは追加しません。ポリシーで許可されるのは信頼できるドメインのみであることを確認する責任があります。
github.com などの広いドメインを許可すると、データ流出のパスが作成される可能性があります。プロキシは TLS を検査せずにクライアント提供のホスト名から許可決定を行うため、サンドボックス内で実行されるコードは ドメインフロンティングまたは同様の技術を使用して許可リスト外のホストに到達する可能性があります。脅威モデルがより強力な保証を必要とする場合は、TLS を終了してトラフィックを検査し、CA 証明書をサンドボックス内にインストールする カスタムプロキシを設定してください。より強力な TLS 対応ネットワーク分離は開発の活発な領域です。
- Unix ソケットを通じた権限昇格:
allowUnixSockets設定は、サンドボックスバイパスにつながる可能性のあるシステムサービスへのアクセスを不注意に付与する可能性があります。たとえば、/var/run/docker.sockへのアクセスを許可すると、Docker ソケットを通じてホストシステムへのアクセスが効果的に付与されます。サンドボックスを通じて許可する Unix ソケットを慎重に検討してください。 - ファイルシステム権限昇格:過度に広いファイルシステム書き込み権限は権限昇格攻撃を有効にする可能性があります。
$PATHの実行可能ファイルを含むディレクトリ、システム設定ディレクトリ、またはユーザーシェル設定ファイル(.bashrcまたは.zshrc)への書き込みを許可すると、他のユーザーまたはシステムプロセスがこれらのファイルにアクセスするときに異なるセキュリティコンテキストでコード実行につながる可能性があります。 - Linux サンドボックス強度:Linux 実装は強力なファイルシステムとネットワーク分離を提供しますが、特権付き名前空間のない Docker 環境内で動作できるようにする
enableWeakerNestedSandboxモードが含まれています。このオプションはセキュリティを大幅に弱め、追加の分離が別の方法で実施される場合にのみ使用する必要があります。 - macOS での Apple Events:macOS サンドボックスはデフォルトで Apple Events をブロックします。
allowAppleEvents設定はこの制限を解除して、openやosascriptなどのツールが動作するようにしますが、コード実行分離を削除します。サンドボックス化されたコマンドは、ユーザープロンプトなしで他のアプリケーションをサンドボックス化されていない状態で起動でき、実行中のアプリケーションに AppleScript コマンドを送信できます。これはアプリごとの macOS オートメーション同意プロンプト(TCC)の対象です。これはユーザー、管理、または CLI 設定からのみ有効です。プロジェクト設定では有効にできません。
スコープ
サンドボックスはシェルコマンドとその子プロセスを分離します。サンドボックスの対象外となるツールとヘルパープロセスは、サンドボックス外で実行されるものに記載されています。コンピュータ使用とサブエージェントとサンドボックスの関係は次のとおりです。
- コンピュータ使用:Claude がアプリを開いてスクリーンを制御する場合、分離された環境ではなく実際のデスクトップで実行されます。アプリごとの権限プロンプトが各アプリケーションをゲートします。CLI でのコンピュータ使用または Desktop でのコンピュータ使用を参照してください。
- サブエージェント:subagentsは親セッションと同じプロセスで実行され、同じサンドボックス設定を使用します。親セッションでサンドボックス化が有効な場合、サブエージェント内の Bash コマンドはサンドボックス化されます。
- Mod:mod は Claude Code 内で独自のコードを実行するプラグインであり、mod が起動するプロセスはサンドボックス外で実行されます。mod がアクセスできる範囲を参照してください。
効果的なサンドボックス化にはファイルシステムとネットワークの両方の分離が必要です。ネットワーク分離がない場合、侵害されたエージェントは SSH キーなどの機密ファイルを流出させる可能性があります。ファイルシステム分離がない場合、それが制限の緩いポリシーによるものであれ、ファイルシステムレイヤーを無効化したことによるものであれ、侵害されたエージェントはシステムリソースにバックドアを仕掛けてネットワークアクセスを取得する可能性があります。デフォルトを広げるときは、allowWrite パス、広い allowedDomains エントリ、または excludedCommands 例外が反対側の制限を元に戻さないことを確認してください。
関連項目
- Sandbox environments:組み込みサンドボックスと dev コンテナ、コンテナ、VM を比較する
- Security:包括的なセキュリティ機能とベストプラクティス
- Permissions:許可設定とアクセス制御
- All settings:すべての設定キー
- CLI reference:コマンドラインオプション