Skip to content

原文(日本語に翻訳)

セッション中に設定ファイルが変更されたときに発火する ConfigChange フックイベントを追加しました。エンタープライズセキュリティ監査や設定変更のオプションブロックが可能になります。

原文(英語)

Added ConfigChange hook event that fires when configuration files change during a session, enabling enterprise security auditing and optional blocking of settings changes.

概要

新しい ConfigChange フックイベントにより、Claude Codeセッション中に設定ファイルが変更されたときにカスタムスクリプトを実行できるようになりました。エンタープライズ環境でのセキュリティ監査、設定変更のログ記録、不正な設定変更のブロックなどに活用できます。変更をブロックするかどうかを制御することも可能です。

基本的な使い方

settings.jsonhooks セクションに ConfigChange イベントを追加します。

json
// .claude/settings.json
{
  "hooks": {
    "ConfigChange": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "echo '設定が変更されました' >> /var/log/claude-config-changes.log"
          }
        ]
      }
    ]
  }
}

実践例

ユースケース1: 設定変更のセキュリティ監査ログ

すべての設定変更を監査ログに記録する場合。

json
// .claude/settings.json
{
  "hooks": {
    "ConfigChange": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "python3 /usr/local/bin/audit-config-change.py"
          }
        ]
      }
    ]
  }
}
python
# /usr/local/bin/audit-config-change.py
import sys
import json
import datetime

# フックからの入力を読み込む
event_data = json.load(sys.stdin)

log_entry = {
    "timestamp": datetime.datetime.utcnow().isoformat(),
    "event": "ConfigChange",
    "session_id": event_data.get("session_id"),
    "changed_file": event_data.get("file"),
    "changes": event_data.get("changes")
}

with open("/var/log/claude-security-audit.log", "a") as f:
    f.write(json.dumps(log_entry) + "\n")

print(f"監査ログに記録: {log_entry['changed_file']}", file=sys.stderr)

ユースケース2: 設定変更のブロック

特定の設定変更を禁止する場合(エンタープライズポリシー)。

json
// .claude/settings.json
{
  "hooks": {
    "ConfigChange": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "python3 /usr/local/bin/enforce-config-policy.py"
          }
        ]
      }
    ]
  }
}
python
# /usr/local/bin/enforce-config-policy.py
import sys
import json

event_data = json.load(sys.stdin)
changes = event_data.get("changes", {})

# 禁止されている設定変更をチェック
BLOCKED_SETTINGS = [
    "disableAllHooks",
    "permissions.allow",
]

for setting in BLOCKED_SETTINGS:
    if setting in str(changes):
        # 終了コード 2 でブロック
        print(json.dumps({
            "decision": "block",
            "reason": f"セキュリティポリシーにより '{setting}' の変更は禁止されています"
        }))
        sys.exit(2)

# 変更を許可
print(json.dumps({"decision": "allow"}))

ユースケース3: 設定変更の通知

設定が変更されたときにSlackやメールで通知する場合。

json
// .claude/settings.json
{
  "hooks": {
    "ConfigChange": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "bash /usr/local/bin/notify-config-change.sh"
          }
        ]
      }
    ]
  }
}
bash
#!/bin/bash
# /usr/local/bin/notify-config-change.sh

EVENT_DATA=$(cat)
CHANGED_FILE=$(echo "$EVENT_DATA" | python3 -c "import sys, json; print(json.load(sys.stdin).get('file', 'unknown'))")

# Slack通知
curl -X POST "$SLACK_WEBHOOK_URL" \
  -H "Content-Type: application/json" \
  -d "{\"text\": \"⚠️ Claude Code設定変更: $CHANGED_FILE\"}"

注意点

  • ConfigChange フックはセッション中に設定ファイルが変更されたときのみ発火します。起動時の設定読み込みでは発火しません。
  • フックが終了コード2を返すと変更がブロックされます。ただし、disableAllHooks でブロックを無効化することはできなくなりました(v2.1.49で修正)。
  • 管理された設定(マネージド設定)の変更をブロックする場合は、適切な権限管理と組み合わせてください。
  • フックスクリプトが重い処理を行う場合、設定変更のレスポンスが遅くなる可能性があります。
  • フックイベントのデータ形式については公式ドキュメントを参照してください。

関連情報