Claude Code

Claude Code の権限: allow・ask・deny ルール、ルール構文、許可ツール

Claude Code の権限はどう動作し、特定のツールを許可またはブロックするにはどうすればよいですか?

Claude Code はすべてのツール呼び出しを settings ファイル内の権限ルールと照合します。ルールは permissions.allow、permissions.ask、permissions.deny に記述し、Tool または Tool(specifier) の形式を使います。評価順は deny、ask、allow の順です。/permissions を使うと、すべてのルールとその定義元ファイルを確認できます。1 セッションだけなら --allowedTools と --disallowedTools を渡します。

このページは英語版ガイドの翻訳です。コマンド、設定キー、コードは原文のままです。内容に差異がある場合は英語版が優先されます。 英語版を読む → · 他の言語: 简体中文 · 한국어 · Español · Português (Brasil)

設定の変更をいち早くチェック

これらのツールの設定、フラグ、権限ルールが変わったときに、週 1 回メール(英語)でお知らせします。内容は公式ドキュメントで確認済みです。

allow、ask、deny

  • allow ルールに一致するツールは、確認なしで Claude Code が使用できます。
  • ask ルールに一致するツールは、使用のたびに確認を求めます。
  • deny ルールに一致するツールはブロックされます。
  • 評価順は deny、ask、allow です。最初に一致したものが優先され、具体性で順序は変わりません。そのため Bash(aws *) のような広い deny は、Bash(aws s3 ls) のような狭い allow より優先されます。
  • Bash のようにツール名だけの deny ルールは、そのツールを Claude のコンテキストから削除します。Bash(rm *) のようにスコープを絞った deny はツールを残し、一致する呼び出しだけをブロックします。

ルールを強制するのはモデルではなく Claude Code です。CLAUDE.md の指示は Claude が何をしようとするかに影響しますが、何が許可されるかは変わりません。

