「Claude Code にホームディレクトリを吹き飛ばされた」——こんな記事がネット上で話題になったことがあります。
もちろん、実際にこうした事故が起きるには特殊な条件が必要です。しかし、AI エージェントにファイルの書き換えやコマンドの実行を任せる以上、「何が起きうるか」を理解しておくのは不可欠です。
Claude Code は強力なツールです。だからこそ、適切なガードレールを設定して使うべきです。この記事では、サンドボックス、権限ルール、プロンプトインジェクション対策、そして企業導入時のポリシー設計まで、Claude Code のセキュリティを体系的に解説します。
Claude Code のセキュリティは3層構造
Claude Code のセキュリティは、大きく3つのレイヤーで構成されています。
┌─────────────────────────────────┐
│ 1. 権限システム(Permissions) │ ← ツール単位で allow/ask/deny
├─────────────────────────────────┤
│ 2. サンドボックス(Sandbox) │ ← OS レベルでファイル・ネットワーク隔離
├─────────────────────────────────┤
│ 3. パーミッションモード │ ← default / auto / bypass 等の動作モード
└─────────────────────────────────┘
この3つを正しく理解して組み合わせることで、「安全だけど実用的」な環境を作れます。
サンドボックス:OS レベルの隔離
サンドボックスは Claude Code のセキュリティの要です。OS のセキュリティ機構を使って、Bash コマンドのファイルアクセスとネットワークアクセスを物理的に制限します。
なぜサンドボックスが必要なのか
従来の権限システムは「Claude がツールを使う前に毎回確認する」仕組みです。しかし、これには問題があります。
- 承認疲れ: 何度も「許可しますか?」と聞かれるうちに、内容を確認せずに承認してしまう
- Read/Edit の deny ルールは Bash を止められない:
Read(.env)を deny してもcat .envは止まらない
サンドボックスはこの問題を解決します。OS レベルで制限をかけるので、Bash コマンドから生まれたすべての子プロセスにも制限が適用されます。
有効化する
/sandbox
このコマンドでメニューが開き、モードを選べます。
- macOS: Seatbelt(OS 組み込み)を使用。追加インストール不要
- Linux / WSL2: bubblewrap と socat が必要
# Ubuntu/Debian
sudo apt-get install bubblewrap socat
# Fedora
sudo dnf install bubblewrap socat
WSL1 は非対応です。カーネル機能の制約で bubblewrap が動かないためです。
ファイルシステム隔離
サンドボックスが有効な状態では、Bash コマンドのファイル操作に以下の制限がかかります。
| 操作 | デフォルトの挙動 |
|---|---|
| カレントディレクトリ配下への読み書き | 許可 |
| カレントディレクトリ外の読み取り | 許可(一部ディレクトリを除く) |
| カレントディレクトリ外への書き込み | ブロック |
追加で書き込みを許可したいパスがある場合は、settings.json で指定します。
{
"sandbox": {
"enabled": true,
"filesystem": {
"allowWrite": ["~/.kube", "/tmp/build"]
}
}
}
kubectl や terraform、npm のように、プロジェクト外にファイルを書き出すツールを使う場合に設定します。
逆に、読み取りすら禁止したい場合は denyRead を使います。
{
"sandbox": {
"enabled": true,
"filesystem": {
"denyRead": ["~/"],
"allowRead": ["."]
}
}
}
この設定はホームディレクトリ全体の読み取りをブロックしつつ、プロジェクトルートだけ許可する例です。
ネットワーク隔離
ネットワークアクセスは、サンドボックス外部で動くプロキシサーバーを通じて制御されます。
- 許可されたドメインのみに接続可能
- 未知のドメインへのアクセスは確認プロンプトが表示される
allowManagedDomainsOnlyを有効にすると、許可リスト外のドメインはプロンプトなしで即ブロック
この仕組みのおかげで、プロンプトインジェクションで Claude が騙されても、攻撃者のサーバーにデータを送信することはできません。
サンドボックスのモード
サンドボックスには2つの動作モードがあります。
Auto-allow モード: サンドボックス内で動く Bash コマンドは自動承認されます。サンドボックスの境界を超える操作だけ確認プロンプトが出る。最も実用的なモードです。
通常権限モード: サンドボックスの中でも外でも、すべての Bash コマンドに確認が必要。最も安全だけど手動承認が多い。
権限ルール:ツール単位の制御
サンドボックスが OS レベルの隔離なら、権限ルールは「Claude がどのツールを使えるか」のソフトウェアレベルの制御です。
基本構文
権限ルールは settings.json の permissions セクションに書きます。
{
"permissions": {
"allow": [
"Bash(npm run build)",
"Bash(npm run test *)",
"Bash(git commit *)"
],
"deny": [
"Bash(git push *)",
"Bash(rm -rf *)",
"Read(.env)"
],
"ask": [
"Bash(npm install *)"
]
}
}