Claude Codeを使い始めてしばらくすると、デフォルトの権限設定に微妙な違和感を覚えることがあります。本番データベースが入ったディレクトリで作業していると「もしrmが暴走したら」という不安があるし、逆に制限をかけすぎると毎回の許可ダイアログが邪魔に感じる。
実はClaude Codeのツール権限は、かなり細かく制御できます。プロジェクトごとに許可・拒否するツールを設定でき、チームで共有する設定もsettings.jsonに書けばリポジトリで管理できます。実際に使っている権限設定のパターンを順番にご紹介します。
Claude Codeのツール権限モデルを理解する
Claude Codeが実行できる操作は大きく4つのカテゴリに分かれます。
- ファイル操作: 読み取り(Read)・書き込み(Write)・編集(Edit)
- Bash実行: シェルコマンドの実行(Bash)
- Web系: ブラウザ操作、URL取得
- MCP系: 外部MCPサーバーへのアクセス
デフォルトでは、ほとんどの操作が「許可を求める」状態になっています。--dangerously-skip-permissionsフラグで全操作を許可することもできるが、本番環境に近いディレクトリで使うのは避けるべきです。
allowedTools と disallowedTools の使い分け
コマンドラインフラグで一時的な権限設定ができます。
# 特定のツールのみ許可(ホワイトリスト方式)
claude --allowedTools "Read,Write,Edit,Bash(git status),Bash(git diff)"
# 特定のツールを禁止(ブラックリスト方式)
claude --disallowedTools "Bash(rm),Bash(sudo)"Bash(コマンド名)の形式でBashコマンドを個別に制御できるのが便利です。例えばBash(git status)とBash(git diff)だけを許可すれば、ファイルの読み取りと差分確認のみ許可する「読み取り専用」に近い状態になります。
ただし毎回フラグを打つのは面倒なので、日常的な設定はsettings.jsonに書いておくほうがいい。
settings.json によるプロジェクト別設定
.claude/settings.jsonを作成すると、そのディレクトリでclaudeを起動したとき自動的に読み込まれます。
// .claude/settings.json(プロジェクトルートに配置)
{
"permissions": {
"allow": [
"Read",
"Write",
"Edit",
"Bash(git *)",
"Bash(npm run *)",
"Bash(npx *)",
"Bash(echo *)",
"Bash(cat *)",
"Bash(ls *)",
"Bash(grep *)",
"Bash(find *)"
],
"deny": [
"Bash(rm -rf *)",
"Bash(sudo *)",
"Bash(curl *)",
"Bash(wget *)"
]
}
}ワイルドカード*が使える点が便利です。Bash(git *)と書けばすべてのgitコマンドを許可できます。この設定をリポジトリにコミットしておけば、チームメンバーがgit cloneしてすぐに適切な権限でClaude Codeを使い始められます。
実際に使っているプロジェクト別設定パターン
フロントエンド開発プロジェクトでは、ネットワーク系コマンドを制限しています。
{
"permissions": {
"allow": [
"Read", "Write", "Edit",
"Bash(git *)", "Bash(npm *)", "Bash(npx *)",
"Bash(node *)", "Bash(ts-node *)"
],
"deny": [
"Bash(curl *)", "Bash(wget *)",
"Bash(ssh *)", "Bash(scp *)"
]
}
}バックエンドAPI開発では、データベース操作コマンドに気をつけています。
{
"permissions": {
"allow": [
"Read", "Write", "Edit",
"Bash(git *)", "Bash(go *)", "Bash(make *)",
"Bash(docker-compose up *)", "Bash(docker-compose down)"
],
"deny": [
"Bash(psql -c DROP *)",
"Bash(redis-cli FLUSHALL)",
"Bash(rm -rf /var/lib/*)"
]
}
}コードレビューのみの用途(読み取り専用)は以下のようにシンプルにできます。
{
"permissions": {
"allow": [
"Read",
"Bash(git log *)", "Bash(git diff *)", "Bash(git status)",
"Bash(cat *)", "Bash(ls *)", "Bash(grep *)"
],
"deny": ["Write", "Edit", "Bash(*)"]
}
}グローバル設定と組み合わせる
ユーザーホームディレクトリの~/.claude/settings.jsonにはグローバルな設定を書ける。ここにはすべてのプロジェクトで禁止したい操作を定義しておくと安心です。
// ~/.claude/settings.json
{
"permissions": {
"deny": [
"Bash(rm -rf /)",
"Bash(sudo rm -rf *)",
"Bash(format *)",
"Bash(dd if=*)"
]
}
}設定の優先順位はプロジェクトの.claude/settings.json > ユーザーの~/.claude/settings.json > デフォルトの順番です。プロジェクト設定がグローバル設定を上書きするが、deny設定はマージされる(どちらかで拒否されていれば拒否される)。
Claude Codeのセッション中に権限を確認する
現在有効な権限設定は、セッション中に確認できます。
# Claude Codeを起動してから
/permissionsこのスラッシュコマンドで現在許可・拒否されているツールの一覧が表示されます。設定が期待通りに反映されているか確認したいときに便利です。
権限設定でよくある失敗
ワイルドカードの誤用:Bash(git *)はスペース込みのコマンドにマッチします。Bash(git commit -m "メッセージ")も許可されます。コミットメッセージの内容までは制御できないので、そこまで厳密に制御したい場合はBash(git commit *)を拒否リストに入れる必要があります。
deny設定でブロックできないケース:シェルスクリプト経由でコマンドが実行される場合、Bash(スクリプト名.sh)は許可されていても、スクリプト内のrm -rfはdenyリストでブロックできないことがあります。スクリプト実行自体を慎重に扱うべきです。
MCP権限の別管理:MCPサーバーへのアクセスはallowedToolsのBash系とは別に管理されます。MCPツールを特定のプロジェクトでのみ有効化したい場合は、settings.jsonのmcpServersセクションで制御します。
今の設定を洗い直してみると、案外デフォルトから変えられていない部分が多いかもしれません。プロジェクトの性質に合わせた権限設定を一度整えておくと、「もし暴走したら」という漠然とした不安が減って、Claude Codeをより積極的に活用できるようになります。