Claude Code権限設計入門|–allowed-tools・–disallowed-toolsで安全な自動化を実現する

Claude Codeは便利ですが、自動化パイプラインで「READMEを生成するつもりがソースコードを書き換えられた」「知らないうちに危険なコマンドが走っていた」となったら大惨事です。本記事では --allowed-tools--disallowed-tools--permission-mode を使い、Claude Codeに「やっていいこと」と「やってはいけないこと」を明確に指定する方法を解説します。最小権限の原則を適用し、安全なパイプラインを設計しましょう。

前提知識

Claude Code CLI の printモード(claude -p)を使った実行と、--output-format json による構造化出力が取得できることを前提とします。--effort--max-budget-usd によるコスト制御の基本を知っていると、よりスムーズに読み進められます。

前提知識について詳しく知りたい人は、以下の記事を参考にしてください。

Claude Codeの「ツール」とは

Claude Codeは、タスクを遂行するために「ツール」と呼ばれる機能群を使います。

  • ファイル読み取り(Read): コードファイルの内容を読む
  • ファイル書き込み(Write / Edit): ファイルの作成・編集
  • シェルコマンド実行(Bash): bash コマンドの実行
  • Web検索: 情報の検索
  • Git操作: コミット、diff確認など
  • etc…

自動化パイプラインでは、これらのツールを無制限に使わせると以下のリスクがあります。

  1. 意図しないファイルの変更
  2. 危険なコマンドの実行
  3. 機密情報(.env ファイルなど)へのアクセス

権限制御オプションの全体像

オプション説明方向性
--tools利用可能なツール集合全体を置き換えホワイトリスト
--allowed-tools特定ツールを明示的に許可(追加)ホワイトリスト
--disallowed-tools特定ツールを明示的に禁止ブラックリスト
--permission-mode権限モードの設定ポリシー
--dangerously-skip-permissions全権限確認をバイパス全開放(危険)

–disallowed-tools で危険なツールを禁止する

README生成パイプラインでは、ファイルの「読み取り」は必要ですが、「書き込み」は不要です(書き込みはシェルスクリプト側で行うため)。

claude -p "解析して概要を教えてください" --disallowed-tools "Write,Edit,Bash" --output-format json | jq -r '.result'

禁止されたツールを使おうとした場合、Claudeは禁止されたツールを使えないことを認識し、代替手段(コードの提示)で対応します。

例:

ファイルの編集権限がないため、直接コードを修正することはできません。
以下のコードを手動で追加してください:

def subtract(a: int, b: int) -> int:
    """2つの数値を減算する"""
    return a - b

–allowed-tools でホワイトリスト制御する

より厳格に、許可するツールだけを指定する方法です。

読み取り権限しか必要ないため、–allowed-toolsにReadを指定します。

claude -p "コード構造を分析してください"  --allowed-tools "Read" --output-format json | jq -r '.result'

–tools との違い

3つのオプションは混同しやすいので、整理しておきます。

# --tools: 指定したツールだけが利用可能(集合全体を置き換え)
claude -p "テスト" --tools "Read"

# --allowed-tools: デフォルトツール + 指定ツールを許可
claude -p "テスト" --allowed-tools "Read"

# --disallowed-tools: デフォルトツール - 指定ツールを禁止
claude -p "テスト" --disallowed-tools "Write,Edit"

パイプラインでは、意図が明確な --disallowed-tools が最も分かりやすい場合が多いです。

–dangerously-skip-permissions の危険性

--dangerously-skip-permissions は、すべての権限確認をバイパスするオプションです。

絶対にローカル開発環境では使わないでください。 このオプションが許されるのは、隔離されたコンテナ環境(Docker、CI/CDのサンドボックス)だけです。

# GitHub Actions での例(Dockerコンテナ内なら許容される)
- name: Generate README
  run: |
    claude -p "README.mdを生成してください" 
      --dangerously-skip-permissions 
      --allow-dangerously-skip-permissions 
      --no-session-persistence

コンテナ環境なら、仮に破壊的操作が行われてもホストに影響しません。

実践:セキュリティを組み込んだパイプライン

権限制御を組み込んだREADME生成パイプラインの例です。

#!/bin/bash
set -euo pipefail

SESSION_ID=$(uuidgen | tr '[:upper:]' '[:lower:]')

# セキュリティポリシー:
# - ファイル書き込み禁止(README生成はスクリプト側で実行)
# - シェルコマンド実行禁止(不要な操作を防止)
SECURITY_OPTS="--disallowed-tools Write,Edit,Bash"

# Phase 1: ファイル構造の把握(読み取りのみ)
phase1=$(claude -p "ファイル一覧と役割をリストアップ" 
  --session-id "$SESSION_ID" 
  --effort low 
  --output-format json 
  --max-budget-usd 0.02 
  $SECURITY_OPTS)

# Phase 2: コード解析(読み取りのみ)
phase2=$(claude -p --resume "$SESSION_ID" 
  "各ファイルのコードを詳細に分析" 
  --effort medium 
  --output-format json 
  --max-budget-usd 0.05 
  $SECURITY_OPTS)

# Phase 3: 構造化出力(読み取りのみ)
phase3=$(claude -p --resume "$SESSION_ID" 
  "README用情報をJSON形式で出力" 
  --effort high 
  --output-format json 
  --max-budget-usd 0.10 
  --fallback-model claude-haiku-4-20250414 
  $SECURITY_OPTS)

# Phase 4: README組み立て(スクリプト側で実行 - Claudeは関与しない)
readme_json=$(echo "$phase3" | jq -r '.result')

設計のポイント:

  • Claudeはコードの「読み取り」と「分析」だけを担当
  • ファイルの書き込みはシェルスクリプト側で制御
  • Claudeが意図しないファイル変更を行うリスクをゼロにしている

次に試してみよう

以下の3つのユースケースで最適な権限設定を設計してみてください。

(1) コードレビュー(読み取りのみ)
(2) バグ修正(読み書き可能、コマンド実行不可)
(3) テスト実行(読み取り+コマンド実行、書き込み不可)。

まとめ

  • Claude Codeはファイル読み書き、コマンド実行などの「ツール」を使ってタスクを遂行する
  • --disallowed-tools で不要なツールを禁止し、最小権限の原則を適用できる
  • --allowed-tools でホワイトリスト方式の厳格な制御も可能
  • --dangerously-skip-permissions は隔離環境でのみ使用し、ローカル環境では絶対に使わない
  • パイプラインではClaudeを「読み取り・分析」に限定し、ファイル書き込みはスクリプト側で行うのがベストプラクティス

さらに深く学びたい方へ
Claude Codeの Skills・MCP・Agent・Hooks・Plugin を体系的に学べる有料教材を Zenn で公開しています。
Claude Code 実践ガイド(Zenn Book)