CodeCraft Lab

権限設定でセキュリティと利便性を両立する

allowリスト・denyリストの設計、プロジェクト別設定管理、よくある権限エラーの対処法を解説します

かんたん9分で読了
権限セキュリティ設定

はじめに

Claude Codeを使っていると、「このコマンドを実行してもよいですか?」という確認ダイアログが頻繁に表示されます。セキュリティのために大切な仕組みですが、信頼できるコマンドまで毎回確認を求められるのは煩わしいものです。

権限設定を適切に行えば、安全なコマンドは自動で許可しつつ、危険な操作はしっかりブロックできます。この記事では、プロジェクトに合った権限設定の設計方法を解説します。

権限システムの概要

Claude Codeはツールを使ってファイルの読み書きやコマンド実行を行います。各ツールには権限レベルが設定されており、ツールの種類によって承認の要否が異なります。

ツールの種類承認
読み取り専用ファイル読み取り、Grep不要
Bashコマンドシェルコマンド実行必要
ファイル変更ファイルの編集・作成必要

Bashコマンドで「はい、今後は聞かない」を選ぶと、そのコマンドパターンが自動許可されます。しかし、毎回手動で許可するのではなく、あらかじめ設定ファイルで管理するのが効率的です。

3つの権限ルール

権限ルールには3種類があり、deny > ask > allow の優先順位で評価されます。

ルール動作用途
allow確認なしで許可よく使う安全なコマンド
ask毎回確認を表示注意が必要なコマンド
deny実行をブロック危険なコマンド
denyルールは最優先

いずれかの設定レベルでdenyに指定されたツールは、他のレベルでallowに指定されていてもブロックされます。denyルールは常に最優先で評価されます。

settings.jsonの構造

権限設定は settings.json に記述します。設定ファイルは3つのレベルがあり、それぞれ異なる範囲に適用されます。

レベルファイルパス対象範囲共有
ユーザー~/.claude/settings.jsonすべてのプロジェクト個人のみ
プロジェクト.claude/settings.jsonリポジトリ全体gitでチーム共有
ローカル.claude/settings.local.jsonリポジトリ内の自分のみgitignored

設定の基本形は以下の通りです。

{
  "permissions": {
    "allow": [
      "Bash(npm run *)",
      "Bash(git status *)"
    ],
    "deny": [
      "Bash(rm -rf *)",
      "Read(./.env)"
    ]
  }
}

allowリストの設計パターン

フロントエンドプロジェクト向け

{
  "permissions": {
    "allow": [
      "Bash(npm run *)",
      "Bash(npm test *)",
      "Bash(npx tsc *)",
      "Bash(npx eslint *)",
      "Bash(npx prettier *)",
      "Bash(git status *)",
      "Bash(git diff *)",
      "Bash(git log *)",
      "Bash(git add *)",
      "Bash(git commit *)"
    ],
    "deny": [
      "Bash(npm publish *)",
      "Bash(git push *)",
      "Bash(rm -rf *)",
      "Read(./.env)",
      "Read(./.env.*)"
    ]
  }
}

バックエンドプロジェクト向け

{
  "permissions": {
    "allow": [
      "Bash(python -m pytest *)",
      "Bash(python -m mypy *)",
      "Bash(python -m ruff *)",
      "Bash(docker compose up *)",
      "Bash(docker compose down *)",
      "Bash(docker compose logs *)",
      "Bash(git status *)",
      "Bash(git diff *)",
      "Bash(git log *)",
      "Bash(git add *)",
      "Bash(git commit *)"
    ],
    "deny": [
      "Bash(docker push *)",
      "Bash(git push *)",
      "Bash(rm -rf *)",
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)"
    ]
  }
}
ワイルドカードの使い方

* は任意の文字列にマッチします。Bash(npm run *)npm run buildnpm run test などすべてのnpm runコマンドに一致します。* の前のスペースは重要で、Bash(ls *)ls -la にマッチしますが lsof にはマッチしません。

denyリストで危険なコマンドをブロック

denyリストには、実行されると取り返しのつかない影響がある操作を登録します。以下は多くのプロジェクトで共通して設定すべき項目です。

