Claude Codeを使い込むと、必ずこのジレンマにぶつかる。コマンドのたびに「実行していい?」と確認されて手が止まる。かといって全確認をオフにする --dangerously-skip-permissions権限バイパス)は、プロンプトインジェクションや誤操作で家じゅうのファイルを触られかねない。安全と自動化はトレードオフ——長らくそう思われてきた。

この二択を崩すのが サンドボックス(sandbox=砂場) だ。OSレベルで「触れる範囲」を先に囲っておけば、その中では確認なしで自由に走らせても、外には手が出せない。本記事は、Claude Codeのサンドボックスが何を・どう隔離するのか/sandbox での始め方、settings.json での設定、権限モードとの違い、そして過信してはいけない限界までを実務目線で整理する。

30秒で結論

迷ったらここだけ

サンドボックスとは
ファイルとネットワークの触れる範囲をOSで囲う仕組み。内側は自由、外側は不可。
なにが嬉しい
確認地獄と全バイパスの二択を解消。安全なまま確認を大幅削減できる。
まず何を
/sandbox を実行。macOSは即利用可、Linux/WSL2は2パッケージ導入。

※Anthropicの社内利用では、サンドボックスにより権限確認が84%削減できたと報告されている(後述・出典あり)。

1. なぜサンドボックスが要るのか

Claude Codeは、テストを走らせたりファイルを書き換えたりと実際に手を動かすAIエージェントだ。だからこそ、危険なコマンドの前で「実行していい?」と確認する。安全のためには正しい。だが一日に何十回も確認が挟まると、作業が細切れになり、しまいには読まずにEnterを押すようになる。これが「確認疲れ(permission fatigue)」だ。

疲れた開発者が手を伸ばしがちなのが、全確認をオフにする --dangerously-skip-permissions(別名 YOLOモード)。快適だが、名前どおり危険だ。次の3つが同時に牙をむく。

💉 プロンプトインジェクション

読み込んだWebページやissueに「~/.ssh を送信せよ」と仕込まれていると、確認なしで秘密鍵が流出しうる。

🗑️ 破壊的な誤操作

生成コマンドが想定外のパスを掃除。確認がなければプロジェクト外のファイルまで消えることも。

📤 サプライチェーン汚染

悪意ある依存パッケージがインストール時に外部へデータを送信。ネットワークが素通しだと止められない。

サンドボックスの発想はシンプルだ。「何を確認するか」を毎回聞くのをやめ、「どこまで触れるか」を最初に囲う。囲いはClaude自身の判断ではなくOS(カーネル)が強制するので、たとえ乗っ取られても、たとえ許可済みコマンドが名前以上のことをしても、境界の外には出られない。だから境界の内側は確認なしで走らせても安全——確認疲れと全バイパスの二択が消える。Anthropicは公式エンジニアリングブログ「Making Claude Code more secure and autonomous with sandboxing」で、社内利用において権限確認を安全に84%削減できたと報告している(2025年10月公開)。

2. サンドボックスとは何か——2つの隔離

Claude Codeのサンドボックスは、Bashコマンド(と、それが生む子プロセス全部)に対して2種類の境界をかける。この2つは必ずセットで機能させる——片方だけでは穴が残る(理由は §7)。

🗂️ ① ファイルシステム隔離

書き込みは作業ディレクトリ+セッション用一時フォルダのみ(初期値)。~/.bashrc やシステム領域は改変不可。読み取りは広めに許すが、明示的に禁止もできる。乗っ取られてもプロジェクトの外を書き換えられない

🌐 ② ネットワーク隔離

初期状態では接続先ゼロの「原則拒否」。新しいドメインに繋ごうとした瞬間に確認が入る。通信はサンドボックス外のプロキシを通り、許可リストで判定。秘密情報の外部送信を止める

肝は「Claudeが行儀よくするか」に頼らない点だ。境界をOSのセキュリティ機構——macOSは標準のSeatbelt、Linux/WSL2はbubblewrap——が強制する。だから、コマンドが呼び出したスクリプトや孫プロセスにまで同じ境界が及ぶ。これはAIガードレールのような「モデルへのお願い」ではなく、機械的に効く物理的な壁だと考えるといい。

