settings.json を Claude Code 自身に書き換えさせない方法を検証した~deny ルールと保護されたパス(protected paths)について
コーヒーが好きな emi です。
Claude Code の settings.json には、コマンドの実行を禁止する deny という権限ルールがあります。詳しい仕組みは以下公式ドキュメントに書かれています。
Claude Code 利用時に Claude 自身が settings.json を書き換えてしまうのを防げないかと考えていました。そこで settings.json の permissions.deny にルールを書いて、Claude Code 自身に settings.json を書き換えさせないようにできるか検証しました。
調べて分かったことと、実際に挙動を確認して分かったことを紹介します。
先に結論
1. Edit を deny すると Edit 経由のファイル操作はブロックされる
Edit(//**/.claude/settings.json)をdenyに入れると、Edit / Write 経由の書き換えは試した 3 モードすべてでブロックされた- プロンプトも出ず
Error editing fileで止まる
2. Write ではなく Edit で書く
- ファイル権限チェックの対象は
Edit(path)とRead(path)のみWrite(...)と書いても参照されず起動時に警告が出る
Edit(...)はファイルを編集する組み込みツール全部に適用されるので、Edit(...)だけ書けば Write ツールもカバーされる
3. .claude は deny がなくても保護されたパス(protected paths)として保護されるが、権限モードによって挙動が変わるため注意
.claude/settings.jsonは deny を書かなくても保護されたパス(protected paths)として保護される- ただし保護されたパスはモードで挙動が変わり、
autoは分類器行き、bypassPermissionsは許可となる
4. Edit を deny するだけでは Bash 経由の操作はブロックできない
- deny の
Edit(...)は Edit / Write 経由を止めるもので、Bash 経由(sed -iやpythonでの書き込み)はブロックできない - Bash 経由の操作までブロックしたい場合、
Bash(...)のdenyにコマンドを追記するか、コマンド文字列に依存しない sandbox やPreToolUseフックの利用が推奨される、と公式は案内している(Configure permissions)
検証環境
- Claude Code v2.1.248
- Amazon Bedrock(Opus 4.8)
- 検証用プロジェクト
~/work/test
今回はプロジェクトスコープの ~/work/test/.claude/settings.json を使って実験しました。
最初に考えていたこと
最初は次のように deny にコマンドを並べる形を考えていました。
{
"permissions": {
"deny": [
"<settings.json を書き換えるコマンドをここに書く>"
]
}
}
が、書き換えるコマンドを網羅するのって現実的じゃないよな、と思いました。また、Claude がファイルを書き換える方法は調べると 2 種類あることが分かりました。
Claude Code がファイルを書き換える方法 2 つ
Claude Code がファイルを書き換える方法は大きく 2 つあります。
- 1. Edit 経由
- Claude Code が持っている専用のファイル編集ツール(Edit / Write)を使う方法
- 2. Bash 経由
- ターミナルでシェルコマンドを実行してファイルを書き換える方法
echo '{}' > ~/.claude/settings.json、sed -i 's/old/new/' ~/.claude/settings.json、python3 -c "open('~/.claude/settings.json','w').write('...')"など
deny ルールで Edit(...) を書けば Edit 経由の編集をブロックできますが、Bash 経由のコマンド実行によるファイル編集はブロックできないので、Bash 経由のファイル編集もブロックしたいなら Bash(sed:*) のように別途書く必要があります。
つまり最初に考えていた deny にコマンドを並べる方法だと Bash 経由のファイル編集しか制限できません(しかも網羅するのは現実的に無理)。
最初に設定した settings.json
なので、.claude/settings.json は以下のように設定してみました。
{
"permissions": {
"deny": [
"Edit(//**/.claude/settings.json)",
"Write(//**/.claude/settings.json)"
]
}
}
Edit(...) の中のパスは gitignore に似た書き方で指定します。パス指定の仕方も Read と Edit に記載があります。
//で始まる- ファイルシステムのルートから見た絶対パスになり、「マシンのどこであっても」という意味
**- 途中のフォルダが何段あってもマッチするワイルドカード
なので //**/.claude/settings.json は、「マシンのどこにあっても .claude/settings.json という末尾のファイルなら全部マッチする」という意味になります。今回はユーザースコープの settings.json もプロジェクトスコープの settings.json もカバーしてみたかったので、このように記述してみました。
具体的には次の両方にマッチします。
~/work/test/.claude/settings.json(プロジェクトスコープ)~/.claude/settings.json(ユーザースコープ)
ファイル編集を拒否する deny の書き方
Claude Code on Bedrock を起動したら、起動時に以下メッセージが出ました。
emiki@<hostname>:~/work/test$ claude-bedrock
Enter MFA code for <arn>: xxxxxx
Permission deny rule (.claude/settings.json): Write(//**/.claude/settings.json) is not matched by file permission checks — only Edit(path) rules are. Use Edit(//**/.claude/settings.json) instead (Edit rules cover all file-editing tools).
:
emiki@<hostname>:~/work/test$
Write(//**/.claude/settings.json) はファイル権限チェックの対象外、と書いてあります。権限チェックの対象となるのは Edit(path) ルールのみで、Edit ルールはすべてのファイル編集ツールを網羅しているため、Edit(//**/.claude/settings.json) を使用してください、とのことです。
よく調べると、Claude Code のファイル権限チェックは Edit(path) と Read(path) ルールのみを見る、というのがドキュメントにもかいてありました。
Edit ルールはファイルを編集するすべての組み込みツールに適用されます。
Claude Code は Edit(path) と Read(path) ルールに対してのみファイル権限をチェックします。代わりに Write、NotebookEdit、Glob、またはレガシー MultiEdit ツール用にパスルールを記述する場合、Claude Code はルールを受け入れますが、それを参照することはなく、起動時に警告を表示します。
Write ツールも「ファイルを編集するすべての組み込みツール」に含まれるので、Edit(...) だけ書けば Write ツール経由の書き込みもカバーされるという仕組みでした。
以下のように settings.json を修正すると、警告は出なくなりました。
{
"permissions": {
"deny": [
"Edit(//**/.claude/settings.json)"
]
}
}
settings.json の編集がブロックされるか検証
追記に使うキーは cleanupPeriodDays にしました。数値なので追記されたか一目で分かりますし、チャット履歴の保持日数というほぼ無害な設定です。デフォルトは 30 です(cleanupPeriodDays)。追記されたか分かりやすいよう、検証では 45 を追記させます。
これを Claude Code に
`.claude/settings.json` に `"cleanupPeriodDays": 45` を追記して
と頼んで、書き換えられるかを見ていきます。
検証1:auto モード
まず auto モードで頼みました。
▐▛███▛█ Claude Code v2.1.248
▝▜██████▀ Opus 4.8 · Amazon Bedrock
▝▝ ▝▝ ~/work/test
❯ .claude/settings.json に "cleanupPeriodDays": 45 を追記して
Read 1 file
● Update(.claude/settings.json)
Error editing file
.claude/settings.json 自体に、この設定ファイルの編集を禁止する deny ルールが入っていて、編集がブロックされました。
"deny": [
"Edit(//**/.claude/settings.json)"
]
このルールが有効なままだと、私からは .claude/settings.json を書き換えられない。回避策として Bash で直接書き込むこともできるが、それはあなたが設定した禁止ルールをすり抜けることになるので、勝手にはやらない。
進め方の選択肢:
- deny ルールを一時的に外す(またはこのファイルを対象から除外する)→ そのうえで私が cleanupPeriodDays: 45 を追記
- あなた自身が追記する。プロンプトに次を貼れば、このセッションで実行できる
! python3 -c "import json,pathlib; p=pathlib.Path('/home/emiki/work/test/.claude/settings.json'); d=json.loads(p.read_text()); d['cleanupPeriodDays']=45; p.write_text(json.dumps(d, indent=2, ensure_ascii=False)+'\n')"
どちらで進めるか教えてください。
✻ Sautéed for 29s · done 7:55 AM
※ recap: .claude/settings.json に cleanupPeriodDays: 45 を追記したいが、同ファイルが deny ルールで編集ブロックされている。次は、deny ルールを外すかユーザー自身で追記するか、進め方の返答を待つ。 (disable recaps in /config)
✘ Auto-update failed · Try claude doctor or npm i -g @anthropic-ai/claude-code
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
⏵⏵ auto mode on (shift+tab to cycle) · ← for agents · shift+click to native select
Claude が Update(Edit)ツールで書こうとして deny ルールで編集がブロックされ Error editing file となりました。
auto モードでは「Bash で直接書けばすり抜けられるが、あなたが設定した禁止ルールをすり抜けることになるので勝手にはやらない」と判断して止まっています。
検証2:bypassPermissions モード
次に、許可を一切聞かない bypassPermissions モードで試しました。
auto モードのモデル判断がない場合にちゃんと deny でブロックされるか確認します。
起動時に警告が出ました。
emiki@<hostname>:~/work/test$ claude-bedrock --permission-mode bypassPermissions
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
WARNING: Claude Code running in Bypass Permissions mode
In Bypass Permissions mode, Claude Code will not ask for your approval before running potentially dangerous commands.
This mode should only be used in a sandboxed container/VM that has restricted internet access and can easily be restored if damaged.
By proceeding, you accept all responsibility for actions taken while running in Bypass Permissions mode.
https://code.claude.com/docs/en/security
❯ No, exit
Yes, I accept
Enter to confirm · Esc to cancel
bypassPermissions モードで実行されるよ、問題が発生してもいい環境なのかよく確認してくださいね、何があってもすべての責任を負うことに同意したものとみなされますよ、ということが書かれています。
今回は緊張しながら Yes, I accept を選択して進めます。
▐▛███▛█ Claude Code v2.1.248
▝▜██████▀ Opus 4.8 · Amazon Bedrock
▝▝ ▝▝ ~/work/test
❯ .claude/settings.json に "cleanupPeriodDays": 45 を追記して
Read 1 file
● Update(.claude/settings.json)
Error editing file
予想どおり、この settings.json 自体に編集を禁止するルールが入っていて、Edit がブロックされました。
"deny": [
"Edit(//**/.claude/settings.json)"
]
このルールがある以上、私(Claude)からは .claude/settings.json を編集できません。次のどちらかで対応してください。
- 自分でファイルを開いて "cleanupPeriodDays": 45, を追記する。編集後は次のようになる:
{
"cleanupPeriodDays": 45,
"permissions": {
"deny": [
"Edit(//**/.claude/settings.json)"
]
}
}
- deny ルールごと私に編集させたいなら、先にこのルールを外す(外すのも同じ理由で私からはできないので、手動で消す必要がある)
どうするか決めてもらえれば、それに合わせて進めます。
✻ Brewed for 17s · done 8:50 AM
✘ Auto-update failed · Try claude doctor or npm i -g @anthropic-ai/claude-code
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
⏵⏵ bypass permissions on (shift+tab to cycle) · ← for agents · shift+click to native select
ちゃんと止まりました。
検証3:acceptEdits モード
acceptEdits モードは、ファイル編集や mkdir、touch、rm、rmdir、mv、cp、sed を自動承認するモードです(acceptEdits モードでファイル編集を自動承認する)。「一般的なファイル編集ツールの使用やファイル作成などの一般的なファイル操作は Claude に任せるよ、でも curl とかそれ以外のコマンド実行は人間に確認してね」なモードです。
ファイル編集に加えて、acceptEdits モードは一般的なファイルシステム Bash コマンドを自動承認します。mkdir、touch、rm、rmdir、mv、cp、sed。
よくある Bash コマンドは確認されずに自動承認されるということで試そうと思ったのですが、ドキュメントを見ていると以下の記載を見つけました。
そのスコープ外のパス、保護されたパス への書き込み、rm と rmdir の削除が 重要なパス をターゲットにしている場合、および 読み取り専用コマンドの組み込みセットを除くその他すべての Bash コマンドはまだプロンプトが表示されます。
保護されたパス…?重要なパス…?
ひょっとして最初から settings.json は保護されているってことなのでしょうか。
.claude は保護されたパス(protected paths)でもある
Claude Code には protected paths(保護されたパス)という仕組みがあり、.claude ディレクトリはそこに含まれています。書き込みは bypassPermissions モードなどを除いて自動承認されません。リポジトリ状態や Claude 自身の設定が誤って壊れるのを防ぐための仕組みです。
保護されたパス(protected paths)の一覧
保護されたディレクトリ
| ディレクトリ | 備考 |
|---|---|
.git |
|
.config/git |
|
.vscode |
|
.idea |
|
.husky |
|
.cargo |
|
.devcontainer |
|
.yarn |
|
.mvn |
|
.claude |
ただし .claude/worktrees は除く。Claude はここに独自の git worktrees を保存する |
保護されたファイル
| 分類 | ファイル |
|---|---|
| git 関連 | .gitconfig、.gitmodules |
| シェル関連 | .bashrc、.bash_profile、.bash_login、.bash_aliases、.bash_logout、.zshrc、.zprofile、.zshenv、.zlogin、.zlogout、.profile、.envrc |
| npm / yarn / pnpm / bun 関連 | .npmrc、.yarnrc、.yarnrc.yml、.pnp.cjs、.pnp.loader.mjs、.pnpmfile.cjs、bunfig.toml、.bunfig.toml |
| Bazel 関連 | .bazelrc、.bazelversion、.bazeliskrc |
| pre-commit / lefthook 関連 | .pre-commit-config.yaml、lefthook.yml、lefthook.yaml、.lefthook.yml、.lefthook.yaml |
| Gradle / Maven 関連 | gradle-wrapper.properties、maven-wrapper.properties |
| devcontainer 関連 | .devcontainer.json |
| その他ツール設定 | .ripgreprc、pyrightconfig.json |
| Claude / MCP 関連 | .mcp.json、.claude.json |
普通のファイル(作業ディレクトリ内)への Edit / Write と、保護されたパス(protected paths)への Edit / Write を対比すると以下です。
ここで比べているのは Edit / Write ツールによるファイル編集です(sed や python のようなシェルコマンド経由は扱いが別です)。
| モード | 普通のファイルへの Edit / Write 権限モードを選択する |
保護されたパス への Edit / Write |
|---|---|---|
| default | プロンプト表示 | プロンプト表示 |
| acceptEdits | 自動承認(プロンプトなしで書ける) | プロンプト表示 |
| auto | 自動承認(分類器も通さず素通り) | 分類器にルーティング |
| dontAsk | 拒否 | 拒否 |
| bypassPermissions | 許可 | 許可 |
※ plan モードは本来ソースファイルの編集をブロックするモードで、挙動の説明が細かくなるのでこの記事では触れません。
公式ドキュメントの分類器の判定順(How the classifier evaluates actions)には、作業ディレクトリ内の読み取り専用操作とファイル編集は自動的に承認されますが、保護されたパス(protected paths)への書き込みと作業ディレクトリ外への最初の読み取りは例外で、確認を求められます。
Read-only actions and file edits in your working directory are auto-approved, except writes to protected paths and the first read outside the working directories, which prompts you
Everything else goes to the classifier.
sed や echo、python のようなシェルコマンドはこの「それ以外」に当たるので、普通のファイルへの書き込みでも分類器に行きます。表の「自動承認(分類器も通さず素通り)」はあくまで Edit / Write のケースです。
検証 2 では、bypassPermissions では保護されたパス(protected paths)でも「許可」のはずですが、deny のおかげで Edit はちゃんと止まっていましたね。
acceptEdits モードで権限ルールに deny を書くパターンと書かないパターンの挙動を試しました。
deny あり
deny を入れたまま acceptEdits(⏵⏵ accept edits on)で頼むと、Edit はブロックされました。
▐▛███▛█ Claude Code v2.1.248
▝▜██████▀ Opus 4.8 · Amazon Bedrock
▝▝ ▝▝ ~/work/test
❯ .claude/settings.json に "cleanupPeriodDays": 45 を追記して
Read 1 file
● Update(.claude/settings.json)
Error editing file
予想どおり編集がブロックされました。この settings.json 自体に Edit(//**/.claude/settings.json) の deny ルールがあり、Edit / Write でこのファイルを書き換えられません。
対応方法は次のどちらか。
- あなたのターミナルで直接実行する(! プレフィックスでこのセッションから実行可能)
! python3 -c "import json,pathlib; p=pathlib.Path('.claude/settings.json'); d=json.loads(p.read_text()); d['cleanupPeriodDays']=45; p.write_text(json.dumps(d, indent=2, ensure_ascii=False)+'\n')"
- deny ルールを一時的に外してよいなら、.claude/settings.json の deny から該当行を削除したうえで、再度私に依頼する
追記後の内容は次のようになる。
{
"permissions": {
"deny": [
"Edit(//**/.claude/settings.json)"
]
},
"cleanupPeriodDays": 45
}
どちらで進めるか教えてください。
✻ Cooked for 16s · done 9:34 AM
✘ Auto-update failed · Try claude doctor or npm i -g @anthropic-ai/claude-code
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
⏵⏵ accept edits on (shift+tab to cycle) · ← for agents · shift+click to native select
deny でブロックされたと出ています。
deny なし
次に deny を空にしました。
{
"permissions": {
"deny": []
}
}
❯ .claude/settings.json に "cleanupPeriodDays": 45 を追記して
deny ルールで Edit / Write は使えないので、Bash から書き換えます。
● Adding cleanupPeriodDays to settings.json via python
⎿ $ python3 -c "import json,pathlib; p=pathlib.Path('/home/emiki/work/test/.claude/settings.json'); d=json.loads(p.read_text()); d['cleanupPeriodDays']=45; p.write_text(json.dumps(d, indent=2, ensure_ascii=False)+'\n')" && cat /home/emiki/work/test/.claude/settings.json
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Bash command
Tip: auto mode handles these prompts for you — choose "switch to auto mode" below
│ python3 -c "import json,pathlib; p=pathlib.Path('/home/emiki/work/test/.claude/settings.json'); d=json.loads(p.read_text()); d['cleanupPeriodDays']=45; p.write_text(json.dumps(d, indent=2, ensure_ascii=False)+'\n')" && cat /home/emiki/work/test/.claude/settings.json
Add cleanupPeriodDays to settings.json via python
This command requires approval
Do you want to proceed?
❯ 1. Yes
2. Yes, and don’t ask again for: python3 *
3. Yes, and switch to auto mode · auto mode handles these prompts for you
4. No
Esc to cancel · Tab to amend · ctrl+e to explain
おや…?
deny ルールで編集できないと言っていますね…
公式ドキュメント 編集がいつ有効になるか にはpermissions の編集は再起動なしで反映されると書かれていますが、まだ反映されていないのでしょうか。
Claude Code は設定ファイルを監視し、変更時に再読み込みするため、permissions、hooks、および apiKeyHelper などの認証情報ヘルパーへの編集を含む、ほとんどの編集は再起動なしで実行中のセッションに適用されます。
一旦 No で操作を止め、再チャレンジします。
❯ .claude/settings.json に "cleanupPeriodDays": 45 を追記して
Bash も止められたので、私から書き換える手段が残っていません(Edit / Write は deny ルールでブロック、Bash は今拒否されました)。
進め方を選んでください。
- あなたのターミナルで直接実行する。この入力欄に次を貼れば、このセッションから実行できます
! python3 -c "import json,pathlib; p=pathlib.Path('.claude/settings.json'); d=json.loads(p.read_text()); d['cleanupPeriodDays']=45; p.write_text(json.dumps(d, indent=2, ensure_ascii=False)+'\n')"
- deny ルールを一時的に外す。.claude/settings.json の deny から Edit(//**/.claude/settings.json) を消してから再依頼
- 私が Bash で書き換えるのを許可する(さっきのコマンドを承認する)
どれにしますか。
✻ Sautéed for 11s · done 9:41 AM
✘ Auto-update failed · Try claude doctor or npm i -g @anthropic-ai/claude-code
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❯
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
⏵⏵ accept edits on (shift+tab to cycle) · ← for agents · shift+click to native select
うーん、やはり deny ルールのせいで編集できないと言っています。一旦セッションを /exit で抜けて、再度 Claude Code を起動して acceptEdits(⏵⏵ accept edits on)モードにし、再チャレンジします。
▐▛███▛█ Claude Code v2.1.248
▝▜██████▀ Opus 4.8 · Amazon Bedrock
▝▝ ▝▝ ~/work/test
❯ .claude/settings.json に "cleanupPeriodDays": 45 を追記して
Read 2 files
● Update(.claude/settings.json)
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Edit file
.claude/settings.json
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
{
"permissions": {
"deny": []
- }
+ },
+ "cleanupPeriodDays": 45
}
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
Do you want to make this edit to settings.json?
❯ 1. Yes
2. Yes, and allow Claude to edit its own settings for this session
3. No
Esc to cancel · Tab to amend
保護されたパス に記載の通り、Yes, and allow Claude to edit its own settings for this session というオプションが表示されています。
.claude/ への書き込みのプロンプトに Yes, and allow Claude to edit its own settings for this session というオプションが表示され、そのセッション内の後続の .claude/ への書き込みを再度プロンプトなしで承認します。
今回は Noでキャンセルしておきます。
これで挙動は確認できました。
deny があると Edit は Error editing file で即ブロックされ、プロンプトも出ません。deny がない場合、acceptEdits では Edit はブロックされず、保護されたパス(protected path)の確認プロンプトが出ます。
公式ドキュメントの 編集がいつ有効になるか には、permissions の編集は再起動なしで反映されると書かれています。今回はそう見えなかったので、謎です。似た報告として、settings.json の permission 変更が実行中セッションに反映されず再起動が必要だった、という Issue を複数見つけました(#30737、#33829、#53538)。原因までは特定できていません。
分かったこと
※再掲
1. Edit を deny すると Edit 経由のファイル操作はブロックされる
Edit(//**/.claude/settings.json)をdenyに入れると、Edit / Write 経由の書き換えは試した 3 モードすべてでブロックされた- プロンプトも出ず
Error editing fileで止まる
2. Write ではなく Edit で書く
- ファイル権限チェックの対象は
Edit(path)とRead(path)のみWrite(...)と書いても参照されず起動時に警告が出る
Edit(...)はファイルを編集する組み込みツール全部に適用されるので、Edit(...)だけ書けば Write ツールもカバーされる
3. .claude は deny がなくても保護されたパス(protected paths)として保護されるが、権限モードによって挙動が変わるため注意
.claude/settings.jsonは deny を書かなくても保護されたパス(protected paths)として保護される- ただし保護されたパスはモードで挙動が変わり、
autoは分類器行き、bypassPermissionsは許可となる
4. Edit を deny するだけでは Bash 経由の操作はブロックできない
- deny の
Edit(...)は Edit / Write 経由を止めるもので、Bash 経由(sed -iやpythonでの書き込み)はブロックできない - Bash 経由の操作までブロックしたい場合、
Bash(...)のdenyにコマンドを追記するか、コマンド文字列に依存しない sandbox やPreToolUseフックの利用が推奨される、と公式は案内している(Configure permissions)
おわりに
settings.json を Claude Code に書き換えさせたくない場合、Edit(//**/.claude/settings.json) を deny に 1 行書いておくのが分かりやすいです。
あわせて .claude はもともと保護されたパス(protected paths)としてちょっとだけ守られていることも分かりました。
同じように settings.json を勝手に触られて困っている方の参考になればうれしいです。
本記事への質問やご要望については画面下部の「DevelopersIOへのご意見」からお問い合わせいただけます。






