KanaLab

Claude Code

Claude Code の settings.json で権限管理してみてわかったこと【2026年実体験】

Claude Code の settings.json で権限管理してみてわかったこと【2026年実体験】

Claude Code を使っていて、「このコマンドを実行していいですか?」によくわからず Yes 連打してる方、今すぐ Claude にこう聞いてみてください。

私の .claude/settings.json を見直して

自分もそうやってたら、気づいたら MySQL の DB パスワードが平文で入っていた。Cドライブ全体が読み取り対象になっていたりもした。

Claude による settings.json の問題指摘

settings.json は「触らなくていいファイル」じゃなくて、ちゃんと設計が必要だと気づいた。この記事では、どこに何を書けばいいか、allow と deny をどう使い分けるか、整理してわかったことをまとめます。


Kana
Kana

パスワードそのまま入ってたの…


settings.json って何をするファイル?

Claude Code の動作と権限を設定するファイルです。

「このコマンドは毎回確認しなくていい」「このファイルは絶対読ませない」といった設定を書いておくと、作業中の確認プロンプトが減って快適になります。

主に設定できるのはこのあたりです。

設定項目内容
permissions.allow確認なしで実行を許可
permissions.ask毎回確認する
permissions.deny絶対に実行させない
defaultMode基本の動作モード
language応答言語("japanese" で日本語化)
effortLevel思考の深さ("high" 推奨)

ファイルの場所と優先順位

設定ファイルの優先順位

設定ファイルは3か所に置けます。

優先度(高い順)
1. .claude/settings.local.json    プロジェクト内・自分専用(自動 gitignore)
2. .claude/settings.json          プロジェクト内・チーム共有(Git 管理対象)
3. ~/.claude/settings.json        全プロジェクト共通・ユーザー設定

settings.local.json の落とし穴

直感に反しますが、settings.local.jsonsettings.json より優先度が高いです。

チームで .claude/settings.json を共有していても、個人の settings.local.json が上書きします。「設定が効いていない」と思ったら、ローカルファイルが干渉しているかもしれません。settings.local.json は Claude Code が自動で .gitignore に追記してくれるので、誤って commit することはないです。

permissions の評価順序

ルールは deny → ask → allow の順に評価されます。最初にマッチしたルールが勝つので、deny が書いてあれば allow があっても拒否されます。

Lyze
Lyze

どのスコープで allow しても、deny が1つでもあれば拒否されます。ユーザー設定の deny がプロジェクト設定の allow を上書きし、逆も然りです。

現在の設定を確認するコマンド

設定がどう読み込まれているか確認するには、Claude Code のチャット内でこのコマンドを使います。

コマンド内容
/statusどの設定ファイルが読み込まれているか一覧表示
/permissions現在の allow / deny / ask ルールを UI で確認
/configインタラクティブに設定を変更するインターフェース

「自分の設定がどうなっているかわからない」と思ったらまず /status を叩くのがおすすめです。


自分用 settings.json を作る

必要な設定にチェックを入れると、そのまま使える JSON が生成されます。

🔴 必須(外さないでください)
🟠 強く推奨(外すと情報漏洩リスクあり)
🟡 任意(慎重に使いたい人向け)
🟢 便利設定(ほぼ安全な自動許可)
⚙️ 基本設定



まず入れておきたい設定(コピペ用テンプレート)

ユーザー設定(~/.claude/settings.json)の最小セットです。

