Bash サンドボックス

Claude Code のサンドボックスを段階的に有効化する

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

Claude Code sandbox approval prompt reading Network request outside of sandbox for host github.com, offering Yes, Yes and do not ask again for github.com, or No and tell Claude what to do differently
ドメイン単位で 1 回だけ。github.com はこのプロジェクトの許可リストに無いので、プロキシは通さずにここで立ち止まります。

スクリーンショット 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. 1

    bubblewrap と socat を入れる

    実際に Claude Code を動かす Linux ディストリビューションで、サンドボックスが必要とする 2 つを入れます:sudo apt-get install bubblewrap socat。apt はここで 3 パッケージ(bubblewrap、libwrap0、socat)を解決し、472 kB と報告しています。macOS ではこのセクションごとスキップで OK です。Seatbelt は OS の一部です。

    Ubuntu terminal installing the Claude Code sandbox dependencies with apt, listing bubblewrap libwrap0 and socat as three newly installed packages beside the guide step 3 Install Sandbox Dependencies
    3 パッケージ 472 kB。Claude 専用のものは何もなく、bubblewrap は Flatpak と同じ仕組みです。1:52 から見る
  2. 2

    ネイティブインストーラーで Claude Code を入れる

    依存関係のあとに CLI を入れます:curl -fsSL https://claude.ai/install.sh | bash。収録では npm ではなくネイティブインストーラーを使っています。資料では両方の経路に触れたうえで、サンドボックスにはこの機能を備えた新しいビルドが必要、と書かれています。

    Ubuntu terminal finishing Setting up bubblewrap and Setting up socat and then running curl -fsSL https://claude.ai/install.sh piped to bash to install Claude Code with its native installer
    apt が Setting up bubblewrap と Setting up socat で終わり、その下にインストールコマンドが打ち込まれています。2:16 から見る
  3. 3

    Anthropic のサンドボックスランタイムを追加する

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

    Claude Code sandboxing notes open in Visual Studio Code showing the npm install -g @anthropic-ai/sandbox-runtime command next to an empty .claude/settings.json file in a WSL workspace
    空の settings.json が正直なスタート地点です。次のセクションで埋めます。3:10 から見る

settings.json に境界を書く

sandbox オブジェクト 1 つ、その下に filesystem と network。この後のセッションの挙動は、すべてここに書いた内容から決まります。

  1. 4

    sandbox オブジェクトを書く

    プロジェクトに .claude/settings.json を作り、sandbox キーを足します。収録では enabled: true と failIfUnavailable: true。サンドボックスが確保できないセッションは、無防備に走るのではなく起動を拒否します。filesystem には denyRead: ["../"] と allowRead: ["."]。プロジェクトは読めて、その親ディレクトリは読めません。この 2 行より上にある allowUnsandboxedCommands と autoAllowBashIfSandboxed の値は、エディターのミニマップに隠れているので、ここには書き写しません。

    Claude Code project file .claude/settings.json with the sandbox object open in the editor showing enabled true, failIfUnavailable true and a filesystem block whose denyRead is ../ while allowRead is .
    配列はどちらも要素 1 つだけ。allowRead "." と denyRead "../" — この手順のファイル境界はこれで全部です。4:12 から見る
  2. 5

    本当に必要なドメインだけを列挙する

    承認の挙動を決めるのが network サブオブジェクトです。収録では allowUnixSockets を空にし、allowAllUnixSockets: false、allowLocalBinding: false、allowedDomains には example.com の 1 件だけ。トラフィックは檻の外側にあるプロキシへ出されるため、リストにないドメインは黙って破棄ではなく、質問に変わります。

    Claude Code sandbox network block in settings.json listing allowUnixSockets, allowAllUnixSockets false, allowLocalBinding false and allowedDomains containing the single entry example.com
    許可ドメインは 1 つで十分です。通るケースと止まるケースの両方が映ります。4:20 から見る
  3. 6

    既定値がどちらに振れているか把握する

    資料は開始地点をはっきり書いています。読み取りは既定でマシン全体、書き込みはプロジェクト内だけ、ただし Claude Code が動くために不可欠なファイルを除外、と。denyRead と allowRead が狙うのは前半のほうです。緩い側の境界が SSH 鍵や .env に届いてしまうからです。同じ資料は、逃げ道を塞ぎたいなら "allowUnsandboxedCommands": false を推奨しています。

    Claude Code sandboxing notes explaining the Default Read and Write behavior, that reads are anywhere in the machine while writes are only in the project, and that setting allowUnsandboxedCommands false closes the escape hatch
    既定で緩いのは読み取り側です。だから allow の追加ではなく denyRead "../" を選んでいます。6:56 から見る

