Claude Code Claude Code CLAUDE.md deny設定 権限モード

8月14日から、Claude Codeの新規セッションは自動モード(auto mode)で始まるようになる。対象はPro・Max・Teamプランで、公式ドキュメントアナウンスに明記された。自動モードを指定して挙動を確かめたので、誰がどう影響を受けるかから整理する。

影響を受けるのはこういう人

  • defaultModeを設定していない人——8月14日以降、新規セッションが自動モードで始まる。今まで出ていた確認プロンプトが大きく減る
  • Bash(*)のような広いallowルールでプロンプトを減らしていた人——そのルールが自動モードでは無効になる。減るどころか確認が増える方向に変わる
  • CLAUDE.mdに文章で禁止事項を書いている人——文章はルールではないので、最後の網だった確認プロンプトが外れる。denyに移す必要がある
  • すでにdefaultModeを設定している人、組織の管理設定で指定されている人——何も変わらない

変わるのは新規セッションの開始モードだけ

自動モードでは、ツールを実行する前に別のAIモデルがその操作を毎回チェックする。要求の範囲を超える操作、知らないインフラを対象にした操作、読み込んだ内容に誘導されたと見える操作を止め、それ以外は確認なしで進む。セッション中はShift+Tabで従来のManual(default)に戻せる。

自分が影響を受ける側かは、設定済みかどうかで分かる。何も出なければ未設定だ。

grep -r defaultMode ~/.claude/settings.json ~/.claude/settings.local.json

個人で従来どおりにするなら~/.claude/settings.json"permissions": {"defaultMode": "default"}を書く。組織全体で自動モードを使わせないなら、管理設定でpermissions.disableAutoMode"disable"にする。

denyとaskは自動モードでもそのまま効く

自動モードの判定は段階になっていて、最初に一致した段で決まる。まずallow・ask・denyルールが即決し、次に読み取りと作業ディレクトリ内の編集が自動承認され、残った操作がAIのチェックに回る。denyとaskはチェックの手前にあるので、自動モードでも従来どおり効く。

--permission-mode auto--settingsを渡せば、普段の設定を汚さずに隔離して確かめられる。

claude -p "curl -sS -o /dev/null -w '%{http_code}' https://example.com を実行して" \
  --permission-mode auto --settings ./settings-deny.json

Claude Code 2.1.221での結果が次のとおり。

設定 モード 結果
制約なし auto 実行された(200)
CLAUDE.mdに文章で禁止と書くだけ auto 3回中3回とも実行された
同じCLAUDE.md default 権限プロンプトで停止
deny: ["Bash(curl:*)"] auto ブロックされた
ask: ["Bash(curl:*)"] auto 確認を要求された
PreToolUseフック(終了コード2) auto ブロックされた

denyはcd /tmp && curl ...と連結した形でもブロックされた。なお題材のcurlは読み取りのHTTPリクエストで、自動モードのチェックでも既定で許可される部類だ。文章の禁止が読まれた上で許可されたのかどうかまでは、この検証では切り分けていない。

自動モードでは広いallowルールが無効になる

自動モードに入るとき、任意のコード実行を許してしまう広いallowルールは無効になる。対象はBash(*)PowerShell(*)Bash(python*)のようなインタプリタのワイルドカード、パッケージマネージャのrun系、Agentのallowルール。Bash(npm test)のような狭いルールは残り、モードを抜ければ元に戻る。確認が増えたと感じたら、まずここを疑うとよい。

文章で書いた禁止は保証にならない

チェック役のモデルはCLAUDE.mdの内容も読む。会話で「pushしないで」と伝えた条件も、既定では許可される操作を止める材料として扱われる。ただしこれはルールではない。伝えた条件は判定ごとに会話の履歴から読み直されるため、コンテキストの圧縮で消えれば失われる。公式ドキュメントも、確実に止めたいならdenyルールを使えと書いている。

自分の設定を見たら、denyは空の配列で、禁止したい操作はCLAUDE.mdに文章で3行書いてあるだけだった。事故が起きていなかったのはルールが効いていたからではなく、毎回プロンプトが出ていたからだ。8月14日を機に移しておく。

{
  "permissions": {
    "deny": [
      "Bash(ssh:*)",
      "Bash(docker build:*)",
      "Bash(docker rmi:*)"
    ],
    "ask": [
      "Bash(git push:*)"
    ]
  }
}

絶対に通したくない操作はdeny、都度判断したい操作はask。denyはツール名のグロブも受け付けるので、書き込み系のMCPツールをmcp__*の形でまとめて止められる。Readのdenyで機密ファイルを塞ぐ書き方は別記事にまとめた。