{
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
  "permissions": {
    "allow": [
      "Bash(git status)",
      "Bash(git diff *)",
      "Bash(git log *)",
      "Bash(git commit *)",
      "Bash(git pull *)",
      "Bash(git fetch *)",
      "Bash(npm run *)",
      "WebSearch",
      "WebFetch"
    ],
    "ask": [
      "Bash(git push *)",
      "Bash(git reset --hard *)",
      "Bash(rm *)"
    ],
    "deny": [
      "Bash(curl *)",
      "Bash(wget *)",
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(~/.ssh/**)",
      "Read(~/.aws/**)"
    ]
  },
  "language": "japanese",
  "effortLevel": "high"
}

各設定の意味と防げること

allow(確認なしで通す)

設定意味
Bash(git status/diff/log)読み取り系の git 操作は安全なので毎回確認なしに
Bash(git commit *)コミットは手元で完結するので自動許可
Bash(git pull *) / Bash(git fetch *)リモートの取得は基本安全
Bash(npm run *)スクリプト実行は頻度が高いので allow に
WebSearch / WebFetchリサーチ用途で Web を読む操作を許可

ask(毎回確認する)

設定意味・なぜ確認が必要か
Bash(git push *)誤ったブランチへのプッシュや force push を防ぐ
Bash(git reset --hard *)コミットを消す操作。取り消せないので必ず確認
Bash(rm *)ファイル削除。rm -rf も含まれるので確認必須

deny(絶対に通さない)

設定防げること
Bash(curl *) / Bash(wget *)任意URLへのネットワークアクセスを遮断。情報漏洩・マルウェアダウンロードを防ぐ
Read(./.env) / Read(./.env.*)APIキーや DB パスワードが入った .env ファイルの読み取りを防ぐ
Read(~/.ssh/**)SSH 秘密鍵の読み取りを防ぐ
Read(~/.aws/**)AWS 認証情報の読み取りを防ぐ

その他

$schema を書いておくと VS Code や Cursor でオートコンプリートが効くようになります。地味に便利です。

language: "japanese" で Claude の返答が日本語になります。デフォルトは英語なので入れておくと快適です。


allow / deny / ask の書き方

deny→ask→allowの評価フロー

ツール名は大文字始まり(BashReadEditWebFetch など)。Bash は括弧内にコマンドパターンを書きます。

"Bash(git status)"              完全一致
"Bash(npm run *)"               * はスペース以降の任意の文字列
"Bash(git *)"                   git に続く全コマンド
"Read(./.env)"                  特定ファイル
"Read(**/.env)"                 任意の深さの .env ファイル
"WebFetch(domain:github.com)"   ドメイン指定
"WebFetch"                      全ドメイン許可

複合コマンドの注意点

&&|| で繋がれた複合コマンドは、各サブコマンドが独立して評価されます。

"Bash(safe-cmd *)" を allow していても、safe-cmd && rm -rf . は通りません。各コマンドがそれぞれ評価されるので、rm -rf . の部分で ask または deny が判定されます。

Windows のパス表記

Windows ではパスが内部で POSIX 形式に変換されます。

C:\kanalyzelab\  →  //c/kanalyzelab/
C:\Users\alice\  →  //c/Users/alice/

パスを deny / allow に書くときは //c/ 形式が正確です。


実際に気づいたこと:見落としていた3つ

自分の設定を見直してみて、気になる点が3つありました。

① Cドライブ全体が読み取り対象になっていた

additionalDirectories"C:\\" が入っていました。Claude Code が Cドライブ全体にアクセスできる状態です。

目的は別フォルダへのアクセスを許可することだったんですが、気づかずにCドライブ全体を開放していた。"Read(//c/Users/username/**)" も同様で、ユーザーホーム以下の全ファイルが読み取れる状態でした。

additionalDirectories は必要なフォルダだけ明記するようにしました。

② DBパスワードが平文で入っていた

過去に SSH + MySQL でサーバーの設定を確認するコマンドを実行したとき、毎回の確認プロンプトに OK を押し続けていたら、コマンドごと allow に残っていた。

そのコマンドにパスワードが埋め込まれていたので、Git 管理のファイルにそのまま残ることに。ヒヤっとしました。

→ パスワードが入ったコマンドは allow に書かない。都度確認を受け入れるか、スクリプト化して環境変数経由にするのが正解です。

③ deny と allow の優先関係を勘違いしていた

deny: Edit(C:/**) でCドライブ全体を拒否しつつ、allow: Edit(c:/kanalyzelab/**) でプロジェクトだけ許可できる」と思っていたんですが、できません。

公式ドキュメントに明記されていました。

“Rules are evaluated in order: deny → ask → allow. The first matching rule wins, so deny rules always take precedence.”

deny が先にマッチした時点で終了なので、allow は評価されません。

正しいやり方は「外のパスだけ deny に列挙」です。プロジェクトパスは deny に書かないことで、defaultMode: acceptEdits が効くようになります。

"deny": [
  "Edit(//c/OtherFolder/**)",
  "Edit(//c/Users/**)"
]
// c:\kanalyzelab は書かない → deny にひっかからない → 自動許可

プロジェクト設定と個人設定の使い分け

ファイル用途Git 管理
~/.claude/settings.json全プロジェクト共通の基本設定しない
.claude/settings.jsonプロジェクト固有・チーム共有の設定する
.claude/settings.local.json自分だけの設定・一時的な実験しない(自動 gitignore)

実際の使い分けイメージはこんな感じです。

~/.claude/settings.json
  → git コマンド・npm・基本の deny セット
  → どのプロジェクトでも共通の設定

.claude/settings.json
  → プロジェクト固有の Bash コマンド
  → defaultMode や外部ディレクトリの設定

.claude/settings.local.json
  → 試したいコマンドを一時的に allow したいとき
  → チームには影響させたくない個人設定

settings.local.jsonsettings.json より優先度が高いので、チームの設定を個人だけ上書きしたいときにも使えます。


公式ドキュメント

詳細は公式を参照してください。


まとめ

  • deny → ask → allow の順に評価。deny が最優先でスコープをまたいでも覆せない
  • deny(C:/**) + allow(c:/project/**) は効かない。外のパスだけ deny に列挙するのが正解
  • additionalDirectories は必要なフォルダだけに絞る
  • パスワードや秘密情報が入ったコマンドは allow に書かない
  • settings.local.jsonsettings.json より優先される(直感に反しやすい)
  • $schema を書くとエディターで補完が効く

よくある質問

Q: 今の設定がどうなっているか確認する方法は? Claude Code のチャットで /status を入力すると、読み込まれている設定ファイルの一覧が表示されます。/permissions で現在の allow / deny ルールも確認できます。

Q: .env ファイルを Claude Code に読ませないようにするには? deny"Read(./.env)""Read(./.env.*)" を追加します。これだけでプロジェクト内の .env ファイルへの Read が完全に拒否されます。

設定ファイルは一度作ったら終わりじゃなくて、使いながら育てるのが現実的だと思います。気になる人は X で感想聞かせてください。


KanalyzeLab — データ×AIで好きをカタチに