0. はじめに
Claude Codeのパーミッションシステムとサンドボックス機能は、AIエージェントの安全性を担保しながら効率的な開発を実現する仕組みだ。
本記事は、Claude Codeの機能を体系的に解説する連載シリーズの第3回である。セキュリティを保ちながら、Claude Codeを快適に使える状態を作ることが目標だ。
連載予定
- #1: インストールから"使える"初期設定まで
- #2: CLAUDE.mdの書き方と育て方
- #3: パーミッション&Sandbox完全ガイド (本記事)
- #4: Hooks実践テクニック
- #5: Skills入門
- #6: MCP活用術
1. パーミッション設定の基本
Claude Codeは強力だが、ローカル環境で動作するため、誤った操作のリスクがある。パーミッションシステムは、AIが自動的にシステムを変更しないことを保証する。
評価順序はDeny → Ask → Allow
パーミッションルールはDeny → Ask → Allowの順で評価され、最初にマッチしたルールが優先される。
{
"permissions": {
"deny": ["Bash(curl *)", "Read(./.env)"],
"ask": ["Bash(git push *)"],
"allow": ["Bash(npm run test *)", "Read(./src/*)"]
}
}
評価の流れはこうだ。Denyにマッチすれば即ブロック、Askにマッチすれば確認を求める。Allowにマッチすれば自動承認、どれにも一致しなければAsk扱いになる。
ルール構文
基本形式は Tool(specifier) で、たとえば Bash(npm run *) や Read(./.env) となる。ワイルドカードは * が任意の文字列、** が全サブディレクトリを指す。
スコープの優先順位はLocal > Project > Userで、上位が下位を上書きする。
2. Sandboxモード完全ガイド
Claude Codeは安全性のため、各操作で許可を求める。これが100回以上繰り返されることもあり、開発効率を低下させていた。
解決策として /sandbox コマンドで境界を設定すれば、その範囲内で自由に作業できる。境界内は自動承認、境界外は制限され、OSレベルでファイルシステムとネットワークが分離される。
OS別サポート
macOSは標準サポート。Linux/WSL2は要インストールで sudo apt-get install bubblewrap socat を実行する。WSL1は非サポートだ。
Tips: WSL1を使用している場合、Sandbox機能は利用できない。WSL2へのアップグレードを推奨する。
仕組みはシンプルで、書き込みはカレントディレクトリ以下のみ、ネットワークは承認済みドメインのみアクセス可能となる。
Sandbox設定例
{
"sandbox": {
"enabled": true,
"autoAllowBashIfSandboxed": true,
"excludedCommands": ["git", "docker"],
"network": {"allowedDomains": ["github.com", "*.npmjs.org"]}
}
}
3. セキュリティベストプラクティス
Claude CodeはLLMにファイル内容を送信するため、機密情報は必ず deny でブロックすること。
{
"permissions": {
"deny": [
"Read(./.env*)", "Read(./secrets/**)",
"Read(~/.aws/**)", "Read(~/.ssh/**)",
"Bash(rm -rf *)", "Bash(sudo *)", "Bash(git push -f *)"
]
}
}
4. 3層防御モデル
Claude Codeのセキュリティは3つのレイヤーで構成される。
- Permission System - 全ツールにDeny/Ask/Allowルールを適用
- Sandbox Mode - Bash専用のOSレベル分離
- Runtime Monitoring - コマンドインジェクション検出、特権昇格防止
Sandboxで開発スピードを確保し、Permissionで機密情報を保護することで、速度と安全性を両立できる。
5. ユースケース別の実装テンプレート
個人開発者向け(バランス型)
想定は個人プロジェクト、柔軟性重視、基本的なセキュリティ確保だ。
~/.claude/settings.json に以下を記述する。
{
"permissions": {
"allow": [
"WebFetch", "WebSearch", "Bash(npm run *)",
"Bash(git status)", "Bash(git diff *)", "Bash(git log *)",
"Read(./src/**)", "Read(./docs/**)",
"Edit(./src/**)", "Edit(./docs/**)"
],
"ask": ["Bash(git push *)", "Bash(npm publish)"],
"deny": [
"Read(./.env*)", "Edit(./.env*)",
"Bash(git push -f *)", "Bash(rm -rf *)"
]
},
"sandbox": {
"enabled": true,
"autoAllowBashIfSandboxed": true,
"excludedCommands": ["git"],
"network": {"allowedDomains": ["github.com", "*.npmjs.org"]}
}
}
読み取りは自動承認、破壊的操作は確認を求め、Sandboxを有効化している。
Tips:
excludedCommandsにgitを追加すると、git操作がSandbox外で実行される。gitは完全なファイルシステムアクセスが必要なため、除外が推奨される。
チーム開発向け(厳格型)
想定はチーム開発、レビュープロセス重視、厳格なセキュリティだ。
.claude/settings.json (プロジェクトルート)に以下を記述する。
{
"permissions": {
"allow": [
"WebFetch", "WebSearch", "Bash(npm run lint)",
"Bash(npm run test *)", "Bash(git diff)", "Bash(git status)",
"Read(./src/**)", "Read(./tests/**)"
],
"ask": [
"Edit(./src/**)", "Edit(./tests/**)",
"Bash(git commit *)", "Bash(git push *)"
],
"deny": [
"Read(./.env*)", "Read(./secrets/**)",
"Edit(./.env*)", "Bash(git push -f *)",
"Bash(git reset --hard *)", "Bash(rm *)"
]
},
"sandbox": {
"enabled": true,
"autoAllowBashIfSandboxed": false,
"excludedCommands": ["git", "docker"],
"network": {
"allowedDomains": ["github.com", "*.npmjs.org", "registry.yarnpkg.com"]
}
}
}
全ての編集とGit操作で確認を求め、チーム全体で設定を共有する。
エンタープライズ向け(Managed設定)
想定は企業環境、IT部門による一元管理、コンプライアンス重視だ。
/Library/Application Support/ClaudeCode/managed-settings.json (macOS)に以下を記述する。
{
"allowManagedPermissionRulesOnly": true,
"allowManagedHooksOnly": true,
"disableBypassPermissionsMode": "disable",
"permissions": {
"allow": [
"WebFetch(domain:github.com)",
"WebFetch(domain:*.company-internal.com)",
"Bash(npm run lint)", "Bash(npm run test *)", "Read(./src/**)"
],
"ask": ["Edit(./src/**)", "Bash(git commit *)"],
"deny": [
"Read(./.env*)", "Read(./secrets/**)",
"Read(~/.aws/**)", "Read(~/.ssh/**)",
"Edit(./.env*)", "Bash(curl *)", "Bash(wget *)",
"Bash(sudo *)", "Bash(git push -f *)", "WebFetch"
]
},
"sandbox": {
"enabled": true,
"autoAllowBashIfSandboxed": false,
"allowUnsandboxedCommands": false,
"excludedCommands": ["git"],
"network": {
"allowedDomains": ["github.com", "*.company-internal.com"]
}
}
}
IT部門による上書き不可設定、バイパス無効化、内部ドメインのみ許可する。
6. よくある問題TOP3
1. allowに追加したのにブロックされる
評価順序はDeny → Ask → Allowのため、deny が優先される。deny リストを確認すること。
2. Sandboxでgitコマンドが失敗
excludedCommands にgitを追加する。"excludedCommands": ["git"] と記述すればよい。
3. npm installでネットワークエラー
network.allowedDomains に *.npmjs.org を追加する。
注意:
network.allowedDomainsで過度に広範なドメイン(*.comなど)を許可すると、データ流出のリスクがある。必要最小限のドメインのみ追加すること。
7. まとめ&次回予告
セキュリティチェックリスト
パーミッション設定後、以下をチェックすること。
-
機密ファイル(.env, secrets/)を
denyに追加 -
破壊的コマンド(rm -rf, git push -f)を
denyに追加 - Sandboxモードを有効化
-
network.allowedDomainsに必要なドメインのみ追加 -
excludedCommandsに必要最小限のコマンドのみ追加
次回予告
次回はHooks実践テクニックを解説する。処理完了通知、コミット前チェック、自動デプロイなど、実務で役立つHooksの設定方法を紹介する予定だ。
参考: Claude Code 公式ドキュメント - Security / Sandboxing / Permissions