# Claude Agent SDKの便利だけど知られていない機能
🌍 権限評価は5段階のパイプライン。どこで何が決まるか理解すれば、セキュリティ設計が格段にクリアになります。
フック、拒否ルール、権限モード、許可ルール、コールバックの順で厳密に評価されます。
📌 タイトル:5段階の権限評価順序
🔗 URL:
🧩 概要
Claude Agent SDKのツール使用権限は、5段階のパイプラインで評価されます。(1) フック:PreToolUseフックが最初に実行され、deny可能。ただしallowを返しても後続の評価はスキップされません。(2) 拒否ルール:disallowed_toolsで指定されたツールをチェック。ツール名のみの指定(例:"Bash")はコンテキストからツール定義ごと除去。スコープ付き(例:"Bash(rm *)")はbypassPermissionsでもブロック。(3) 権限モード:bypassPermissionsはここに到達したものをすべて承認。acceptEditsはファイル操作を承認。(4) 許可ルール:allowed_toolsに一致すれば承認。(5) canUseToolコールバック:上記で解決しなかった場合に呼ばれます。判定の優先順位はdeny > defer > ask > allowです。
🛠 使い方
```python
import asyncio
from claude_agent_sdk import (
ClaudeSDKClient,
ClaudeAgentOptions,
HookMatcher,
)
# Stage 1: フックで特定操作をブロック
async def block_dangerous_commands(input_data, tool_use_id, context):
if input_data.get("tool_name") == "Bash":
command = input_data["tool_input"].get("command", "")
if "rm -rf" in command:
return {
"hookSpecificOutput": {
"hookEventName": input_data["hook_event_name"],
"permissionDecision": "deny",
"permissionDecisionReason": "rm -rf は禁止されています",
}
}
return {}
async def main():
options = ClaudeAgentOptions(
# Stage 1: フック
hooks={
"PreToolUse": [
HookMatcher(matcher="Bash", hooks=[block_dangerous_commands])
],
},
# Stage 2: 拒否ルール(ツール名のみ = コンテキストから完全除去)
disallowed_tools=["WebFetch"],
# Stage 3: 権限モード
permission_mode="acceptEdits", # ファイル操作を自動承認
# Stage 4: 許可ルール
allowed_tools=["Read", "Glob", "Grep", "Edit", "Write"],
)
# Stage 5: canUseToolは別途query()やClaudeSDKClientで設定可能
async with ClaudeSDKClient(options=options) as client:
await client.query("コードを改善して")
async for message in client.receive_response():
print(message)
```
ロックダウン構成の例:
```python
# 最小権限の原則:許可したツールのみ、それ以外は即拒否
options = ClaudeAgentOptions(
allowed_tools=["Read", "Glob", "Grep"],
permission_mode="dontAsk", # 未許可ツールはプロンプトなしで拒否
)
```
🏗 本番システムへの組み込み方
・allowed_toolsはbypassPermissionsを制約しません。allowed_toolsに"Read"だけ指定しても、bypassPermissionsではすべてのツールが承認されます
・特定ツールを完全にブロックするにはdisallowed_toolsを使用してください(bypassPermissionsでも有効)
・最小権限を実現するにはallowed_tools + permission_mode="dontAsk"の組み合わせが最適です
・フックのallowは「このフックとしてはOK」という意味であり、後続の拒否ルールやモード評価を上書きしません
💡 ユースケース
🔒 最小権限エージェント:Read/Glob/Grepのみ許可し、dontAskで他を即拒否
🛡 段階的信頼構築:defaultモードで開始し、レビュー後にacceptEditsに昇格
🚫 危険操作の排除:disallowed_toolsでBashを完全除去、またはBash(rm *)でスコープ付きブロック
🔍 監査付き承認:フックで全リクエストをログ記録しつつ、ルールベースで自動判定
⚠️ 注意点
・allowed_toolsに含まれないツールは「拒否」ではなく「未解決」として次の段階に進みます
・disallowed_toolsでツール名のみを指定すると、ツール定義がコンテキストから除去され、エージェントはそのツールの存在自体を認識しなくなります
・bypassPermissionsはサブエージェントにも継承されます。サブエージェントは異なるシステムプロンプトを持つ可能性があるため、注意が必要です
・複数のフックが同じイベントに登録されている場合、最も厳しい判定が採用されます
✨ 5段階の権限パイプラインを理解して、堅牢なセキュリティ設計を実現しましょう!
#
ClaudeAgentSDK# #
AIAgent#