{
  "permissions": {
    "deny": [
      "Bash(rm -rf *)",
      "Bash(git push --force *)",
      "Bash(git reset --hard *)",
      "Bash(curl *)",
      "Bash(wget *)",
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)",
      "Read(~/.ssh/**)",
      "Read(~/.aws/**)"
    ]
  }
}

ベアツール名(Bash のみ)でdenyすると、そのツール自体がClaudeのコンテキストから削除されます。一方、Bash(rm -rf *) のようにパターンを指定すると、そのパターンに一致する呼び出しだけがブロックされます。

.claude/settings.json と .claude/settings.local.json の使い分け

チーム共有の設定を .claude/settings.json に書く

プロジェクト全体のセキュリティルールや、チーム標準のツールコマンドは .claude/settings.json に記述します。このファイルはgitにコミットして全員に適用します。

{
  "permissions": {
    "allow": [
      "Bash(npm run *)",
      "Bash(npm test *)",
      "Bash(git status *)",
      "Bash(git diff *)",
      "Bash(git log *)"
    ],
    "deny": [
      "Bash(rm -rf *)",
      "Bash(git push --force *)",
      "Read(./.env)",
      "Read(./.env.*)"
    ]
  }
}

個人設定を .claude/settings.local.json に書く

デバッグ用の設定やUI設定など、個人の好みに関わるものは .claude/settings.local.json に記述します。このファイルはgitignoreされるため、チームには影響しません。

{
  "verbose": true,
  "theme": "dark",
  "permissions": {
    "allow": [
      "Bash(docker compose *)"
    ]
  }
}

設定をバージョン管理する

.claude/settings.json をコミットし、.claude/settings.local.json.gitignore に含まれていることを確認します。

git add .claude/settings.json
git commit -m "Claude Codeのチーム共有権限設定を追加"
設定の内容保存先理由
セキュリティルール(deny).claude/settings.jsonチーム全体で統一する
開発ツール許可(allow).claude/settings.jsonチームの標準ツールを共有する
個人のデバッグ設定.claude/settings.local.json他のメンバーに影響しない
個人の追加allow設定.claude/settings.local.json個人のワークフローに合わせる

よくある権限エラーとその対処法

1. 許可したはずのコマンドがブロックされる

症状: allowリストに追加したコマンドなのに、実行時にブロックされる。

原因: 別の設定レベルにdenyルールが存在する。deny > ask > allowの順で評価されるため、どこか1箇所でもdenyに設定されていれば実行できません。

対処法: /permissions コマンドで全レベルのルールを確認し、対象コマンドがdenyに含まれていないかチェックします。

/permissions

2. 複合コマンドで権限エラーが出る

症状: npm test && npm run build のような複合コマンドで権限エラーが表示される。

原因: Claude Codeは &&||;| で区切られた各サブコマンドを個別に評価します。すべてのサブコマンドがallowリストに含まれている必要があります。

対処法: 各コマンドを個別にallowリストに追加します。

{
  "permissions": {
    "allow": [
      "Bash(npm test *)",
      "Bash(npm run build *)"
    ]
  }
}

3. Read/Editの権限パターンが意図通りに動かない

症状: Read(./src/*) を許可したのに、src/components/Button.tsx の読み取りで確認が表示される。

原因: * は1つのディレクトリ内のファイルのみにマッチします。サブディレクトリを含めるには ** を使います。

対処法: ディレクトリ全体を対象にする場合は ** を使用します。

{
  "permissions": {
    "allow": [
      "Read(./src/**)",
      "Edit(./src/**)"
    ]
  }
}
設定の確認には /permissions を活用

現在の権限設定を一覧で確認するには、Claude Codeで /permissions コマンドを実行します。どのファイルからどのルールが読み込まれているかを確認でき、問題の原因特定に役立ちます。

まとめ

  • 権限設定は settings.jsonpermissions セクションで管理する
  • allowリストで安全なコマンドを自動許可し、denyリストで危険な操作をブロックする
  • denyルールは他のすべてのルールより優先される
  • チーム共有の設定は .claude/settings.json に、個人設定は .claude/settings.local.json に分ける
  • /permissions コマンドで現在の権限設定を確認できる