Claude Codeはデフォルト状態でも非常に強力ですが、チーム開発や本番環境では「どのツールを使っていいか」を明示的にコントロールする必要があります。誤ってrm -rfを実行されたり、本番の設定ファイルを書き換えられたりするリスクを防ぐためです。
Claude Codeの権限管理はsettings.jsonファイルで行います。allowedTools・ask・denyの3つのキーを使って、どのコマンドを自動で許可し、どれを確認させ、どれを禁止するかを細かく設定できます。
この記事では、権限評価の仕組みから実践的な設定例まで、チームで安心してClaude Codeを使うための権限設計を解説します。Claude Code全般の使い方はClaude Code完全ガイドを、CLAUDE.mdによるルール設定はCLAUDE.md完全設計ガイドを参照してください。
なぜ権限管理が必要なのか
Claude Codeは高い自律性を持っています。ファイルの読み書き・シェルコマンドの実行・外部APIの呼び出しまで、幅広いツールを使ってタスクを完遂しようとします。これは便利な反面、意図しない操作が起きるリスクも内包しています。
| シナリオ | リスク | 権限設定での対策 |
|---|---|---|
| CI/CDパイプラインで使う | 承認なしに本番ブランチへpushされる | Bash(git push *)をask(確認必須)に設定 |
| 複数人チームで共有 | 環境変数ファイルを読まれる・書き換えられる | Read(.env*)をdeny(禁止)に設定 |
| インターン・外部委託が使う | 不要なパッケージを勝手にinstallされる | Bash(npm install *)をask(確認必須)に設定 |
| 本番サーバーでheadlessで使う | 危険なシステムコマンドが実行される | 最小限のallowedToolsのみを明示してそれ以外を自動deny |
権限を何も設定していない場合、Claude Codeはセッションごとにユーザーへの確認ダイアログを出します。一度「常に許可」を選択したツールはセッション中は再確認されませんが、次のセッションではリセットされます。settings.jsonを使うと、この許可設定を永続化・共有できます。
設定ファイルの場所と優先順位
Claude Codeの権限設定は5段階の優先順位で評価されます。上位の設定が下位を上書きするため、企業・チーム・個人で役割を分担できます。
| 優先度 | ファイル・方法 | 用途 | 変更権限 |
|---|---|---|---|
| 1(最高) | Managed Settings(管理者設定) | 組織全体のポリシー強制 | 管理者のみ |
| 2 | CLIフラグ--allowedTools / --disallowedTools |
実行時の一時的な権限指定 | 実行者 |
| 3 | .claude/settings.local.json(プロジェクト内) |
個人のローカル設定(git管理外推奨) | 個人 |
| 4 | .claude/settings.json(プロジェクト内) |
チーム共有のプロジェクト設定(gitで共有) | チーム合意で変更 |
| 5(最低) | ~/.claude/settings.json(ホームディレクトリ) |
個人の全プロジェクト共通設定 | 個人 |
.claude/settings.jsonにチーム共通の権限設定を書いてgitで共有する.claude/settings.local.jsonは.gitignoreに追加して個人設定に使う- 本番環境では
--allowedToolsフラグで使用可能なツールを最小限に絞る
settings.jsonの基本構造
settings.jsonにはpermissionsオブジェクトの中にallowedTools・ask・denyの3つのキーを書きます。それぞれ文字列の配列で、ツール名またはパターンを指定します。
{
"permissions": {
"allowedTools": [
"Read",
"Write",
"Bash(git *)",
"Bash(npm run *)"
],
"ask": [
"Bash(rm *)",
"Bash(git push *)"
],
"deny": [
"Read(.env*)",
"Write(production.*)"
]
}
}
それぞれのキーの意味は以下のとおりです。
| キー | 動作 | 使いどころ |
|---|---|---|
allowedTools |
ユーザーへの確認なしに自動で実行を許可 | 安全で頻繁に使うツール(ファイル読み込み、テスト実行等) |
ask |
実行前に確認ダイアログを表示する | 重要だが危険でもある操作(push、rm等) |
deny |
実行を完全に禁止する(エラーで拒否) | 絶対に触ってほしくない対象(.envファイル、本番設定等) |
権限の評価順序:deny → ask → allow
Claude Codeがツールを実行しようとするとき、deny → ask → allowedTools の順に評価されます。最初にマッチしたルールが適用され、それ以降は評価されません。
# ツール実行リクエストが発生したとき: # 1. denyリストに一致するか? → YES: 即座に拒否(エラー) # 2. askリストに一致するか? → YES: 確認ダイアログを表示 # 3. allowedToolsに一致するか? → YES: 自動で許可 # 4. どれにも一致しない場合 → 確認ダイアログを表示(ask相当)
allowedToolsに書いていないツールは自動で拒否されるわけではありません。どのリストにも一致しない場合は確認ダイアログが表示されます(askと同じ動作)。特定のツールを完全に禁止したい場合は必ずdenyに書いてください。設定例:なぜこの順序が重要か
{
"permissions": {
"allowedTools": ["Bash(git *)"],
"ask": [],
"deny": ["Bash(git push --force *)"]
}
}
この設定では、git push --forceはBash(git *)にもBash(git push --force *)にも一致します。しかしdenyが先に評価されるため、force pushは禁止されます。一方、git statusやgit logはdenyにもaskにも一致しないため、allowedToolsのBash(git *)にマッチして自動許可されます。
ツールパターンの書き方
権限設定で使えるツールは大きく4種類あります。それぞれにパターン指定の書き方があります。
① Bash(シェルコマンド)
Bash(パターン)の形式で、実行するコマンドをグロブパターンで指定します。*は任意の文字列にマッチします。
{
"permissions": {
"allowedTools": [
"Bash(git status)",
"Bash(git log *)",
"Bash(git diff *)",
"Bash(git add *)",
"Bash(git commit *)",
"Bash(npm run *)",
"Bash(npx *)",
"Bash(python -m pytest *)",
"Bash(cat *)",
"Bash(ls *)"
],
"ask": [
"Bash(git push *)",
"Bash(npm install *)",
"Bash(rm *)",
"Bash(mv *)"
],
"deny": [
"Bash(git push --force *)",
"Bash(git reset --hard *)",
"Bash(rm -rf *)",
"Bash(sudo *)",
"Bash(chmod 777 *)"
]
}
}
② Read / Write(ファイル操作)
Read・Writeだけで記述するとすべてのファイルに適用されます。Read(パス)のようにパスパターンを付けると対象を絞れます。
{
"permissions": {
"allowedTools": [
"Read",
"Write(src/**)",
"Write(tests/**)"
],
"deny": [
"Read(.env)",
"Read(.env.*)",
"Read(**/.env)",
"Write(*.production.*)",
"Write(config/production.*)",
"Write(package-lock.json)"
]
}
}
③ WebFetch(外部URL取得)
WebFetchまたはWebFetch(ドメイン)の形式で、Claudeが外部URLにアクセスする権限を制御します。
{
"permissions": {
"allowedTools": [
"WebFetch(docs.anthropic.com)",
"WebFetch(developer.mozilla.org)",
"WebFetch(npmjs.com)"
],
"deny": [
"WebFetch(internal.company.com)"
]
}
}
④ MCPツール(MCP連携)
MCPサーバー経由のツールはmcp__サーバー名__ツール名の形式で指定します。MCPの詳細はClaude Code MCP完全ガイドを参照してください。
{
"permissions": {
"allowedTools": [
"mcp__github__get_issue",
"mcp__github__list_pull_requests",
"mcp__github__create_pull_request"
],
"deny": [
"mcp__github__delete_repository",
"mcp__filesystem__delete_file"
]
}
}
実践的な設定例
フロントエンド開発チーム向け設定
{
"permissions": {
"allowedTools": [
"Read",
"Write(src/**)",
"Write(public/**)",
"Write(tests/**)",
"Write(*.md)",
"Bash(git status)",
"Bash(git log *)",
"Bash(git diff *)",
"Bash(git add *)",
"Bash(git commit *)",
"Bash(git checkout *)",
"Bash(git branch *)",
"Bash(npm run *)",
"Bash(npx *)",
"Bash(node *)",
"Bash(cat *)",
"Bash(ls *)",
"Bash(echo *)"
],
"ask": [
"Bash(git push *)",
"Bash(git merge *)",
"Bash(git rebase *)",
"Bash(npm install *)",
"Bash(rm *)"
],
"deny": [
"Read(.env)",
"Read(.env.*)",
"Write(.env*)",
"Write(package-lock.json)",
"Bash(git push --force *)",
"Bash(git reset --hard *)",
"Bash(rm -rf *)",
"Bash(sudo *)"
]
}
}
バックエンドAPI開発向け設定
{
"permissions": {
"allowedTools": [
"Read",
"Write(src/**)",
"Write(tests/**)",
"Write(migrations/**)",
"Write(*.md)",
"Bash(git status)",
"Bash(git log *)",
"Bash(git diff *)",
"Bash(git add *)",
"Bash(git commit *)",
"Bash(git checkout *)",
"Bash(npm run *)",
"Bash(npx prisma *)",
"Bash(python -m pytest *)",
"Bash(cat *)",
"Bash(ls *)"
],
"ask": [
"Bash(git push *)",
"Bash(npm install *)",
"Bash(npx prisma migrate deploy)",
"Bash(rm *)"
],
"deny": [
"Read(.env)",
"Read(.env.*)",
"Read(*secrets*)",
"Write(.env*)",
"Write(*credentials*)",
"Bash(git push --force *)",
"Bash(git reset --hard *)",
"Bash(rm -rf *)",
"Bash(sudo *)",
"Bash(curl * | bash *)",
"Bash(wget * | sh *)"
]
}
}
CI/CD・headless実行向け設定
GitHub ActionsなどのCI環境でClaude Codeをheadlessで動かす場合は、allowedToolsを最小限に絞って明示的に許可するのが安全です。CLIフラグで直接指定する方法と、settings.jsonで設定する方法があります。
# --allowedToolsで許可するツールを列挙 # --disallowedToolsで禁止するツールを追加指定 claude --allowedTools "Read,Write(src/**),Bash(npm run *)" --disallowedTools "Bash(git push *)" -p "このPRの変更点をレビューしてください" # GitHub Actionsでの使用例 claude --headless --allowedTools "Read,Bash(git *),Bash(npm run test),Bash(npm run lint)" -p "テストが失敗している箇所を特定して修正してください"
{
"permissions": {
"allowedTools": [
"Read",
"Write(src/**)",
"Write(tests/**)",
"Bash(git status)",
"Bash(git diff *)",
"Bash(git add *)",
"Bash(git commit *)",
"Bash(npm run lint)",
"Bash(npm run test)",
"Bash(npm run build)"
],
"deny": [
"Read(.env*)",
"Write(.env*)",
"Bash(git push *)",
"Bash(rm *)",
"Bash(sudo *)",
"WebFetch(*)"
]
}
}
チーム共有の設定とgit管理
settings.jsonはgitで共有することで、チーム全員に同じ権限設定を適用できます。一方、個人の設定はsettings.local.jsonに書いてgitignoreすることで、チームポリシーと個人の自由を両立できます。
# 個人の権限設定(チームと異なる設定を個人で持つ場合) .claude/settings.local.json # Auto Memoryと個人メモリ(メンバー間で内容が異なる) .claude/MEMORY.md .claude/memory/ # ただしチーム共有ルールフォルダは除外 !.claude/rules/ !.claude/commands/
| ファイル | gitで共有 | 用途 |
|---|---|---|
.claude/settings.json |
共有する | チーム全員に適用したいデフォルト権限 |
.claude/settings.local.json |
共有しない | 個人が一時的に権限を追加・変更する場合 |
~/.claude/settings.json |
共有しない(ホームDir) | 全プロジェクト共通の個人設定 |
設定の上書きルール(実例)
チームのsettings.jsonでdenyに設定されたツールを、個人のsettings.local.jsonで上書きすることはできません。ローカル設定はチーム設定より優先されますが、denyは上書きできないのがポイントです。
{
"permissions": {
"allowedTools": ["Read", "Write(src/**)"],
"deny": ["Bash(sudo *)", "Read(.env*)"]
}
}
{
"permissions": {
"allowedTools": [
"Bash(npm run *)",
"Bash(git *)"
]
}
}
この場合、個人のlocal設定でBash(npm run *)とBash(git *)が追加されます。チーム設定のdenyにあるBash(sudo *)とRead(.env*)はチームが決めた安全ポリシーとして維持されます。個人のlocal設定でチームのdenyを無効化することはセキュリティポリシーの観点から避けてください。
/permissionsコマンドで権限の状態を確認する
セッション中にどの権限が有効になっているか確認したいときは、/permissionsコマンドを使います。現在のallowedTools・ask・denyの一覧が表示されます。
# 現在の権限設定を確認 /permissions # セッション中に一時的にツールを許可する(settings.jsonは変更されない) /permissions allow Bash(npm install *) # セッション中に一時的にツールを禁止する /permissions deny Bash(git push *) # 設定ファイルの場所を確認 /doctor
セッション中に
/permissions allowで追加した権限は、そのセッションが終了すると消えます。settings.jsonを変更しない限り次のセッションでは元に戻ります。恒久的な変更が必要な場合はsettings.jsonを編集してください。よくある問題と対処法
| 症状 | 原因 | 対処法 |
|---|---|---|
| Claudeが特定コマンドを実行しようとしても「Permission denied」になる | denyルールにマッチしている | /permissionsで現在のdenyリストを確認。settings.jsonのdenyを修正するか、settings.local.jsonでaskに変更 |
| settings.jsonに書いたのにallowedToolsが反映されない | 上位の設定(CLI引数や管理者設定)が上書きしている | /doctorで読み込まれている設定ファイルのパスを確認 |
| チームのsettings.jsonをgitに追加したのに他メンバーに反映されない | settings.local.jsonが優先されている、またはsettings.jsonのパスが間違っている | 設定ファイルはプロジェクトルートの.claude/settings.jsonに置く |
| 「Bash(git *)」を許可したのに特定のgitコマンドが確認される | *はスペースを含む文字列にマッチしない場合がある |
より具体的なパターン(例: Bash(git commit -m *))で追加登録する |
まとめ
Claude Codeの権限管理はsettings.jsonのallowedTools・ask・denyの3つで完結します。評価順序はdeny → ask → allowedToolsで、denyが最優先されます。
設定ファイルは5段階の優先度があり、チームで共有する設定は.claude/settings.jsonをgitに追加し、個人の一時的な上書きはsettings.local.jsonを使います。CI/CD環境ではCLIの--allowedToolsフラグで実行時に最小限の権限を指定するのが安全です。
権限設定と組み合わせてClaude Code Hooksを使うと、特定のコマンドが実行される前後に自動でチェックを走らせるなど、さらに細かい制御が可能になります。
よくある質問
QallowedToolsに書いていないツールは自動で拒否されますか?
Aいいえ。allowedToolsに書いていないツールは確認ダイアログが表示される(ask相当)だけで、拒否はされません。完全に使わせたくないツールはdenyに明示的に書く必要があります。allowedTools・ask・denyのどれにも書かない場合はaskと同じ動作(毎回確認)になります。
Qチームのsettings.jsonでdenyにしたツールを、個人のsettings.local.jsonで許可できますか?
A推奨しません。settings.local.json(優先度3)はsettings.json(優先度4)より高優先度ですが、チームのdenyルールを個人設定で無効化するのはセキュリティポリシーの崩壊につながります。どうしても個人だけ許可が必要な場合は、チームで合意のうえsettings.jsonのdenyから外す設計にしてください。denyはチーム全体の安全策として機能させることを想定した機能です。
QBash(git *)と書いたとき、git commitやgit pushは全部許可されますか?
ABash(git *)はgitで始まるコマンドすべてにマッチします。ただし評価はdeny→ask→allowの順なので、denyにBash(git push --force *)を書いておけばforce pushだけを禁止することができます。安全なコマンドは一括許可し、危険なものだけdenyする設計が実用的です。
Qheadlessモードで実行するとき確認ダイアログはどうなりますか?
Aheadlessモード(-pフラグ使用時)では確認ダイアログが表示されません。askに設定されたツールのリクエストがあった場合、自動的に拒否されます。そのためheadless実行では、使う予定のツールをすべてallowedToolsに明示するか、--allowedToolsフラグで指定する必要があります。
QMCPサーバーのツールにも権限設定は効きますか?
Aはい。mcp__サーバー名__ツール名の形式でallowedTools・ask・denyに書けます。例えばmcp__github__delete_repositoryをdenyに設定すると、GitHub MCPサーバー経由のリポジトリ削除をClaude Codeから実行できなくなります。MCPツールの命名規則はMCPサーバーの実装によります。
Q権限エラーが発生したとき、どのルールにマッチしたか確認できますか?
A/permissionsコマンドで現在有効な権限リストを確認できます。また/doctorコマンドでどのsettings.jsonファイルが読み込まれているか確認できます。権限エラーのメッセージにはどのツールがブロックされたか表示されるため、そのツール名をキーにdenyリストと照合することで原因を特定できます。

