Claude Codeのパーミッション設計完全ガイド——Allow/Deny/Askの3層で「安全な自律」を実現する

はじめに

Claude Codeを使い続けると、2つの相反する不満が生まれる。

「毎回 npm run test の実行に確認が必要で遅い」(不満A)。「--dangerously-skip-permissions は怖いが、毎回承認も面倒」(不満B)。

この2つは正しいパーミッション設計で同時に解決できる。「安全なものは自動で通す・危険なものは絶対ブロック・曖昧なものは都度確認」という3層設計が答えだ。

パーミッションの3層モデルと評価順序

Claude Codeのパーミッションは次の順序で評価される。

deny(最優先)→ ask → allow

deny が最優先であることが重要で、allowとdenyが競合した場合はdenyが勝つ。

レイヤー動作対象の例
Allow確認なしで自動実行npm run *, git status, Read, Write, Edit
Deny完全にブロック(実行不可).env読み取り, rm -rf *, npm publish
Ask実行前に確認git push --force, terraform apply

「未定義」はデフォルトで「ask(都度確認)」として扱われる。

Allow設定:毎回確認が不要な安全な操作

{
  "permissions": {
    "allow": [
      "Bash(npm run *)",
      "Bash(npm test)",
      "Bash(git status)",
      "Bash(git diff *)",
      "Bash(git log *)",
      "Bash(git add *)",
      "Bash(git commit *)",
      "Bash(ls *)",
      "Read",
      "Write",
      "Edit"
    ]
  }
}

ワイルドカード構文を使うと柔軟に設定できる。"Bash(npm run *)" は npm run build、npm run test、npm run lint 全てを自動許可する。"Edit(/docs/**)" は docs/ ディレクトリ配下のファイル編集のみを自動許可する。

設計原則:Allowに追加するのは「何度やっても安全」と確認されたものだけ。初めて使うコマンドはaskで様子を見てからAllowに昇格させる。

Deny設定:絶対にClaude Codeに触らせないもの

機密ファイルの保護

{
  "permissions": {
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(**/*.pem)",
      "Read(**/*.key)",
      "Read(**/*credentials*)",
      "Write(./.env)",
      "Write(./.env.*)"
    ]
  }
}

破壊的操作のブロック

{
  "permissions": {
    "deny": [
      "Bash(rm -rf *)",
      "Bash(git push --force *)",
      "Bash(git reset --hard *)",
      "Bash(npm publish *)",
      "Bash(curl *)",
      "Bash(wget *)"
    ]
  }
}

使用しないツールのブロック(トークン節約)

Claude Codeのシステムツールは約19,400トークン(コンテキストの9.7%)を消費している(参考値)。使わないツールをdenyすると、システムプロンプトから除外されてトークン消費が削減できる。JupyterNotebookを使わないプロジェクトでは、NotebookEditNotebookRead を deny するだけで数千トークンを節約できる。

機密ファイルの二重ブロック

settings.jsonのdenyだけでは「Readツール経由」のアクセスしかブロックできない。cat ~/.ssh/id_rsa のようなBashコマンドは別途ブロックが必要だ。

{
  "permissions": {
    "deny": [
      "Read(./.env)",
      "Read(**/*.pem)"
    ]
  },
  "sandbox": {
    "filesystem": {
      "denyRead": [
        "~/.aws/credentials",
        "~/.ssh",
        "~/.config/gcloud"
      ]
    }
  }
}
ブロック対象設定箇所
permissions.denyReadツールによるAPI経由アクセスsettings.json
sandbox.filesystem.denyReadBashコマンド(cat等)による直接アクセスsettings.json

: sandbox.filesystem.denyRead はナレッジベースで確認された設定項目だが、公式ドキュメントでの記載は変動する可能性がある。使用する前に最新のAnthropicドキュメントを確認すること。

プロンプトインジェクション攻撃では悪意あるコードにAIへの指示が埋め込まれ、Claude Codeが意図せず機密ファイルを読もうとする可能性がある。二重ブロックがこのリスクを大幅に低減する。

設定ファイルの管理:チーム設定と個人設定の分離

パーミッションはどのスコープで設定するかも重要で、4段階ある。

スコープファイル管理方法
エンタープライズmanaged-settings.json組織ポリシー(上書き不可)
プロジェクト.claude/settings.jsongit管理・チーム共有
ローカル上書き.claude/settings.local.json.gitignore・個人用
ユーザー~/.claude/settings.json全プロジェクトに適用

私がチーム導入時に使っているディレクトリ構成はこうだ。

プロジェクトルート/
├── .claude/
│   ├── settings.json          ← git管理(チーム共有のパーミッション)
│   └── settings.local.json    ← .gitignore(個人のカスタマイズ)
└── .gitignore
    └── .claude/settings.local.json  ← 必ず除外

settings.json にはチーム全員に適用したいAllow/Deny設定を書き、settings.local.json には自分だけの追加Allow(開発中の特定スクリプトなど)を書く。

パーミッションモードの選択

コマンドラインからモードを指定することもできる。

フラグ / モード動作使いどき
デフォルト(なし)settings.json設定に従う通常の開発
--permission-mode plan読み取り専用(Plan Mode)計画・調査フェーズ
--dangerously-skip-permissions全確認をスキップCI/CDのみ・コンテナ内のみ

--dangerously-skip-permissions はCI/CDのDockerコンテナ内など「コンテナ自体が安全な境界」になっている場合のみ使用する。ローカル開発では使わない。

権限の定期棚卸し

/permissions コマンドで現在有効な全権限設定を一覧表示できる。使い続けると「Always allow」で許可したルールが蓄積されるため、月1回の棚卸しで不要なAllowを削除する習慣をつけるとよい。

ビフォーアフター

Before(デフォルト設定のまま)

npm test を実行するたびに「許可しますか?」が来る。git status も確認。ファイル編集も確認。1セッションで何十回も「y」を押す羽目になり、面倒になって --dangerously-skip-permissions を使ってしまう。結果、.envファイルも破壊的コマンドも全て無制限に実行できる状態になる。

After(3層パーミッション設計)

npm run * は確認なしで即座に実行(Allow)。.env 読み取りは完全ブロック(Deny)。rm -rf * も完全ブロック(Deny)。git push は確認あり(Ask)。高速な自律実行と安全な境界線が両立する。

まとめ:今日からできること

  • 今すぐ(5分): .claude/settings.jsonnpm run *git status/diff をAllowに追加する
  • 今日中: .envrm -rf * をDenyに追加する
  • 今週: /permissions で現在の権限設定を確認し、不要なAllow設定を整理する
  • チーム展開: .claude/settings.json をgit管理し、settings.local.json.gitignore に追加する

「安全のためにすべて手動確認」でも「速度のためにすべて自動許可」でもなく、3層の設計で両方を手に入れる——それがパーミッション設計の醍醐味だと思っている。

コメント

タイトルとURLをコピーしました