セッションを始めて、隔離されていることを確認する

Claude Code が最初の画面で教えてくれますが、最初の 1 コマンドでも確かめられます。

  1. 7

    claude を起動して一行目を読む

    プロジェクトで Claude Code を起動します。この画面のバージョンは v2.1.118 で、ウェルカムボックスの真下に Your bash commands will be sandboxed. Disable with /sandbox. と出ます。この一行がチェックポイントです。出なければサンドボックスは効いていません。設定ファイルとランタイム導入に戻ってください。

    Claude Code v2.1.118 session in a WSL terminal printing the yellow line Your bash commands will be sandboxed. Disable with /sandbox. under the welcome box and above an empty prompt
    起動時のお知らせは、中にいる事実と抜け出し方を同じ文で教えてくれます。4:44 から見る
  2. 8

    bash モードでファイル境界を確かめる

    プロンプトから ! cat ../hello.txt と直接実行します。ファイルは実在します。上のエディターで開いていて、エクスプローラーでもホーム階層に見えています。それでも隔離されたシェルは cat: ../hello.txt: No such file or directory。denyRead: ["../"] とはこれで、パスが確認ダイアログの向こうに隠れるのではなく、そもそも存在しなくなります。

    Claude Code bash mode running cat ../hello.txt inside the sandbox and getting cat: ../hello.txt: No such file or directory while the same hello.txt is open in the editor above
    拒否された読み取りは「拒否」ではなく「ファイルなし」に見える。プロンプトインジェクションが交渉できない理由がここにあります。5:56 から見る
  3. 9

    リストにあるドメインを取りに行く

    ! curl "https://example.com" は 528 バイトと Example Domain の HTML を返してきます。allowedDomains の唯一の項目がこのホストだからです。続く ! curl "https://github.com" はまだ Running...。プロキシには github.com の規則がないので、失敗ではなく待機です。

    Claude Code bash mode receiving 528 bytes of Example Domain HTML from curl https://example.com through the sandbox proxy and then starting curl https://github.com which is still running
    許可された通信は静かです。見どころは、どちらの規則にも当たらないときの挙動です。6:12 から見る
  4. 10

    セッションを開き直して定着を確かめる

    資料のステップ 8 は、設定を変えた後に毎回やるべき確認です。claude を閉じて起動し直し、サンドボックス化を示すメッセージが出るか見ます。設定は起動時にしか読まれないので、一行が出ない編集は、読み込まれていない編集と同じことです。

    Claude Code sandboxing guide step 8 Verify sandboxing in claude telling the reader to close and reopen claude and look for the message indicating that Claude is sandboxed
    地味ですが、手順として立てる価値があります。設定ファイルはミスを黙認しますが、起動時のお知らせは黙りません。7:26 から見る

ネットワークの確認プロンプト、その後に起きること

コマンド単位の承認に代わって出てくる質問です。1 ドメイン 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 回認めれば、その後の同じホストへの要求は静かになります。

    Claude Code sandbox approval dialog reading Network request outside of sandbox for host github.com with three choices Yes, Yes and do not ask again for github.com, and No and tell Claude what to do differently
    粒度に注目。約束はコマンド単位ではなくホスト単位なので、避けたかった確認ループに戻りません。6:18 から見る
  2. 12

    拒否したときに何が起きるか見る

    ダイアログの次のコマンドプロンプトには、0 バイトが並転送テーブルと curl: (56) CONNECT tunnel failed, response 403。プロキシがトンネルを開かなかったので、コマンドは走るけど何も受け取れません。収録ではどの選択肢を押したか映っていないので、ここはクリックの記録ではなく「拒否された結果」として読んでください。

    Terminal output after a Claude Code sandbox network request is declined, showing curl: (56) CONNECT tunnel failed, response 403 under a transfer table of zero-byte rows
    拒否してもセッションは死にません。コマンドはエラーで終わり、Claude は作業を続けます。6:26 から見る
  3. 13

    サンドボックスが守らない範囲を覚える

    注意書きはそのまま引用する価値があります。いちばん誤解されている点だからです。Sandboxing only applies to how Claude uses the Bash tool。組み込みの Read・Edit・Write は Claude Code の Permissions 側で設定します。サンドボックスはセッション全体を箱に入れるのではなく、シェルコマンドの下に床を敷る仕組みです。ファイル系ツールは別途ルールが必要です。

    Claude Code sandboxing Caveats section stating that sandboxing only applies to how Claude uses the Bash tool while the built-in file tools Read, Edit and Write are configured using Claude Permissions instead
    強制の層は 2 つ、設定ファイルも 2 つ。2 つ目の書き方は権限の解説ページにあります。7:32 から見る

このページが答える質問