Claude Codeの権限の設定は、拒否のルールを書いておけば、機密ファイルの読み取りを止められます。ただし、これはClaude Code自身が守るルールで、コマンドの組み立て方しだいで抜け道が残ってしまいます。そこで、OSの機能を使い、Claude Codeが届く範囲をあらかじめ囲い込むのが「サンドボックス」です。ファイルとネットワークの2つの軸で範囲を区切るため、ルールを守らせる仕組みとは別のもう一段の防御になります。
Oikon・前川蒼『Claude Code実践入門 Agentic Coding』(SBクリエイティブ)を参考にして。
権限の設定だけでは防ぎきれない部分を、OSの仕組みで補う
ソフトウェアのルールには抜け道が残ってしまう
設定ファイル(settings.json)で .env(パスワードなどの機密情報を置くファイル)の読み取りを拒否すると、Readツールだけでなく、Bash(コマンドの実行)の中でその中身を表示させる分かりやすいコマンドもブロックされてしまいます。
ただし、これはClaude Codeというソフトウェアが行っている判断です。
シェルを経由して間接的に実行する書き方や、.env を開くスクリプトの実行までは追いきれません。
コマンドの組み立て方しだいでは、権限のチェックをすり抜ける余地が残るのです。
プロンプトインジェクションを前提に考える
「プロンプトインジェクション」は、悪意のある指示をユーザーの入力や外部のコンテンツに紛れ込ませ、Claude Codeの動作を乗っ取る攻撃です。
例えば、Claude Codeに読み込ませたWebページやGitHubのIssue(課題票)、依存パッケージの説明文に不正な指示が埋め込まれていると、本来の依頼とは無関係な操作を実行させられるリスクがあります。
最悪の場合、機密ファイルが読み取られ、外部へ送られる事態につながります。
そのため、ソフトウェアのルールだけに頼らず、OSのレベルで分離しておくとよいです。
分離の軸は「ファイル」と「ネットワーク」
「サンドボックス」が提供する分離は、「ファイルシステム(ファイルの置き場)の分離」と、「ネットワークの分離」の2つです。
OSが持つ囲い込みの仕組みで実現され、macOSでは標準の「Seatbelt」、LinuxとWSL2(Windows上でLinuxを動かす仕組み)では「bubblewrap」が使われます。

ファイルとネットワークは、それぞれ別の関門で区切られる
ファイルの分離:書き込める範囲を作業フォルダに絞る
ファイルの分離では、書き込みができる場所が、作業中のフォルダ(プロジェクトのルート)とその配下、および一時フォルダに限られます。
ホームフォルダの設定ファイルやシステムの設定フォルダなど、パソコンの動作を決めるファイルには、初期状態では書き込めません。
一方で、読み取りは、初期状態でパソコン全体が許可されています。
機密ファイルを守りたい場合は、読み取りの拒否を明示的に設定する必要はあります。
ネットワークの分離:外へ出る通信は門番が確認する
ネットワークの分離では、サンドボックスの外側で動く「プロキシサーバー(通信の中継役)」が、すべての通信を取り次ぎます。
許可リストに登録したドメインへの接続はそのまま通り、未登録のドメインへ接続しようとすると、初期状態ではユーザーに確認が求められます。
組織として許可したドメイン以外への接続を完全に止めたいときは、管理者向けの設定で、確認を省いて自動で遮断する運用に切り替えられます。

有効にするときの選択肢と、守れる範囲・守れない範囲
有効化は「/sandbox」で、動作モードは2つ
有効にするには「/sandbox」というコマンドを実行し、動作モードを選びます。
ここで選んだ内容は、そのプロジェクトのローカル設定に保存され、そのプロジェクトにだけ適用されます。
すべてのプロジェクトで使いたい場合は、ユーザー設定の側で有効にします。
- Auto-allowモード
サンドボックスの中で実行されるBashコマンドは、確認なしで自動的に許可される - Regular permissionsモード
サンドボックスの中のコマンドでも、通常の権限の流れで確認が求められ、より厳格に制御される
サンドボックスの制限でコマンドが失敗すると、Claude Codeは失敗を分析して、やり直すことがあります。
このとき、サンドボックスの外での再実行を許すかどうかも、設定で選べます。
同じ読み取りの試みが、層ごとに別々の関門で止まる
書籍では、.env への読み取りを3つの方法で試し、どの層で止まるかを確かめています。
| 試した方法 | 止めた層 |
|---|---|
| Readツールで .env を読む | 権限の設定(拒否のルール) |
| Bashで .env の中身を表示する | Claude CodeのBash権限チェック |
| シェルを経由して間接的に表示する | OSのサンドボックス |
3つ目は、Claude Codeのルールの外側でOSが拒否するため、「Operation not permitted(許可されていない操作)」で失敗します。
子プロセスまで含めて読み取りが拒否されるので、Claude Codeが巧みにコマンドを組み立てても、OSが拒否する以上はすり抜けられません。
通信も同じ構図で、WebFetch(Webページの取得)は権限の設定、curl(通信を行うコマンド)はBash権限チェック、シェル経由の通信はプロキシが遮断します。
コマンドをどう組み替えても、OSの外へ通信が出ていくことは基本的にありません。
ただし、許可リストに github.com のような広いドメインを登録した場合、そのドメインの配下への流出までは防げません。

使える環境と、注意しておく点
サンドボックスはOSの機能に依存するため、使える環境が限られます。
| 環境 | 使う技術 | 追加のインストール |
|---|---|---|
| macOS | Seatbelt | 不要(OS標準) |
| Linux/WSL2 | bubblewrap と socat | 必要(UbuntuやDebianはパッケージをインストール) |
| WSL1 | 非対応 | bubblewrapに必要なカーネル機能がないため |
| Windows(ネイティブ) | 未対応 | WSL2の中でClaude Codeを動かす方法がある |
Anthropicの公式ドキュメントでも、ネイティブWindowsではコマンドが保護なしで実行されると案内されています。
仮想環境や別のサンドボックスの中でClaude Codeを動かしている場合は、初期化に失敗することがあります。
その場合は、設定例を残したままサンドボックスを無効に戻し、権限の拒否のルールとHooksで守る範囲を明示しておくと安全といえそうです。
当事務所での使い方
当事務所はWindows(ネイティブ)でClaude Codeを使っているため、サンドボックスは利用できません。
その代わりに、権限の拒否のルールとHooksを重ねて、守る範囲を補っています。
- 読み取りの範囲
初期状態では読み取りがパソコン全体に及ぶため、認証情報やマイナンバーを含むフォルダは、拒否のルールで読み取りを塞いでいます。 - 外へ出る通信
データの持ち出しにつながる通信は、拒否のルールと、実行前に内容を検査するHooksの両方で止めています。
OSが外枠を決めるサンドボックスが使えない環境では、拒否のルールとHooksを重ね、どこまで守れているかを実際に試して確かめることが欠かせないといえます。
