Zum Inhalt springen

Claude Code Hooks & Enforcement (der PEP)

Claude Code anbinden verdrahtet die Beobachtungs-Hälfte — OTLP-Telemetrie hinein, Access-Edges heraus. Diese Seite ist die Governance-Hälfte: Die Hooks von Claude Code melden Tool-Entscheidungen an den Connector, und ein optionaler Policy Enforcement Point (PEP) macht aus diesem Kanal ein Gate — der Connector beantwortet einen passenden PreToolUse- / PermissionRequest-Hook mit einer permissionDecision von deny oder ask und erfasst jedes Gate als Finding.

Die Voreinstellung ist bewusst read-first: Ohne konfigurierte Enforcement-Policy werden Hooks beobachtet, niemals gegated. Enforcement ist ein benanntes, explizites Opt-in, und eine ungültige Policy schlägt beim Start fehl — der Connector läuft nicht stillschweigend ungoverned weiter.

Der OTLP/HTTP-Empfänger des Connectors (Loopback 127.0.0.1:4318 standardmäßig) bedient unter hook_path (Default /hooks) auch den Hook-Endpunkt. Auf der Entwicklermaschine postet die Hook-Konfiguration von Claude Code ihre Hook-Events an diesen Loopback-Endpunkt — die exakte Syntax der Hook-Einstellungen gehört in die Dokumentation von Claude Code selbst; was dieses Produkt besitzt, sind der Empfänger und die folgende Policy.

Hook-Events und OTLP-Telemetrie über denselben Tool-Aufruf werden korreliert (das correlation_window, Default 5s, hält eine Seite wartend auf die andere), sodass eine gegatete Aktion und ihre Telemetrie als eine kohärente Geschichte landen, nicht als zwei getrennte Datensätze. Eine Session, die weiterhin hookt, aber über silence_threshold (Default 2m) hinaus OTLP-stumm bleibt, wird als Telemetrie-Lücke markiert — das Anti-Evasion-Signal.

Füge eine enforcement-Policy zur Config der Quelle hinzu (OLIVARES_SOURCES_CONFIG):

{
"sources": [{
"name": "claude",
"kind": "claude",
"tenant": "<tenant-id>",
"config": {
"enforcement": "{\"rules\":[{\"tool\":\"Bash\",\"decision\":\"ask\",\"reason\":\"shell needs a human\"},{\"resource_kind\":\"file\",\"mode\":\"write\",\"decision\":\"deny\"}]}"
}
}]
}

Regeln matchen auf den Tool-Namen und/oder die Ressourcenart und den Zugriffsmodus; die Entscheidung ist deny oder ask (Eskalation an den Menschen in der Session). Passende PreToolUse- / PermissionRequest-Hooks erhalten diese Entscheidung als permissionDecision von Claude Code zurück; alles andere wird beobachtet durchgereicht. Jedes Gate wird als Finding erfasst, sodass der Enforcement-Verlauf abfragbar ist, nicht Folklore.

Enforcement am Hook ist eine Schicht. Die flottenweite Schicht ist die Datei mit den Managed Settings von Claude Code, die die Quelle managed-settings schreibgeschützt beobachtet:

{
"sources": [{
"name": "fleet-policy",
"kind": "managed-settings",
"tenant": "<tenant-id>",
"config": {
"config_path": "/etc/claude-code/managed-settings.json",
"expected_policy": "{…governance-authored intent…}"
}
}]
}
SchlüsselDefaultBedeutung
config_path/etc/claude-code/managed-settings.json (Linux)die aktive Managed-Settings-Datei des Hosts (macOS: /Library/Application Support/ClaudeCode/…)
scopeOS-HostnameAttributions-Scope (Host-ID / Distributionsname)
expected_policyoptionale verfasste Absicht; ist sie gesetzt, meldet der Connector Drift (permitted-Policy vs. observed-Config). Leer = nur beobachten

Verwandte optionale Beobachter auf der claude-Quelle: managed_mcp_path (modelliert die Eval-Reihenfolge der Managed-MCP-Allowlist und markiert Name-only-Allow-Einträge) und sandbox_path (Posture-Findings zu den Sandbox-Lockdown-Einstellungen) — beide schreibgeschützt, beide aus, bis sie auf eine Datei gerichtet werden.

Claude Code Governance ist die Authoring- und Truth-Loop-Oberfläche: die Policy, die du beabsichtigst, die Konfiguration, die Hosts tatsächlich tragen, und der Drift dazwischen. Gates und Telemetrie-Lücken-Findings landen in Security; die Session selbst bleibt in Sessions sichtbar:

Die Claude-Code-Governance-Ansicht — Policy-Authoring und Flotten-Posture an einem Ort. Die Claude-Code-Governance-Ansicht — Policy-Authoring und Flotten-Posture an einem Ort.
  • Der PEP gated, was Hooks melden. Ein Host, dessen Hooks nicht konfiguriert sind, wird nicht gegated — paare die Flotte mit dem Managed-Settings-Beobachter, damit Abwesenheit sichtbar ist, und mit dem Kernel-Backstop, damit sie nicht blind ist.
  • ask verweist auf einen Menschen in der Session — es ist Reibung, kein Schloss. deny ist das Schloss.
  • Subprozesse sind hier außerhalb des Scopes (Hooks feuern für die eigenen Tool-Aufrufe von Claude Code); siehe die Enterprise-OTel-Seite dazu, was die Telemetrie-Umgebung erreicht und was nicht.