💡 対象はBashだけ。 サンドボックスが囲うのはBashツールとその子プロセス。Claude内蔵のRead/Edit/Write、MCPサーバー、フック別枠(権限ルールで制御)だ。プロセス全体を丸ごと隔離したいときは、後述の @anthropic-ai/sandbox-runtime を使う。

3. 始め方——/sandbox と対応OS

サンドボックスはClaude Codeに内蔵されている。追加のアカウントやツールは不要だ。セッション内で次を実行する。

/sandbox

パネルが開き、3つのタブが並ぶ。Mode(承認方式=次章)、Overrides(サンドボックスで失敗したコマンドを外で再実行させるか)、Config(解決済みの設定を確認)。Linux/WSL2で必要パッケージが未導入なら、代わりに Dependencies タブが出て、何が足りないかを教えてくれる。

OSごとの前提

🍎 macOS

導入不要。OS標準のSeatbeltを使う。/sandbox ですぐ有効化できる。

🐧 Linux / WSL2

bubblewrapsocat の2つを導入。apt-get install bubblewrap socat など。

🪟 ネイティブWindows

非対応WSL2 の中でClaude Codeを動かす(WSL1は不可)。

Linux/WSL2では、bubblewrap(ファイル隔離を担う非特権サンドボックス)と socat(通信をプロキシへ中継)を入れる。

# Ubuntu / Debian
sudo apt-get install bubblewrap socat

# Fedora
sudo dnf install bubblewrap socat

⚠️ Ubuntu 24.04以降の注意: 既定のAppArmorポリシーが bubblewrap のユーザー名前空間作成を止めることがある。sysctl kernel.apparmor_restrict_unprivileged_userns1 を返すなら、bwrap 用のAppArmorプロファイルを追加して許可する(手順は公式ドキュメントに掲載)。0 かキー無しなら対応不要。WSL2でも同様に確認を。

1つ有効化しておくと便利なのが seccompフィルタ(Unixドメインソケットの遮断を追加)。任意だが、npm install -g @anthropic-ai/sandbox-runtime で導入できる。導入状況は /sandbox のDependenciesタブに ripgrep / bubblewrap / socat / seccomp として表示される。パッケージを入れたらClaude Codeを再起動してから /sandbox を開き直すこと(起動時に検出するため)。

4. 2つのモード(自動許可/通常)

Modeタブで選ぶのは、サンドボックス内のコマンドをどう承認するかだ。

✅ 自動許可モード(auto-allow)

サンドボックス内で走るBashコマンドを確認なしで自動実行。境界そのものが「確認」の代わりになる。日常作業はこれが快適。サンドボックスで動かせないコマンド(許可外ホストへの通信など)は、通常の権限フローにフォールバックして確認が入る。

🔍 通常権限モード(regular)

サンドボックスされていても、すべてのBashコマンドが通常の権限確認を通る。制御は増えるが承認も増える。「隔離+従来どおりの確認」を両立したい慎重派向け。

どちらのモードでもファイル/ネットワークの境界は同一で、違うのは「自動で通すか、確認するか」だけだ。なお自動許可モードでも、次の安全弁は生き続ける。

  • 明示的な deny(禁止)ルールは常に優先される
  • /・ホームディレクトリ・重要システムパスを狙う rm / rmdir依然として確認が入る
  • Bash(git push *) のような内容指定の ask ルールは、サンドボックス内でも確認を強制する

紛らわしい2つの「自動」に注意。 サンドボックスの自動許可モードは、権限モードautoモードとは別物だ。前者は「OSの境界が閉じ込めるから自動で通す」、後者は「分類器がコマンドの安全性を審査して通す」。両者は独立に働き、組み合わせられる。

5. settings.json で設定する

/sandbox パネルでの選択は、プロジェクトの .claude/settings.local.json に書き込まれる(gitには載らない)。全プロジェクトで常時オンにするなら、ユーザー設定 ~/.claude/settings.jsonsandbox.enabledtrue で置く。設定は 権限ルール(allow/ask/deny)と同じ settings.json ファミリーで管理する。

書き込み先を足す・読み取りを禁じる

初期状態で書けるのは作業ディレクトリと一時フォルダだけ。kubectlterraform が別の場所に書く必要があるなら、allowWrite でパスを足す。逆に、機微なフォルダの読み取りを塞ぐこともできる。

