Mit den Berechtigungsregeln von Claude Code kannst du allow- / ask- / deny-Einträge in der settings.json schreiben, um feingranular festzulegen, welche Tools, Befehle, Dateien und Domains ohne Rückfrage laufen, jedes Mal nachfragen oder verboten sind. Sie lassen sich im Team teilen, sodass du gefährliche Aktionen sicher blockierst, während sichere Routinearbeit ungestört durchläuft.

Dieser Leitfaden behandelt, was Berechtigungsregeln sind (und wie sie sich von Berechtigungsmodi unterscheiden), die allow/ask/deny-Reihenfolge, die Regelsyntax, die settings.json-Hierarchie sowie praktische Rezepte — alles auf Basis der offiziellen Spezifikation.

CLAUDE CODE · BERECHTIGUNGSREGELN

Feingranulare Kontrolle mit allow / ask / deny

Ausgewertet als deny → ask → allow (erster Treffer gewinnt)

deny

Verboten (gewinnt über alles)

ask

Jedes Mal nachfragen

allow

Ohne Rückfrage ausführen

1. Was Berechtigungsregeln sind (vs. Modi)

Claude Code verwendet ein gestuftes Berechtigungssystem. Lesevorgänge (Dateiansichten, Grep usw.) brauchen keine Freigabe; Bash-Befehle und Dateibearbeitungen schon — und zusätzlich zu diesem Grundverhalten kannst du mit Regeln feingranulare Ausnahmen festlegen (Quelle: offizielles „Configure permissions" von Claude Code).

Regeln werden leicht mit Berechtigungsmodi verwechselt. Modi sind das grobe Grundverhalten „wie oft wird gefragt" (default/acceptEdits/auto usw.); Regeln sind Festlegungen pro Tool und pro Befehl. Sie wirken zusammen — der Modus legt das Grundverhalten fest, und Regeln überschreiben es mit „immer erlauben" oder „nie erlauben".

💡 Regeln werden von Claude Code durchgesetzt, nicht vom Modell. Dein Prompt oder deine CLAUDE.md beeinflussen, was Claude zu tun versucht, aber nicht, was erlaubt ist. Erteile oder entziehe Zugriff über /permissions, Regeln, Modi oder einen PreToolUse-Hook.

2. allow / ask / deny und die Reihenfolge

Es gibt drei Regeltypen. Der Befehl /permissions listet und bearbeitet sie (und zeigt an, aus welcher settings.json jede stammt).

ALLOW

Ohne Rückfrage ausführen

Das angegebene Tool bzw. der Befehl läuft ohne manuelle Freigabe.

ASK

Jedes Mal nachfragen

Fragt bei jeder Nutzung nach Bestätigung. Ein passendes ask fragt selbst dann nach, wenn auch ein weiter gefasstes allow zutrifft.

DENY

Verboten (höchste Priorität)

Blockiert das Tool. Schlägt jedes allow, und ein deny auf jeder Ebene gewinnt immer.

Regeln werden in der Reihenfolge deny → ask → allow ausgewertet. Der erste Treffer entscheidet über das Ergebnis, und die Spezifität einer Regel ändert die Reihenfolge nicht. Ein weit gefasstes Bash(aws *)-deny schlägt ein spezifischeres Bash(aws s3 ls)-allow. Der Punkt: ein deny kann keine Allowlist-Ausnahmen mitführen.

⚠️ Zwei deny-Formen verhalten sich unterschiedlich: ein bloßer Tool-Name wie Bash entfernt das Tool vollständig aus dem Kontext von Claude (Claude sieht es nie). Eine eingegrenzte Regel wie Bash(rm *) hält das Tool verfügbar und blockiert nur passende Aufrufe.

3. Regelsyntax (Tool(specifier))

Das Format lautet Tool (alles) oder Tool(specifier) (spezifisch). Jedes Tool hat seinen eigenen Specifier-Stil.

ToolBeispielBedeutung
BashBash(npm run *)Befehle, die mit npm run beginnen (abschließendes * = Wortgrenze)
Read / EditRead(./.env)Liest die .env im aktuellen Verzeichnis (Pfad im gitignore-Stil)
WebFetchWebFetch(domain:example.com)Abrufe an example.com
MCPmcp__github__get_*Die get_-Tools des github-Servers
AgentAgent(Explore)Der Explore-Subagent

Bash-Wildcards dürfen überall stehen. Bash(ls *) (Leerzeichen + *) passt auf ls -la, aber nicht auf lsof (Wortgrenze); Bash(ls*) (ohne Leerzeichen) passt auf beides. Ein abschließendes :* ist gleichbedeutend mit *.

// Sichere Befehle erlauben, git push verbieten
{
  "permissions": {
    "allow": [
      "Bash(npm run *)",
      "Bash(git commit *)"
    ],
    "deny": [
      "Bash(git push *)"
    ]
  }
}

Achte auf zusammengesetzte Befehle. Claude Code versteht Trennzeichen wie && || ; |, und jeder Teilbefehl muss eigenständig zutreffen. Bash(safe-cmd *) erlaubt nicht safe-cmd && rm -rf .. Beachte, dass schreibgeschützte Befehle (ls/cat/grep/find/pwd usw.) in jedem Modus ohne Rückfrage laufen und Wrapper wie timeout/nice/nohup vor dem Abgleich entfernt werden.

Read/Edit-Pfade folgen der gitignore-Semantik mit vier Ankern:

FormAnkerBeispiel
//pathDateisystem-absolutRead(//tmp/x)
~/pathHomeRead(~/.ssh/**)
/pathProjektwurzelEdit(/src/**)
path / ./pathAktuelles VerzeichnisRead(.env)

/Users/... ist NICHT absolut — es ist relativ zur Projektwurzel. Verwende //Users/... (doppelter Schrägstrich) für absolute Pfade. Read(.env) entspricht Read(**/.env) und passt auf jede .env darunter.

4. settings.json-Hierarchie und Vorrang

Regeln liegen in der settings.json. Es gibt mehrere Dateien, und höhere Ebenen sind stärker. Die zentrale Regel: ein deny auf jeder Ebene schlägt immer ein allow auf jeder anderen Ebene.

PrioritätOrtVerwendung
1 (am stärksten)Verwaltete EinstellungenOrganisationsrichtlinie. Kann von Nutzern/CLI nicht überschrieben werden
2KommandozeilenargumenteTemporäre Sitzungs-Überschreibungen
3.claude/settings.local.jsonPersönliche Projekteinstellungen (gitignored)
4.claude/settings.jsonGeteilte Projekteinstellungen (committet)
5~/.claude/settings.jsonNutzereinstellungen über alle Projekte hinweg
// .claude/settings.json (im Team geteilt)
{
  "permissions": {
    "defaultMode": "acceptEdits",
    "allow": ["Bash(npm run *)", "WebFetch(domain:docs.example.com)"],
    "deny": ["Read(.env)", "Read(**/secrets/**)", "Bash(git push *)"],
    "additionalDirectories": ["../shared-lib"]
  }
}

Der Standard-Berechtigungsmodus wird hier ebenfalls gesetzt, als defaultMode (Details zu Modi). Um außerhalb des Arbeitsverzeichnisses zu lesen/bearbeiten, füge Pfade zu additionalDirectories hinzu.

5. Praktische Rezepte

Häufige Kombinationen. Das Grundprinzip: Gefährliches sicher verbieten, sichere Routine erlauben, um sie zu automatisieren.

🔒 Geheime Dateien schützen

deny: ["Read(.env)", "Read(**/secrets/**)", "Read(~/.ssh/**)"]. Die Lesevorgänge rundheraus blockieren.

🚀 Riskante Aktionen stets bestätigen

ask: ["Bash(git push *)", "Bash(rm *)"]. Erzwingt eine Rückfrage selbst im auto-Modus.

⚡ Routinearbeit automatisieren

allow: ["Bash(npm run *)", "Bash(git commit *)"]. Tests/Builds/Commits laufen ungestört.

URLs über Bash-Argumentmuster einzuschränken ist fragil (curl http://github.com/ * lässt sich leicht über -X GET oder Variablenexpansion umgehen). Verbiete stattdessen curl/wget und erlaube bestimmte Domains mit WebFetch(domain:...). Für strengere Kontrolle validiere URLs in einem PreToolUse-Hook.

6. Stolperfallen und häufige Verwechslungen

  • Deny wird von Claude Code durchgesetzt, nicht vom Modell. „Lies das nicht" in deinem Prompt oder in CLAUDE.md zu schreiben hält es ohne Regel nicht auf.
  • Read/Edit-deny kann indirekten Zugriff nicht verhindern. Es gilt für die eingebauten Datei-Tools und cat/head/sed, aber nicht für ein Python- oder Node-Skript, das Dateien selbst öffnet. Für eine Durchsetzung auf Betriebssystemebene nutze zusätzlich Sandboxing.
  • Achte auf Umgebungs-Runner. devbox run *, npx und docker exec führen ihre Argumente als Befehl aus, sodass Bash(devbox run *) auch devbox run rm -rf . zulässt. Schreibe Regeln, die den inneren Befehl einschließen.
  • Hooks überschreiben keine Regeln. Ein PreToolUse-Hook kann Berechtigungen erweitern, aber deny/ask werden unabhängig davon ausgewertet, was der Hook zurückgibt (deny-zuerst bleibt unverändert).

※ Das Verhalten entspricht den offiziellen Claude-Code-Dokumenten (Configure permissions / Settings), Stand Juni 2026. Es kann sich ändern — prüfe die offiziellen Dokumente für den aktuellen Stand.

Zusammenfassung

Drei Kernaussagen zu den Berechtigungsregeln von Claude Code.

  • Was sie sind: allow/ask/deny in der settings.json, um pro Tool, Befehl, Datei und Domain zu erlauben/nachzufragen/zu verbieten. Modi legen das Grundverhalten fest; Regeln kümmern sich um die Details.
  • Vorrang: deny → ask → allow (erster Treffer gewinnt; Spezifität ist irrelevant). Ein deny auf jeder Ebene gewinnt immer. Ebenen: verwaltet > CLI > local > Projekt > Nutzer.
  • Syntax: Tool(specifier). Bash nutzt Wildcards (Leerzeichen + * ist eine Wortgrenze), Read/Edit nutzen Pfade im gitignore-Stil, WebFetch nutzt domain:. Zusammengesetzte Befehle erfordern, dass jeder Teilbefehl zutrifft.

„Gefährliches sicher blockieren, sichere Routine automatisieren" ist der Kern des Regeldesigns. Kombiniere es mit Berechtigungsmodi, Hooks und der effort-Einstellung, um Claude Code sicher und reibungslos zu betreiben.

FAQ

F. Wie unterscheiden sich Berechtigungsregeln von Modi?

A. Modi sind das grobe Grundverhalten der Bestätigung (default/acceptEdits/auto usw.); Regeln sind Festlegungen pro Tool und pro Befehl. Sie wirken zusammen, und Regeln überschreiben Modi (z. B. gelten ask/deny-Regeln auch im auto-Modus).

F. Ich habe es erlaubt — warum fragt es trotzdem nach?

A. Weil die Auswertung deny → ask → allow ist. Wenn ein separates ask (oder deny) ebenfalls auf den Aufruf passt, gewinnt es selbst über ein spezifischeres allow. Spezifität ändert die Reihenfolge nicht.

F. Wohin gehört die settings.json?

A. Im Team geteilt: .claude/settings.json (committet). Persönlich: .claude/settings.local.json (gitignored). Über alle Projekte hinweg: ~/.claude/settings.json. Für eine organisationsweite Durchsetzung nutze verwaltete Einstellungen (können nicht überschrieben werden).

F. Wie stelle ich sicher, dass .env nie gelesen wird?

A. Setze deny: ["Read(.env)", "Read(**/secrets/**)"]. Beachte, dass dies für die eingebauten Datei-Tools und cat-artige Befehle gilt, aber nicht für indirekte Lesevorgänge über ein Skript. Für eine Durchsetzung auf Betriebssystemebene aktiviere zusätzlich Sandboxing.

F. Kann ich URLs oder Dateien über Bash-Argumente einschränken?

A. Nicht zuverlässig. curl http://github.com/ * lässt sich leicht über Optionen oder Variablenexpansion umgehen. Für URL-Beschränkungen verbiete curl/wget und nutze WebFetch(domain:...), oder validiere in einem PreToolUse-Hook.