目次
Claude Codeの権限ルール(permission rules)は、settings.json に allow / ask / deny を書いて、「どのツール・コマンド・ファイル・ドメインを、確認なしで許す/毎回聞く/禁止する」を細かく指定するしくみだ。チームで共有でき、危険な操作だけ確実にブロックしつつ、安全な定型作業はノンストップで回せる。
本記事では、権限ルールとは何か(権限モードとの違い)・allow/ask/denyの優先順位・ルールの書き方・settings.jsonの階層・実用レシピまでを、公式仕様に基づいて整理する。
allow / ask / deny で細かく制御
評価順は deny → ask → allow(最初に一致したものが勝つ)
deny
禁止(最優先・必ず勝つ)
ask
毎回確認する
allow
確認なしで許可
1. 権限ルールとは(モードとの違い)
Claude Codeは段階的な権限システムを持つ。読み取り(ファイル閲覧・Grep等)は確認不要、Bashコマンドやファイル編集は確認が必要——という土台の上に、ルールで「例外」を細かく指定できる(出典:Claude Code公式「Configure permissions」)。
混同しやすいのが権限モードとの違いだ。モードは“全体の確認頻度”の大枠(default/acceptEdits/auto等)、ルールは“個別のツール・コマンド単位”の指定。両者は重なって働く——モードで大枠を決め、ルールで「これは常に許可」「これは絶対禁止」を上書きする。
💡 ルールはClaude Codeが強制する(モデルではない)。プロンプトや CLAUDE.md はClaudeの“やろうとすること”に影響するが、“許される範囲”は変えない。許可・禁止は /permissions・ルール・モード・PreToolUseフックで制御する。
2. allow / ask / deny と優先順位
ルールは3種類。/permissions コマンドで一覧・編集できる(どの settings.json 由来かも表示される)。
確認なしで許可
指定したツール/コマンドを手動承認なしで実行できる。
毎回確認する
使うたびに確認を求める。より広いallowがあっても、askが一致すれば確認が出る。
禁止(最優先)
使わせない。どのallowより強く、どの階層のdenyも必ず勝つ。
評価順は deny → ask → allow。最初に一致したルールで結果が決まり、ルールの細かさ(具体性)は順序を変えない。たとえば広い Bash(aws *) のdenyは、より具体的な Bash(aws s3 ls) のallowより優先してブロックする。denyは例外(許可リスト)を持てないのが要点だ。
⚠️ denyの2形は挙動が違う:ツール名だけの Bash はツールごと文脈から消す(Claudeが存在を認識しない)。Bash(rm *) のように範囲指定すると、ツールは使えるが一致した呼び出しだけブロックする。
3. ルールの書き方(Tool(指定子))
形式は Tool(全体)か Tool(指定子)(個別)。ツール別に指定子の書き方が違う。
| ツール | 例 | 意味 |
|---|---|---|
| Bash | Bash(npm run *) | npm run で始まるコマンド(末尾 *は単語境界) |
| Read / Edit | Read(./.env) | カレントの.env読み取り(gitignore形式パス) |
| WebFetch | WebFetch(domain:example.com) | example.comへのfetch |
| MCP | mcp__github__get_* | githubサーバーのget_系ツール |
| Agent | Agent(Explore) | Exploreサブエージェント |
Bashのワイルドカードは位置自由。Bash(ls *)(空白+*)は ls -la に一致するが lsof には不一致(単語境界)。空白なしの Bash(ls*) は両方一致。末尾の :* は * と等価。
// 安全なコマンドは許可、git push は禁止
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(git commit *)"
],
"deny": [
"Bash(git push *)"
]
}
}
複合コマンドに注意。Claude Codeは && || ; | などの区切りを理解し、各サブコマンドが個別に一致しないと許可されない。Bash(safe-cmd *) は safe-cmd && rm -rf . を許可しない。なお ls/cat/grep/find/pwd 等の読み取り専用コマンドは全モードで確認なし、timeout/nice/nohup 等のラッパーは剥がして照合される。
Read/Editのパスはgitignore形式で、アンカーが4種類ある。
| 書き方 | 基準 | 例 |
|---|---|---|
//path | ファイルシステム絶対 | Read(//tmp/x) |
~/path | ホーム | Read(~/.ssh/**) |
/path | プロジェクトルート | Edit(/src/**) |
path / ./path | カレント | Read(.env) |
※ /Users/... は絶対パスではなく「プロジェクトルート基準」。絶対パスは //Users/... と二重スラッシュで書く。Read(.env) は Read(**/.env) と同義で、配下の全 .env に一致。
4. settings.json の階層と優先順位
ルールは settings.json に書く。ファイルは複数あり、上の階層ほど強い。重要なのは「どの階層のdenyも、他のどの階層のallowより必ず勝つ」こと。
| 優先 | 場所 | 用途 |
|---|---|---|
| 1(最強) | 管理(managed)設定 | 組織ポリシー。ユーザー/CLIで上書き不可 |
| 2 | コマンドライン引数 | そのセッションの一時上書き |
| 3 | .claude/settings.local.json | 個人のプロジェクト設定(gitignore) |
| 4 | .claude/settings.json | チーム共有のプロジェクト設定(コミット) |
| 5 | ~/.claude/settings.json | 全プロジェクト共通のユーザー設定 |
// .claude/settings.json(チーム共有)
{
"permissions": {
"defaultMode": "acceptEdits",
"allow": ["Bash(npm run *)", "WebFetch(domain:docs.example.com)"],
"deny": ["Read(.env)", "Read(**/secrets/**)", "Bash(git push *)"],
"additionalDirectories": ["../shared-lib"]
}
}
権限モードの既定もここで defaultMode として指定する(モード詳細)。作業フォルダ外を読み書きさせたいときは additionalDirectories に追加する。
5. 実用レシピ
よく使う組み合わせを挙げる。「危険だけdenyで確実に止め、安全な定型はallowで自動化」が基本形だ。
🔒 秘密ファイルを守る
deny: ["Read(.env)", "Read(**/secrets/**)", "Read(~/.ssh/**)"]。読み取り自体をブロック。
🚀 危険操作は必ず確認
ask: ["Bash(git push *)", "Bash(rm *)"]。自動モードでも確認を強制。
⚡ 定型作業を自動化
allow: ["Bash(npm run *)", "Bash(git commit *)"]。テスト/ビルド/コミットをノンストップに。
URLの制限はBashの引数パターンでは脆い(curl http://github.com/ * は -X GET や変数展開で簡単にすり抜ける)。代わりに curl/wget をdenyし、WebFetch(domain:...) で許可ドメインを指定するのが堅い。さらに厳格にしたいなら PreToolUseフックでURLを検証する。
6. 注意点とよくある誤解
- denyはモデルではなくClaude Codeが強制。プロンプトやCLAUDE.mdで「読まないで」と書いても、ルールがなければ防げない。
- Read/Editのdenyは“間接アクセス”を防げない。組み込みファイルツールや
cat/head/sedには効くが、PythonやNodeスクリプトがファイルを開く処理には効かない。OSレベルで止めるならサンドボックスを併用。 - 環境ランナーに注意。
devbox run *やnpx、docker execは引数をコマンドとして実行するため、Bash(devbox run *)はdevbox run rm -rf .まで許してしまう。内側のコマンドまで含めて書く。 - フックは上書きしない。PreToolUseフックはルールを“拡張”できるが、deny/askはフックの結果に関わらず評価される(deny優先は不変)。
※仕様はClaude Code公式ドキュメント(Configure permissions/Settings)に基づく(2026年6月時点)。挙動は更新されることがあるため最新は公式を確認のこと。
まとめ
Claude Codeの権限ルールを3点に整理する。
- 正体:
settings.jsonの allow/ask/deny で、ツール・コマンド・ファイル・ドメイン単位に許可/確認/禁止を指定。モードが大枠、ルールが個別。 - 優先順位:deny → ask → allow(最初の一致が勝つ・具体性は無関係)。どの階層のdenyも必ず勝つ。階層は managed>CLI>local>project>user。
- 書き方:
Tool(指定子)。Bashはワイルドカード(空白+*は単語境界)、Read/Editはgitignore形式パス、WebFetchはdomain:。複合コマンドは各サブコマンドが一致要。
「危険だけ確実に止め、安全な定型は自動化」——これがルール設計の勘所だ。権限モード・hooks・工数とあわせて、Claude Codeを安全かつ快適に運用しよう。
FAQ
Q. 権限ルールとモードは何が違う?
A. モードは確認頻度の大枠(default/acceptEdits/auto等)、ルールは個別ツール・コマンド単位の指定です。両方が重なって働き、ルールはモードを上書きできます(例:autoモードでもask/denyルールは効く)。
Q. allowしたのに確認が出るのはなぜ?
A. 評価順が deny→ask→allow だからです。同じ呼び出しに一致するask(やdeny)が別にあると、より具体的なallowがあってもそちらが優先されます。具体性は順序を変えません。
Q. settings.json はどこに置く?
A. チーム共有は .claude/settings.json(コミット)、個人用は .claude/settings.local.json(gitignore)、全プロジェクト共通は ~/.claude/settings.json。組織で固定したい場合は管理設定(上書き不可)を使います。
Q. .env を絶対に読ませない方法は?
A. deny: ["Read(.env)", "Read(**/secrets/**)"] を設定します。ただしこれは組み込みファイルツールやcat等に効くもので、スクリプト経由の間接読み取りは防げません。OSレベルで止めるならサンドボックスを併用してください。
Q. Bashの引数でURLやファイルを制限できる?
A. 脆いため非推奨です。curl http://github.com/ * はオプションや変数展開で簡単にすり抜けます。URL制限は curl/wget をdenyして WebFetch(domain:...) を使うか、PreToolUseフックで検証するのが堅実です。