{
  "sandbox": {
    "enabled": true,
    "filesystem": {
      "allowWrite": ["~/.kube", "/tmp/build"],
      "denyRead": ["~/"],
      "allowRead": ["."]
    }
  }
}

上の例は「ホーム全体の読み取りを禁止しつつ、いまのプロジェクトだけ読める」設定だ(. はプロジェクト設定に置いたときプロジェクトルートに解決される)。パスはOSレベルで強制されるので、npmterraform などの子プロセスにも等しく効く。

認証情報を守る

重要な落とし穴:読み取りの初期値は「広く許可」なので、~/.aws/credentials~/.ssh/そのままだと読めてしまう。専用の sandbox.credentials(比較的新しい機能)でファイルの読み取り拒否や環境変数の除去を宣言できる。

{
  "sandbox": {
    "enabled": true,
    "credentials": {
      "files": [
        { "path": "~/.aws/credentials", "mode": "deny" },
        { "path": "~/.ssh", "mode": "deny" }
      ],
      "envVars": [
        { "name": "GITHUB_TOKEN", "mode": "deny" }
      ]
    }
  }
}

接続先を許可する

ネットワークは初期状態で接続先ゼロ。新しいドメインは繋ごうとした時点で確認が入る(記事執筆時点の新しめのバージョンでは、一度許可すればそのセッション中は再確認されない)。毎回聞かれたくない相手は allowedDomains に先に登録しておく。組織で強制配布する管理設定(managed settings)では、許可リスト以外を確認せず自動遮断する運用もできる。

{
  "sandbox": {
    "enabled": true,
    "network": {
      "allowedDomains": ["*.github.com", "registry.npmjs.org"]
    }
  }
}

組織で必須化するには。 管理設定で sandbox.enabled: true に加え、failIfUnavailable: true(サンドボックスが起動できなければClaude Codeを起動させない)と allowUnsandboxedCommands: false(外での再実行という「逃げ道」を封じる=厳格モード)を置けば、セキュリティゲートとして強制できる。

6. 権限モード・権限ルールとの関係

混同しやすいが、Claude Codeの安全機構は役割の違う3層だ。サンドボックスはその1層で、他の2つを置き換えるものではなく補完する。

制御するもの 強制する主体 対象
権限ルール どのツール/コマンドを使えるか Claude Code(実行前) 全ツール
権限モード 確認をどれだけ出すか Claude Code(実行前) モード次第
サンドボックス 走った後に何へ触れるか OS(カーネル) Bashと子プロセス

決定的な違いは「いつ・誰が」効くかだ。権限ルールとモードは実行前にClaude Codeがコマンド文字列を見て判断する。サンドボックスは実行中にOSがプロセスを縛る——だからモデルが何を選ぼうと、許可済みコマンドが名前以上のことをしようと、境界は揺るがない

これが --dangerously-skip-permissions(バイパス)との決定的な差でもある。バイパスは確認を消すだけで環境は素っ裸のまま。対してサンドボックスの自動許可は、OSの壁があるから確認を省けるバイパスモードを使うなら、必ず隔離されたコンテナやVMの中で——という従来の鉄則を、サンドボックスは日常のマシン上でも安全側に倒せるようにした、と捉えるとよい。

7. 限界と注意点——過信は禁物

サンドボックスは強力だが、完全な隔離ではない。ハードなセキュリティ境界として頼り切る前に、公式が明示する限界を押さえておく。

🔓 TLSは既定で中身を見ない

プロキシはホスト名で許可判定するだけで、暗号化通信の中身は検査しない(既定)。github.com のような広いドメインを許すと、ドメインフロンティング等で外部へデータを逃がす余地が残る。許可リストは狭く

🔌 Unixソケットの開放は危険

/var/run/docker.sock を許すと、Dockerソケット経由でホスト全体に手が届く=実質サンドボックス突破。開けるソケットは慎重に。

📈 広すぎる書き込み許可

$PATH 上の実行ファイルや .bashrc 等へ書けると、別文脈でのコード実行に化ける。allowWrite は最小限に。