ツール別のルール構文

  • ツール全体: 括弧なしの Bash、Read、WebFetch。Bash(*) は Bash と同じです。
  • Bash: Bash(npm run build) はそのコマンドに完全一致します。Bash(npm run *) はすべての npm スクリプトに一致します。* はサブコマンドの後に置きます。Bash(git log *) は git log だけを許可し、Bash(git *) はすべての git コマンドを許可します。
  • Bash(ls *) は ls の後にスペースが必要なので、lsof には一致しません。Bash(ls:*) は末尾ワイルドカードの同等の書き方です。
  • Read と Edit は gitignore パターンを使います。Read(./.env) はカレントディレクトリの .env ファイルを、Read(./secrets/**) はフォルダをブロックします。どのツールにも変更させたくないパスには、Write ルールではなく Edit ルールを使います。
  • パス: //path はファイルシステムのルートからの絶対パス、~/path はホームフォルダから、/path は settings ファイルのプロジェクトからの相対パス、path または ./path はカレントディレクトリからの相対パスです。
  • WebFetch: WebFetch(domain:example.com) は example.com だけに一致します。サブドメインには WebFetch(domain:*.example.com) を追加します。
  • MCP: mcp__github は github サーバーのすべてのツールに、mcp__github__get_* はその get_ ツールに、mcp__github__create_issue は 1 つのツールに一致します。
  • サブエージェント: Agent(Explore) または Agent(my-custom-agent)。deny に入れると、Claude はそのサブエージェントを使えなくなります。

設定例

.claude/settings.json

{
  "permissions": {
    "allow": [
      "Bash(npm run *)",
      "Bash(git commit *)",
      "WebFetch(domain:docs.example.com)",
      "mcp__github__get_*"
    ],
    "ask": ["Bash(git push *)"],
    "deny": [
      "Read(./.env)",
      "Read(./secrets/**)",
      "Bash(rm *)"
    ]
  }
}

プロジェクトの .claude/settings.json にある allow ルールと additionalDirectories は、そのフォルダのワークスペース信頼ダイアログを承認した後にのみ有効になります。deny と ask ルールはすぐに適用されます。

コマンドラインでの許可ツール

  • --allowedTools(または --allowed-tools): 確認なしで実行するツール。同じルール構文を使います。
  • --disallowedTools(または --disallowed-tools): このセッションの deny ルール。"mcp__*" はすべての MCP ツールを削除します。
  • --tools: 存在する組み込みツール自体を制限します。例: "Bash,Edit,Read"。
  • --add-dir: Claude が読み取り・編集できる作業ディレクトリを追加します。永続化するには permissions.additionalDirectories に保存します。

ターミナル

claude -p "summarize recent changes" \
  --allowedTools "Bash(git log *)" "Bash(git diff *)" "Read" \
  --disallowedTools "Edit"

デフォルトで確認されるもの、"don't ask again" で保存されるもの

  • ファイル読み取りや Grep などの読み取り専用ツール: 作業ディレクトリと追加ディレクトリ内では確認なし。
  • Bash コマンド: 組み込みの読み取り専用コマンドを除き確認あり。"Yes, and don't ask again" はそのリポジトリとコマンドについて永続的に保存されます。
  • ファイルの編集と書き込み: 確認あり。"Don't ask again" はセッション終了までのみ有効で、ファイルには保存されません。
  • WebFetch: 組み込みの事前承認済みドキュメントドメインを除き確認あり。承認はリポジトリとドメインごとに保存されます。
  • WebSearch: 確認あり。承認はリポジトリごとに保存されます。

保存された承認は、git リポジトリのルート(worktree の場合はメインのチェックアウトに解決)にある .claude/settings.local.json にルールとして書き込まれるため、サブディレクトリや worktree でも適用されます。git status && npm test のような複合コマンドを承認すると、承認が必要だった各サブコマンドごとに別々のルールが保存されます(最大 5 ルール)。/permissions は Claude の作業中にも開けます。追加・削除したルールは Claude の次のツール呼び出しから適用されます。

確認されない Bash コマンドと、Claude Code が透過するラッパー

  • 読み取り専用コマンドはどのモードでも確認なしで実行されます。組み込みセットには ls、cat、echo、pwd、head、tail、grep、find、wc、which、diff、stat、du、cd、および git の読み取り専用形式が含まれます。このセットは設定できません。確認させたい場合は ask または deny ルールを追加します。
  • 一部の読み取り専用コマンドは Manual モードでは確認されます。例: クォートされていない glob を伴う find、sort、sed、git や、別ディレクトリへの cd と git の組み合わせ。
  • 照合の前に、Claude Code は timeout、time、nice、nohup、stdbuf、command、builtin、zsh の noglob を取り除きます。そのため Bash(npm test *) は timeout 30 npm test にも一致します。フラグなしの xargs と、安全と分かっている環境変数の先頭代入も取り除きます。
  • npx、docker exec、direnv exec、devbox run、mise exec などのランナーは取り除かれません。Bash(devbox run *) は run 以降の何にでも一致するため、Bash(devbox run npm test) のように内側のコマンドごとに完全一致ルールを書きます。
  • プレフィックスルールでは、watch、setsid、ionice、flock などの exec ラッパーや、-exec、-delete、-fprint 付きの find を自動承認できません。コマンド全体の完全一致ルールか、PreToolUse hook を使います。

Bash の deny ルールで防げないもの

Bash ルールは Claude が書いたコマンドテキストと照合します。deny と ask ルールは、サブシェル、コマンド置換、for ループ内を含め、いずれかのサブコマンドが一致すれば適用されます。同じプログラムを別の方法で呼び出した場合は捕捉しません。

  • Bash(curl *) は curl https://example.com を止めますが、/usr/bin/curl https://example.com や sh -c 'curl https://example.com' は止めません。
  • Bash(rm *) は rm -rf build/ を止めますが、/bin/rm -rf build/ や bash -c 'rm -rf build/' は止めません。
  • Bash(git push *) は git push origin main を止めますが、git -C . push origin main は止めません。
  • Bash(curl http://github.com/ *) のように引数を制限しようとするパターンは、URL の前のフラグ、https、リダイレクト、変数を見逃します。
  • 出力リダイレクト(>、>>、2>)と tee の出力先は Edit ルールと作業ディレクトリに照らしてチェックされます。そのため Bash(git commit *) はコマンドを許可しますが、出力の書き込み先までは許可しません。

コマンドテキストに関係なく有効な制限には、sandbox のネットワーク・ファイルシステムルールか、コマンド全体を検査する PreToolUse hook を使います。Web アクセスを制限するには、curl と wget を deny し、信頼するサイトに WebFetch(domain:...) を allow します。Bash が許可されている間は、WebFetch ルールだけではネットワークアクセスをブロックできません。

どの設定が優先されるか

  • どのレベルの deny も、別のレベルで allow することはできません。ユーザー設定で許可しプロジェクト設定で拒否した場合は拒否され、逆も同様です。
  • managed settings が最優先です。--allowedTools でも managed の deny は上書きできませんが、--disallowedTools で制限を追加することはできます。
  • allowManagedPermissionRulesOnly を使うと、managed settings が権限ルールの唯一の定義元になります。
  • permissions.disableBypassPermissionsMode または permissions.disableAutoMode を "disable" に設定すると、それらのモードをブロックできます。managed settings で使うと特に便利です。

権限モード

ルールはセッションの権限モードの上に適用されます: default(Manual)、acceptEdits、plan、auto、dontAsk、bypassPermissions。claude --permission-mode <mode> か、settings の permissions.defaultMode で設定します。dontAsk は、allow ルールで承認済みのツール以外で確認が必要なものをすべて拒否します。確認なしで実行するには、Claude Code ですべてのコマンドを許可するガイドを参照してください。

出典

このガイドで確認した公式ドキュメント(英語)です。 英語版の確認日: 2026-10-18

その他の日本語ガイド