Bash サンドボックス
Claude Code のサンドボックスを段階的に有効化する
サンドボックスのランタイムを入れ、.claude/settings.json にファイルとネットワークの境界を書き、プロジェクトの外側の読み取りが拒否され、未知のドメインには 1 回だけ尋ねてくるところまでをスクリーンショットで追います。

スクリーンショット 13 手順、読了目安は約 5 分。各手順は動画の該当秒へリンクします。
サンドボックスで何が変わるのか
サンドボックスは「承認するかどうか」の判断を人間から OS へ移します。Linux(WSL2 の Ubuntu も含む)では Claude Code が Bash コマンドを bubblewrap の中で動かし、送信トラフィックはプロキシを通ります。macOS では標準装備の Seatbelt を使うので、インストールは不要です。境界は .claude/settings.json に 2 種類宣言します。シェルが読み書きできるパスと、到達できるドメインです。内側のコマンドは確認なしで走るため、ls や git status のたびに Yes を押すことはなくなります。境界を越える処理は、その場で失敗するか、Network request outside of sandbox という 1 行のホスト名付きの質問になります。ただし対象は Bash ツールだけなので、Read・Edit・Write は今までどおり Claude Code の権限設定に従います。
このスクリーンショットの出典
Shelly Systems の画面収録に沿っています。依存関係の導入、settings.json への sandbox 記述、そして bash モードからファイル境界とネットワーク境界を実際に突いてみます。
画像は動画から転載し、制作者をクレジットしています。文章は当サイトオリジナルです。収録は Windows の WSL2(Ubuntu)上で行われているため、ターミナルの画像は Linux 側の手順(bubblewrap と socat)になっています。macOS でも同じ起動時の一行に到達しますが、インストールは何もありません。内容は動画と Claude Code のサンドボックス文書を 2026 年 9 月に確認しました。
まず強制力を発揮させるための準備
Linux では境界は本物の OS の仕組みです。bubblewrap がプロセスを閉じ込め、socat がトラフィックをプロキシまで運びます。macOS には同等品がすでに入っているので、このセクションは読み飛ばして構いません。
- 1
bubblewrap と socat を入れる
実際に Claude Code を動かす Linux ディストリビューションで、サンドボックスが必要とする 2 つを入れます:sudo apt-get install bubblewrap socat。apt はここで 3 パッケージ(bubblewrap、libwrap0、socat)を解決し、472 kB と報告しています。macOS ではこのセクションごとスキップで OK です。Seatbelt は OS の一部です。

3 パッケージ 472 kB。Claude 専用のものは何もなく、bubblewrap は Flatpak と同じ仕組みです。1:52 から見る - 2
ネイティブインストーラーで Claude Code を入れる
依存関係のあとに CLI を入れます:curl -fsSL https://claude.ai/install.sh | bash。収録では npm ではなくネイティブインストーラーを使っています。資料では両方の経路に触れたうえで、サンドボックスにはこの機能を備えた新しいビルドが必要、と書かれています。

apt が Setting up bubblewrap と Setting up socat で終わり、その下にインストールコマンドが打ち込まれています。2:16 から見る - 3
Anthropic のサンドボックスランタイムを追加する
同じ資料がもう 1 つ追加しているのが npm install -g @anthropic-ai/sandbox-runtime です。Claude Code が Bash ツールを包み込むランタイムで、単体でも他のツールに使えます。たとえば MCP サーバーを 1 フォルダに閉じ込めたいときなどです。このコマンドを打つ時点では、プロジェクトの設定はまだ存在しません。.claude/settings.json は開かれていて、中身は空です。

空の settings.json が正直なスタート地点です。次のセクションで埋めます。3:10 から見る
settings.json に境界を書く
sandbox オブジェクト 1 つ、その下に filesystem と network。この後のセッションの挙動は、すべてここに書いた内容から決まります。
- 4
sandbox オブジェクトを書く
プロジェクトに .claude/settings.json を作り、sandbox キーを足します。収録では enabled: true と failIfUnavailable: true。サンドボックスが確保できないセッションは、無防備に走るのではなく起動を拒否します。filesystem には denyRead: ["../"] と allowRead: ["."]。プロジェクトは読めて、その親ディレクトリは読めません。この 2 行より上にある allowUnsandboxedCommands と autoAllowBashIfSandboxed の値は、エディターのミニマップに隠れているので、ここには書き写しません。

配列はどちらも要素 1 つだけ。allowRead "." と denyRead "../" — この手順のファイル境界はこれで全部です。4:12 から見る - 5
本当に必要なドメインだけを列挙する
承認の挙動を決めるのが network サブオブジェクトです。収録では allowUnixSockets を空にし、allowAllUnixSockets: false、allowLocalBinding: false、allowedDomains には example.com の 1 件だけ。トラフィックは檻の外側にあるプロキシへ出されるため、リストにないドメインは黙って破棄ではなく、質問に変わります。

