Claude Code の settings.json で permissions を設計する(allow / deny / ask の実例)
Claude Code の権限設定を settings.json で管理する方法を解説します。allow・deny・ask の書き方、パターンの記法、ユーザー・プロジェクト・ローカルの優先順位、実務向けの推奨設定を紹介します。
Claude Code は既定では、ファイルの編集やコマンドの実行のたびに確認を求めます。安全ではありますが、そのままでは作業のテンポが上がりません。かといって全許可にすると、rm -rf や git push --force のような取り返しのつかない操作まで自動で通ってしまいます。
この記事では、settings.json の permissions を使って「安全な操作は自動、危険な操作は確認か禁止」という線引きを作る方法を解説します。
KEY POINT
この記事で分かること
- settings.json の置き場所と優先順位
- allow / deny / ask の書き方とパターン記法
- 個人開発・チーム開発それぞれの推奨設定
settings.json の置き場所と優先順位
| スコープ | パス | 用途 | Git 管理 |
|---|---|---|---|
| ユーザー | ~/.claude/settings.json | 全プロジェクト共通の既定 | しない |
| プロジェクト | .claude/settings.json | チームで共有するルール | する |
| ローカル | .claude/settings.local.json | 個人の追加許可。対話中の「今後も許可」の保存先 | しない |
| 管理者 | OS ごとの管理ポリシー配置先 | 組織が強制する設定(Enterprise 向け) | - |
複数のファイルに同じキーがある場合、管理者設定が最優先で、次にローカル、プロジェクト、ユーザーの順に適用されます。deny は allow より常に強いため、組織やチームで禁止したい操作はプロジェクトの deny に書いておけば、個人の allow で上書きされることはありません。
permissions の基本構造
{
"permissions": {
"allow": [
"Read",
"Edit",
"Bash(npm run lint)",
"Bash(npm run test:*)",
"Bash(git diff:*)",
"Bash(git log:*)"
],
"ask": [
"Bash(git push:*)",
"Bash(npm install:*)"
],
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Read(./secrets/**)",
"Bash(rm -rf:*)",
"Bash(git push --force:*)"
],
"defaultMode": "acceptEdits"
}
}
| キー | 意味 |
|---|---|
allow | 確認なしで実行を許可するルール |
ask | 必ず確認を求めるルール(allow に一致しても確認する) |
deny | 実行を禁止するルール。最優先 |
defaultMode | ルールに一致しなかった操作の扱い。default(都度確認)、acceptEdits(ファイル編集は自動許可)、plan(読み取りのみ)、bypassPermissions(すべて許可。隔離環境専用) |
ルールの書き方
ルールは ツール名(パターン) の形で書きます。パターンを省略するとそのツール全体が対象です。
| 書き方 | 意味 |
|---|---|
Bash(npm run test:*) | npm run test で始まるコマンドすべて(:* が前方一致) |
Bash(git commit *) | スペース区切りの引数を含む git commit |
Read(./.env) | プロジェクト直下の .env の読み取り |
Edit(src/**) | src 配下のファイル編集 |
WebFetch(domain:docs.example.com) | 指定ドメインへの取得 |
mcp__github__create_issue | MCP サーバー github の create_issue ツール |
mcp__github | MCP サーバー github の全ツール |
Bash のパターンは「コマンド文字列」に対する一致
Bash(rm -rf:*) は rm -rf で始まるコマンドを対象にしますが、sudo rm -rf や cd /tmp && rm -rf のように先頭が変わると一致しません。deny は「保険」として置き、本当に守りたいファイルはファイルシステムの権限やコンテナ側でも保護してください。
推奨設定:個人開発
編集は自動許可し、外部に影響する操作だけ確認する構成です。
{
"permissions": {
"defaultMode": "acceptEdits",
"allow": [
"Bash(npm run *)",
"Bash(npx tsc *)",
"Bash(git status)",
"Bash(git diff:*)",
"Bash(git log:*)",
"Bash(git add:*)",
"Bash(git commit:*)"
],
"ask": [
"Bash(git push:*)",
"Bash(npm install:*)",
"Bash(npm uninstall:*)"
],
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Bash(rm -rf:*)",
"Bash(git push --force:*)",
"Bash(git reset --hard:*)"
]
}
}
推奨設定:チーム開発
.claude/settings.json には全員に適用したい deny と、誰が実行しても安全な allow だけを入れます。個人の好みは settings.local.json に任せます。
{
"permissions": {
"allow": [
"Bash(pnpm lint)",
"Bash(pnpm test:*)",
"Bash(pnpm typecheck)"
],
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Read(./infra/secrets/**)",
"Edit(./.github/workflows/**)",
"Bash(git push --force:*)",
"Bash(git push -f:*)",
"Bash(rm -rf:*)",
"Bash(curl:*)",
"Bash(wget:*)"
]
}
}
curl や wget を deny に入れているのは、任意の URL からのダウンロードや外部へのデータ送信を防ぐためです。必要なら ask に移してください。
対話中の許可と /permissions
作業中に確認ダイアログで「今後も許可する」を選ぶと、そのルールが settings.local.json の allow に追記されます。気付かないうちに許可が増えていくため、定期的に /permissions コマンドで一覧を確認し、不要なものを削除してください。
設定の効き方が分からないときは、claude config list や /status で現在の設定の読み込み元を確認できます。
関連する設定
権限だけでなく、hooks で「編集後に自動で lint を走らせる」といった仕組みを組み合わせると、自動許可の範囲を広げても品質を保ちやすくなります。hooks で lint と format を自動実行する を参照してください。秘密情報の保護は AI コーディングツールに秘密情報を読ませないための設定 で扱っています。
まとめ
- 設定はユーザー → プロジェクト → ローカルの順に上書きされ、deny は常に最優先
Bash(npm run test:*)のように「ツール名(パターン)」で書くdefaultMode: "acceptEdits"と少数の allow から始め、危険な操作は deny に入れる- 対話中に増えた許可は
/permissionsで定期的に見直す
よくある質問
- settings.json と settings.local.json の違いは何ですか?
- settings.json はチームで共有する設定(Git 管理)、settings.local.json は個人用の設定(Git 管理外)です。同じキーがある場合はより限定的なスコープが優先されます。
- deny と allow の両方に一致した場合はどうなりますか?
- deny が優先されます。危険な操作は deny に書いておけば、allow の書き方を誤っても実行されません。
- 対話中に許可した内容はどこに保存されますか?
- 「今後も許可」を選ぶと .claude/settings.local.json の allow に追記されます。/permissions コマンドで一覧と編集ができます。
参考にした一次情報
この記事は公式ドキュメントを基に AI が下書きを作成し、運営者が内容を確認して公開しています。誤りを見つけた場合はお問い合わせからお知らせください。