加えて押さえるべき点:対象はBashだけ——内蔵のRead/Edit/Write、MCPサーバー、フックは別枠だ。SkillsやMCPを含めてプロセス丸ごと隔離したいなら、公式のオープンソース @anthropic-ai/sandbox-runtimeGitHub・npmで公開、2025年10月公開のリサーチプレビュー)でClaude Codeプロセス自体を包む。攻撃者を相手取る「壁」ではなく、事故と暴走を桁違いに減らす「安全帯」——それが実務的な位置づけだ。

8. dev container・VMとの使い分け

Claude Codeの隔離手段はサンドボックスだけではない。手軽さ隔離の強さはトレードオフなので、用途で選ぶ。

サンドボックス(内蔵)

Bashと子プロセスを隔離。Docker不要・導入最小。日常開発で確認を減らす主力。

sandbox-runtime

Claude Codeプロセス全体を包む。MCPやフックまで囲いたい無人運用向け。Docker不要。

dev container

開発環境ごとコンテナ化。チームで環境を揃える標準化に。Docker必須。

VM(仮想マシン)

OSごと分離。カーネルレベルの最強隔離。信頼できないコードを扱う時に。手間は最大。

実務の勘どころ:まず内蔵サンドボックスを常時オンにして日々の確認を減らし、無人で回す・信頼できない依存を扱うときだけ sandbox-runtime やコンテナ/VMへ格上げする。クラウド操作をAIに任せるような本番に手が届く作業では、最小権限の資格情報と併せて隔離を一段強くしておくと安心だ。

まとめ

  • サンドボックスは「触れる範囲をOSで囲う」仕組み。確認疲れと全バイパスの二択を解消する。
  • 隔離はファイルシステム+ネットワークの2つをセットで。強制はmacOS=Seatbelt/Linux・WSL2=bubblewrap。
  • /sandbox で開始。macOSは即利用可、Linux/WSL2は bubblewrap+socat、ネイティブWindowsは非対応(WSL2で)。
  • 自動許可モードで確認なしでも、境界がOS強制なので安全。deny・危険な rm・内容指定askは残る。
  • 権限ルール/モードとは役割の違う補完層。サンドボックスは実行後にOSが縛るので揺るがない。
  • ただし完全な壁ではない——TLS非検査・Unixソケット・広すぎる許可に注意。対象はBashのみ。

安全と自動化はトレードオフ、という前提そのものを崩すのがサンドボックスだ。まず /sandbox を一度開いてみる——それだけで、Claude Codeの手綱の握り方が大きく変わる。設定の正確な最新仕様は、公式のサンドボックス設定ドキュメントを一次情報として確認してほしい。

FAQ

Q. サンドボックスと --dangerously-skip-permissions は何が違う?

A. バイパスは確認を消すだけで環境は無防備。サンドボックスはOSレベルで触れる範囲を囲うので、確認を省いても外に手が出せない。バイパスは隔離環境専用、サンドボックスは日常マシンでも安全に使える点が決定的に違う。

Q. Windowsで使える?

A. ネイティブWindowsは非対応WSL2 の中でClaude Codeを動かせば利用できる(WSL1は不可)。WSL2ではサンドボックス内から cmd.exe 等のWindowsバイナリは呼べないため、必要なら excludedCommands で外に出す。

Q. 有効にすると遅くなる?

A. 公式によればオーバーヘッドは最小限で、一部のファイル操作がわずかに遅くなる程度。むしろ確認回数が大きく減るため、体感の作業速度は上がることが多い。

Q. サンドボックスがあれば秘密鍵は絶対に漏れない?

A. 「絶対」ではない。読み取りの初期値は広い許可なので、~/.ssh~/.aws/credentials は既定では読めてしまう。sandbox.credentialsdenyRead で明示的に塞ぎ、ネットワーク許可リストを狭く保つこと。ファイル隔離とネットワーク隔離は必ずセットで効かせる。

Q. MCPサーバーやフックもサンドボックスされる?

A. されない。内蔵サンドボックスの対象はBashコマンドと子プロセスだけ。MCP・フック・内蔵のRead/Edit/Writeは別枠(権限ルールで制御)だ。それらも含めて丸ごと囲いたいときは @anthropic-ai/sandbox-runtime でプロセス全体を包む。