Claude Codeの権限ルール(permission rules)は、settings.jsonallow / ask / deny を書いて、「どのツール・コマンド・ファイル・ドメインを、確認なしで許す/毎回聞く/禁止する」を細かく指定するしくみだ。チームで共有でき、危険な操作だけ確実にブロックしつつ、安全な定型作業はノンストップで回せる。

本記事では、権限ルールとは何か(権限モードとの違い)・allow/ask/denyの優先順位・ルールの書き方・settings.jsonの階層・実用レシピまでを、公式仕様に基づいて整理する。

CLAUDE CODE · 権限ルール(PERMISSION RULES)

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があっても、askが一致すれば確認が出る。

DENY

禁止(最優先)

使わせない。どのallowより強く、どの階層のdenyも必ず勝つ。

評価順は deny → ask → allow。最初に一致したルールで結果が決まり、ルールの細かさ(具体性)は順序を変えない。たとえば広い Bash(aws *) のdenyは、より具体的な Bash(aws s3 ls) のallowより優先してブロックする。denyは例外(許可リスト)を持てないのが要点だ。

⚠️ denyの2形は挙動が違う:ツール名だけの Bash はツールごと文脈から消す(Claudeが存在を認識しない)。Bash(rm *) のように範囲指定すると、ツールは使えるが一致した呼び出しだけブロックする。

3. ルールの書き方(Tool(指定子))

形式は Tool(全体)か Tool(指定子)(個別)。ツール別に指定子の書き方が違う。

ツール意味
BashBash(npm run *)npm run で始まるコマンド(末尾 *は単語境界)
Read / EditRead(./.env)カレントの.env読み取り(gitignore形式パス)
WebFetchWebFetch(domain:example.com)example.comへのfetch
MCPmcp__github__get_*githubサーバーのget_系ツール
AgentAgent(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 *npxdocker 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フックで検証するのが堅実です。