許可ドメインは 1 つで十分です。通るケースと止まるケースの両方が映ります。4:20 から見る - 6
既定値がどちらに振れているか把握する
資料は開始地点をはっきり書いています。読み取りは既定でマシン全体、書き込みはプロジェクト内だけ、ただし Claude Code が動くために不可欠なファイルを除外、と。denyRead と allowRead が狙うのは前半のほうです。緩い側の境界が SSH 鍵や .env に届いてしまうからです。同じ資料は、逃げ道を塞ぎたいなら "allowUnsandboxedCommands": false を推奨しています。

既定で緩いのは読み取り側です。だから allow の追加ではなく denyRead "../" を選んでいます。6:56 から見る
セッションを始めて、隔離されていることを確認する
Claude Code が最初の画面で教えてくれますが、最初の 1 コマンドでも確かめられます。
- 7
claude を起動して一行目を読む
プロジェクトで Claude Code を起動します。この画面のバージョンは v2.1.118 で、ウェルカムボックスの真下に Your bash commands will be sandboxed. Disable with /sandbox. と出ます。この一行がチェックポイントです。出なければサンドボックスは効いていません。設定ファイルとランタイム導入に戻ってください。

起動時のお知らせは、中にいる事実と抜け出し方を同じ文で教えてくれます。4:44 から見る - 8
bash モードでファイル境界を確かめる
プロンプトから ! cat ../hello.txt と直接実行します。ファイルは実在します。上のエディターで開いていて、エクスプローラーでもホーム階層に見えています。それでも隔離されたシェルは cat: ../hello.txt: No such file or directory。denyRead: ["../"] とはこれで、パスが確認ダイアログの向こうに隠れるのではなく、そもそも存在しなくなります。

拒否された読み取りは「拒否」ではなく「ファイルなし」に見える。プロンプトインジェクションが交渉できない理由がここにあります。5:56 から見る - 9
リストにあるドメインを取りに行く
! curl "https://example.com" は 528 バイトと Example Domain の HTML を返してきます。allowedDomains の唯一の項目がこのホストだからです。続く ! curl "https://github.com" はまだ Running...。プロキシには github.com の規則がないので、失敗ではなく待機です。

許可された通信は静かです。見どころは、どちらの規則にも当たらないときの挙動です。6:12 から見る - 10
セッションを開き直して定着を確かめる
資料のステップ 8 は、設定を変えた後に毎回やるべき確認です。claude を閉じて起動し直し、サンドボックス化を示すメッセージが出るか見ます。設定は起動時にしか読まれないので、一行が出ない編集は、読み込まれていない編集と同じことです。

地味ですが、手順として立てる価値があります。設定ファイルはミスを黙認しますが、起動時のお知らせは黙りません。7:26 から見る
ネットワークの確認プロンプト、その後に起きること
コマンド単位の承認に代わって出てくる質問です。1 ドメイン 1 回、反射ではなくプロキシが聞いてきます。
- 11
ネットワークの確認に答える
待ちは、コマンド単位の承認とは種類が違うダイアログで終わります。Network request outside of sandbox、行き先は Host: に単独行、そして Do you want to allow this connection?。選択肢は 3 つで、Yes、Yes, and don’t ask again for github.com、No, and tell Claude what to do differently (esc)。日常を軽くするのは真ん中です。ホストを 1 回認めれば、その後の同じホストへの要求は静かになります。

粒度に注目。約束はコマンド単位ではなくホスト単位なので、避けたかった確認ループに戻りません。6:18 から見る - 12
拒否したときに何が起きるか見る
ダイアログの次のコマンドプロンプトには、0 バイトが並転送テーブルと curl: (56) CONNECT tunnel failed, response 403。プロキシがトンネルを開かなかったので、コマンドは走るけど何も受け取れません。収録ではどの選択肢を押したか映っていないので、ここはクリックの記録ではなく「拒否された結果」として読んでください。

拒否してもセッションは死にません。コマンドはエラーで終わり、Claude は作業を続けます。6:26 から見る - 13
サンドボックスが守らない範囲を覚える
注意書きはそのまま引用する価値があります。いちばん誤解されている点だからです。Sandboxing only applies to how Claude uses the Bash tool。組み込みの Read・Edit・Write は Claude Code の Permissions 側で設定します。サンドボックスはセッション全体を箱に入れるのではなく、シェルコマンドの下に床を敷る仕組みです。ファイル系ツールは別途ルールが必要です。

強制の層は 2 つ、設定ファイルも 2 つ。2 つ目の書き方は権限の解説ページにあります。7:32 から見る