Das Bash-Tool in der Sandbox konfigurieren
Beschränken Sie mit der integrierten Sandbox, auf welche Dateien und Netzwerk-Hosts die Shell-Befehle von Claude Code zugreifen können. Aktivieren Sie sie, legen Sie die Grenze fest und beheben Sie, was dadurch nicht mehr funktioniert.
Die Bash-Sandbox ist eine Grenze, die das Betriebssystem um die Shell-Befehle durchsetzt, die Claude auf Ihrem Rechner ausführt. Sie legen fest, auf welche Dateien und Netzwerkdomänen diese Befehle zugreifen können, und die Beschränkungen gelten für Bash-, PowerShell- und Monitor-Befehle sowie für die Prozesse, die diese starten. Da das Betriebssystem die Beschränkungen während der Ausführung eines Befehls anwendet, kann Claude Code Befehle in der Sandbox ausführen, ohne Sie zu fragen, ob Sie jeden einzelnen genehmigen.
Die Sandbox umfasst nur Shell-Befehle. Die Datei-Tools von Claude, MCP-Server und Hooks laufen außerhalb davon.
Die Sandbox läuft unter macOS, Linux und WSL2. Unter nativem Windows führt Claude Code Befehle ohne Sandbox aus. Um die Sandbox auf einem Windows-Rechner zu verwenden, führen Sie Claude Code innerhalb einer WSL2-Distribution aus.
Diese Seite behandelt die Sandbox um Shell-Befehle auf Ihrem eigenen Rechner. Andere Seiten behandeln verwandte Fragen:
- Wie eine Cloud-Sitzung isoliert wird, erfahren Sie unter Sicherheit und Isolation
- Um andere Isolationsansätze wie Dev-Container, benutzerdefinierte Container und virtuelle Maschinen zu vergleichen, siehe Sandbox-Umgebungen
- Um Berechtigungsabfragen für andere Tools als Bash zu reduzieren, siehe Berechtigungsmodi
Was die Sandbox einschränkt
Solange die Sandbox aktiviert ist, starten die Shell-Befehle, die Claude ausführt, innerhalb ihrer Grenzen, ebenso wie die Prozesse, die diese Befehle starten. Die Sandbox ist standardmäßig deaktiviert. Um sie zu aktivieren, führen Sie /sandbox in einer Sitzung aus, wie unter Erste Schritte gezeigt, oder setzen Sie sandbox.enabled in einer Einstellungsdatei wie ~/.claude/settings.json auf true.
Die Tabelle zeigt, worauf ein in der Sandbox ausgeführter Befehl standardmäßig zugreifen kann, und welche Einstellungen den jeweiligen Standard ändern.
| Zugriff | Standard | Ändern mit |
|---|---|---|
| Schreiben | Das Arbeitsverzeichnis, ein benutzerspezifisches temporäres Verzeichnis und von Ihnen hinzugefügte Verzeichnisse. Geschützte Pfade bleiben für Schreibzugriffe gesperrt | filesystem.allowWrite, filesystem.denyWrite |
| Lesen | Der Großteil des Rechners, einschließlich Dateien mit Anmeldedaten wie ~/.ssh und ~/.aws/credentials |
filesystem.denyRead, credentials |
| Netzwerk | Keine direkte Verbindung nach außen. Verbindungen laufen über einen Proxy auf Ihrem Rechner, der jeden Host mit Ihren erlaubten Domains abgleicht, die zunächst leer sind. Ihr Berechtigungsmodus entscheidet, was mit anderen Hosts geschieht | network.allowedDomains, network.deniedDomains |
| Umgebungsvariablen | Von Claude Code übernommen, einschließlich aller Secrets in dessen Umgebung | credentials, CLAUDE_CODE_SUBPROCESS_ENV_SCRUB |
Claude Code baut die Sandbox auf dem Open-Source-Paket @anthropic-ai/sandbox-runtime auf.
Was außerhalb der Sandbox läuft
Die Sandbox umschließt Shell-Befehle. Diese Tools und Prozesse laufen außerhalb davon:
- Integrierte Datei- und Web-Tools: Tools wie Read, Edit, Write, WebFetch und WebSearch folgen stattdessen Berechtigungsregeln. Ein
denyRead-Eintrag hält das Read-Tool nicht auf, undallowedDomainsschränkt WebFetch nicht ein - Andere Prozesse, die Claude Code startet: Befehls-Hooks, lokale MCP-Server, Plugin-Monitore, LSP-Server und Hilfsbefehle wie Ihr Statuszeilen-Befehl und
apiKeyHelperlaufen mit Ihrem vollen Zugriff
Einige Shell-Befehle laufen je nach Ihren Einstellungen ebenfalls außerhalb der Sandbox:
- Befehle, die Sie selbst eingeben: Ein Befehl, den Sie an der
!-Eingabeaufforderung im Shell-Modus eingeben, läuft in den meisten Sitzungen ohne Sandbox. Unter Strikter Sandbox-Modus sind die Sitzungen aufgeführt, in denen ein von Ihnen eingegebener Befehl in der Sandbox läuft - Ausgenommene Befehle: Befehle, die mit
excludedCommandsübereinstimmen, laufen ohne Sandbox - Wiederholungsversuche ohne Sandbox: Claude kann darum bitten, einen Befehl ohne Sandbox auszuführen, in der Regel nachdem er in der Sandbox fehlgeschlagen ist
Um die Tools, Prozesse und Befehle aus diesem Abschnitt hinter eine gemeinsame Grenze zu stellen, führen Sie den Claude-Code-Prozess selbst in einem Container, einer virtuellen Maschine oder der Sandbox-Runtime aus.
Erste Schritte
Die Sandbox ist in Claude Code integriert. Was Sie installieren müssen, hängt von Ihrer Plattform ab:
- macOS: Das Sandboxing verwendet das integrierte Seatbelt-Framework, sodass Sie direkt mit den Schritten beginnen können
- Linux und WSL2: Die Sandbox benötigt
bubblewrapundsocat, wie unter Linux und WSL2 einrichten beschrieben. Auch wenn Sie diese noch nicht installiert haben, können Sie mit/sandboxbeginnen, da dessen Panel anzeigt, ob etwas fehlt
/sandbox ausführen
Starten Sie eine Claude Code-Sitzung und führen Sie den Befehl /sandbox aus:
/sandbox
Dadurch wird das Sandbox-Panel mit drei Tabs geöffnet, unter Linux zusätzlich mit einem Tab „Dependencies“, wenn der optionale seccomp-Filter fehlt:
- Mode: Legen Sie fest, wie Befehle in der Sandbox genehmigt werden; dies wird im nächsten Schritt beschrieben
- Overrides: Legen Sie fest, ob Befehle, die in der Sandbox fehlschlagen, ersatzweise außerhalb der Sandbox ausgeführt werden dürfen. Dies ist die Einstellung
allowUnsandboxedCommands - Config: Zeigen Sie die aufgelösten Sandbox-Einstellungen an
Wenn das Panel nur einen Tab „Dependencies“ anzeigt, fehlt ein erforderliches Paket. Installieren Sie es wie unter Linux und WSL2 einrichten beschrieben, starten Sie Claude Code neu und führen Sie /sandbox erneut aus.
Einen Modus wählen
Wählen Sie im Tab „Mode“ entweder Auto-Allow oder reguläre Berechtigungen. Auto-Allow führt Befehle in der Sandbox ohne Nachfrage aus, während reguläre Berechtigungen die üblichen Berechtigungsabfragen beibehält, auch wenn Befehle in der Sandbox ausgeführt werden. Unter Sandbox-Modi erfahren Sie, bei welchen Befehlen im Auto-Allow-Modus dennoch nachgefragt wird.
Einen Bash-Befehl ausführen
Bitten Sie Claude, einen Befehl auszuführen, etwa einen Build oder eine Testsuite. Standardmäßig können Befehle innerhalb der Sandbox in das Arbeitsverzeichnis, ein benutzerspezifisches temporäres Verzeichnis und alle Verzeichnisse schreiben, die Sie mit --add-dir, /add-dir oder permissions.additionalDirectories hinzugefügt haben.
Wenn ein Befehl zum ersten Mal eine neue Netzwerkdomain benötigt, bittet Claude Code um Genehmigung; im Auto-Modus gibt Claude stattdessen die Hosts, die ein Befehl benötigt, direkt am Befehl an, damit der Klassifikator sie zusammen mit ihm prüft.
Wie Sie erweitern oder einschränken, was die Sandbox zulässt, erfahren Sie unter Sandboxing konfigurieren.
Wenn Befehle in der Sandbox innerhalb eines Containers mit Operation not permitted fehlschlagen, lesen Sie den Bubblewrap-Eintrag unter Fehlerbehebung.
Wenn Sie im Panel einen Modus auswählen, speichert Claude Code ihn in den lokalen Einstellungen Ihres Projekts unter .claude/settings.local.json, die für das aktuelle Projekt gelten. Claude Code fügt diese Datei Ihrer globalen gitignore hinzu, wenn es dort eine Einstellung speichert. Um die Sandbox für alle Ihre Projekte zu aktivieren, setzen Sie sandbox.enabled in Ihren Benutzereinstellungen unter ~/.claude/settings.json auf true. Um das Sandboxing für alle Entwickler einer Organisation durchzusetzen, verwenden Sie verwaltete Einstellungen.
Um die Sandbox für eine einzelne Sitzung zu ändern, ohne in eine Einstellungsdatei zu schreiben, starten Sie Claude Code mit --settings. Dieser Befehl startet beispielsweise eine Sitzung mit Sandbox, in der Claude einen blockierten Befehl nicht außerhalb der Sandbox erneut versuchen kann:
claude --settings '{"sandbox": {"enabled": true, "allowUnsandboxedCommands": false}}'
Wenn die Sandbox nicht starten kann, weil eine Abhängigkeit fehlt oder die Plattform nicht unterstützt wird, führt Claude Code Befehle standardmäßig ohne Sandboxing aus. Damit Claude Code stattdessen beim Start beendet wird, setzen Sie sandbox.failIfUnavailable auf true. Verwaltete Bereitstellungen, die Sandboxing als Sicherheitsvoraussetzung verlangen, können diese Einstellung verwenden.
Prüfen, ob Befehle in der Sandbox ausgeführt werden
Um zu prüfen, ob die Sandbox funktioniert, bitten Sie Claude, jede Zeile der Tabelle auszuführen. Was Sie an der !-Eingabeaufforderung eingeben, wird in der Regel außerhalb der Sandbox ausgeführt, daher testet es die Sandbox nicht, wenn Sie eine Zeile selbst eingeben.
| Befehl | Ergebnis innerhalb der Sandbox |
|---|---|
touch ~/sandbox-probe |
Schlägt unter macOS mit Operation not permitted fehl, unter Linux und WSL2 mit Read-only file system |
curl --noproxy '*' https://example.com |
Schlägt mit Could not resolve host fehl, da der Befehl keine Route am Sandbox-Proxy vorbei hat |
Wenn Claude anbietet, einen fehlgeschlagenen Befehl außerhalb der Sandbox erneut zu versuchen, lehnen Sie den Wiederholungsversuch ab. Wenn touch erfolgreich ist und Ihr Home-Verzeichnis nicht zu den Verzeichnissen gehört, in die Befehle in der Sandbox schreiben dürfen, löschen Sie ~/sandbox-probe. Führen Sie dann /sandbox aus, um zu prüfen, ob die Sandbox aktiviert ist und ihre Abhängigkeiten installiert sind.
Linux und WSL2 einrichten
Unter Linux und WSL2 benötigt die Sandbox diese Pakete:
bubblewrap: das unprivilegierte Sandboxing-Tool, das die Dateisystemisolation durchsetztsocat: das Relay, über das der Netzwerkverkehr durch den Sandbox-Proxy geleitet wird
Installieren Sie sie mit dem Paketmanager Ihrer Distribution:
sudo apt-get install bubblewrap socat
sudo dnf install bubblewrap socat
Wenn eine Abhängigkeit fehlt, listet der Tab „Dependencies“ in /sandbox auf, welche von ripgrep, bubblewrap, socat und dem seccomp-Filter auf Ihrer Plattform fehlen. Wenn Sie den Tab nach der Installation und einem Neustart von Claude Code nicht sehen, sind alle Abhängigkeiten vorhanden.
Ripgrep ist in der nativen Claude Code-Binärdatei enthalten. Der seccomp-Filter ist optional und ergänzt das Blockieren von Unix-Domain-Sockets. Installieren Sie ihn mit npm install -g @anthropic-ai/sandbox-runtime, falls er fehlt.
Wenn eine erforderliche Abhängigkeit fehlt, ist der Tab „Dependencies“ der einzige angezeigte Tab, bis Sie sie installieren. Wenn nur der optionale seccomp-Filter fehlt, erscheint der Tab „Dependencies“ neben den anderen Tabs. Die Abhängigkeitsprüfung läuft beim Start, starten Sie Claude Code daher nach der Installation von Paketen neu, damit /sandbox sie erkennt.
Um zu prüfen, ob Ihre Umgebung diese Einschränkung durchsetzt, auch innerhalb von WSL2, führen Sie `sysctl kernel.apparmor_restrict_unprivileged_userns` aus. Wenn der Befehl `0` zurückgibt, überspringen Sie diesen Schritt. Wenn er einen `No such file or directory`-Fehler ausgibt, existiert der Schlüssel nicht, und Sie können diesen Schritt überspringen. Wenn er `1` zurückgibt, fügen Sie ein AppArmor-Profil hinzu, das `bwrap` diese Fähigkeit gewährt:
```bash theme={null}
sudo tee /etc/apparmor.d/bwrap > /dev/null <<'EOF'
abi <abi/4.0>,
include <tunables/global>
profile bwrap /usr/bin/bwrap flags=(unconfined) {
userns,
include if exists <local/bwrap>
}
EOF
```
Das Profil gilt nur für `bwrap` selbst, nicht für die Befehle, die es innerhalb der Sandbox ausführt. Laden Sie AppArmor neu, um es anzuwenden:
```bash theme={null}
sudo systemctl reload apparmor
```
Hinweise zu WSL2
Prüfen Sie Ihre WSL-Version mit wsl -l -v in PowerShell. Wenn Sie Sandboxing requires WSL2 sehen, läuft Ihre Distribution unter WSL1. Aktualisieren Sie sie auf WSL2 oder führen Sie Claude Code ohne Sandboxing aus.
Unter WSL2 übergibt WSL den Start einer Windows-Binärdatei wie cmd.exe, powershell.exe oder von allem unter /mnt/c/ über einen Unix-Socket an den Windows-Host. Ob ein Befehl in der Sandbox eine solche Datei starten kann, richtet sich daher nach den Unix-Socket-Einstellungen der Sandbox: Der optionale seccomp-Filter muss installiert sein, damit der Socket überhaupt blockiert wird. Um diese Starts zu erlauben, setzen Sie allowAllUnixSockets, wodurch jeder Unix-Socket für Befehle in der Sandbox geöffnet wird.
Sandbox-Modi
Claude Code bietet zwei Sandbox-Modi. In beiden setzt die Sandbox dieselben Dateisystem- und Netzwerkeinschränkungen durch; der Unterschied besteht nur darin, ob Befehle in der Sandbox automatisch genehmigt werden oder eine ausdrückliche Berechtigung erfordern.
Auto-Allow-Modus
Claude Code genehmigt einen Befehl automatisch und ohne Nachfrage, wenn er innerhalb der Sandbox ausgeführt wird. Ein Befehl durchläuft den regulären Berechtigungsablauf, wenn er außerhalb der Sandbox ausgeführt wird, weil er auf excludedCommands passt oder weil Claude ihn ohne Sandbox erneut versucht.
Ein Befehl in der Sandbox, der eine Verbindung zu einem Host herstellt, den Sie nicht erlaubt haben, bleibt in der Sandbox. Unter Hosts außerhalb Ihrer erlaubten Domains erfahren Sie, wer entscheidet, ob die Verbindung zustande kommt.
Auch im Auto-Allow-Modus gilt weiterhin Folgendes:
- Ausdrückliche Verweigerungsregeln werden immer beachtet
rm- oderrmdir-Befehle, die auf einen kritischen Pfad zielen, durchlaufen weiterhin den regulären Berechtigungsablauf- Inhaltsbezogene Nachfrageregeln wie
Bash(git push *)erzwingen weiterhin eine Nachfrage, auch für Befehle in der Sandbox - Eine einfache
Bash-Nachfrageregel oder die gleichwertige FormBash(*)wird für Befehle, die in der Sandbox ausgeführt werden, übersprungen; sie gilt weiterhin für Befehle, die auf den regulären Berechtigungsablauf zurückfallen. Im Plan-Modus wird die Regel nicht übersprungen: Sie fragt auch bei Befehlen in der Sandbox nach, einschließlich nur lesender Befehle. Vor v2.1.212 galt das Überspringen auch im Plan-Modus
Der Auto-Allow-Modus funktioniert unabhängig von Ihrer Einstellung für den Berechtigungsmodus, mit drei Ausnahmen: dem Plan-Modus, einem Befehl im Auto-Modus mit befehlsspezifisch erlaubten Domains und der serverseitigen Prüfung durch den Klassifikator für Befehle in der Sandbox im Auto-Modus. Auch wenn Sie sich nicht im „accept edits“-Modus befinden, werden Bash-Befehle in der Sandbox automatisch ausgeführt, wenn Auto-Allow aktiviert ist. Das bedeutet, dass Bash-Befehle, die Dateien innerhalb der Sandbox-Grenzen ändern, ohne Nachfrage ausgeführt werden, selbst im Manual-Modus, in dem die Tools zur Dateibearbeitung nachfragen würden.
Im Plan-Modus erweitert Auto-Allow die Genehmigungen nicht; unter Plan-Modus erfahren Sie, wie Claude Code Befehle während der Planung kontrolliert. Vor v2.1.212 führte Auto-Allow Befehle in der Sandbox auch im Plan-Modus ohne Nachfrage aus.
Modus für reguläre Berechtigungen
Alle Bash-Befehle durchlaufen den regulären Berechtigungsablauf, auch wenn sie in der Sandbox ausgeführt werden. Dies bietet mehr Kontrolle, erfordert aber mehr Genehmigungen.
Der Ausweg über den Wiederholungsversuch ohne Sandbox
Der Wiederholungsversuch ohne Sandbox ist ein Ausweg für Befehle, die innerhalb der Sandbox fehlschlagen, etwa Tools, die nicht mit ihr kompatibel sind. Wenn die Sandbox eine Netzwerkverbindung blockiert, nennt Claude Code den abgelehnten Host im Ergebnis des Befehls, sodass Claude sieht, was blockiert wurde. Claude analysiert den Fehler und versucht den Befehl möglicherweise mit dem Parameter dangerouslyDisableSandbox erneut.
Der erneut versuchte Befehl wird ohne Sandbox ausgeführt. In einer interaktiven Terminal-Sitzung hängt es von Ihrem Berechtigungsmodus ab, wer ihn genehmigt:
bypassPermissions-Modus: Der Wiederholungsversuch wird ohne Nachfrage ausgeführt- Manual-Modus und
acceptEdits-Modus: Sie erhalten eine Berechtigungsabfrage mit dem Titel „Bash command (unsandboxed)“ - Auto-Modus: Ein separates Klassifikator-Modell bewertet den zugrunde liegenden Befehl
dontAsk-Modus: Claude Code lehnt den Wiederholungsversuch ab- Plan-Modus: Siehe wie Claude Code Befehle während der Planung kontrolliert
Diese Regeln und Einstellungen ändern, wer den Wiederholungsversuch genehmigt:
- Eine passende Erlaubnisregel: Wenn eine Erlaubnisregel wie
Bash(curl *)auf den Befehl passt, genehmigt sie auch den Wiederholungsversuch, sodass der Befehl ohne Nachfrage außerhalb der Sandbox ausgeführt wird - Eine Nachfrageregel für den Parameter: Fügen Sie eine Nachfrageregel für
Bash(dangerouslyDisableSandbox:true)hinzu, damit bei Bash-Wiederholungsversuchen nachgefragt wird. Sie erhalten die Nachfrage auch im Auto-Modus und imbypassPermissions-Modus, und die Regel hat Vorrang vor einer passenden Erlaubnisregel permissions.blockReadsOutsideWorkingDirectories: Unter Aktionen, die kein Modus automatisch genehmigt erfahren Sie, bei welchen Wiederholungsversuchen nachgefragt wird, solange diese Einstellung aktiv ist
Den Wiederholungsversuch mit dem strikten Sandbox-Modus deaktivieren
Sie können den Wiederholungsversuch ohne Sandbox deaktivieren, indem Sie in Ihren Sandbox-Einstellungen "allowUnsandboxedCommands": false setzen. Bei deaktiviertem Wiederholungsversuch ignoriert Claude Code den Parameter dangerouslyDisableSandbox. Solange die Sandbox läuft, werden die Befehle, die Claude ausführt, dann in der Sandbox ausgeführt, sofern sie nicht auf einen excludedCommands-Eintrag passen. Damit Claude Code keine Befehle ohne Sandbox ausführt, wenn die Sandbox nicht starten kann, setzen Sie zusätzlich failIfUnavailable. Der Tab Overrides in /sandbox zeigt diese Einstellung als Strict sandbox mode an.
Ein false in Ihren Benutzereinstellungen, in --settings oder in verwalteten Einstellungen bleibt bestehen, auch wenn die Einstellungen eines Projekts true setzen. Ein false in Ihren Benutzereinstellungen macht die Sandbox nicht administratorpflichtig, sodass die übrigen Sandbox-Einstellungen eines Projekts weiterhin gelten. Vor v2.1.285 überschrieb ein true eines Projekts ein false in Ihren Benutzereinstellungen.
Wenn Sie oder Ihr Administrator den Wiederholungsversuch in verwalteten Einstellungen oder mit dem Flag --settings deaktivieren, wird die Sandbox administratorpflichtig. Claude Code ignoriert dann die Einstellungen in den Dateien eines Repositorys, die die Sandbox lockern, einschließlich excludedCommands-Einträgen. Unter Repository-Einstellungen bei einer administratorpflichtigen Sandbox sind sie aufgeführt.
Der strikte Sandbox-Modus gilt für die Befehle, die Claude ausführt. Befehle, die Sie selbst an der Eingabeaufforderung des !-Shell-Modus eingeben, werden außerhalb der Sandbox ausgeführt, es sei denn, die Sitzung ist eine der folgenden:
- Eine Hintergrundsitzung: Der strikte Sandbox-Modus umfasst auch Befehle im Shell-Modus
- Eine Linux-Sitzung, in der
CLAUDE_CODE_SUBPROCESS_ENV_SCRUBgesetzt ist: Jeder Befehl wird in der Sandbox ausgeführt, einschließlich Befehlen im Shell-Modus
Vor v2.1.260 führte der strikte Sandbox-Modus Befehle im Shell-Modus in jeder Sitzung in der Sandbox aus.
Temporäre Verzeichnisse
Ein benutzerspezifisches temporäres Verzeichnis ist innerhalb der Sandbox standardmäßig beschreibbar, zusätzlich zum Arbeitsverzeichnis. Sofern Sie die Dateisystemisolation nicht deaktivieren, setzt Claude Code $TMPDIR für Befehle in der Sandbox auf dieses Verzeichnis, sodass Tools, die temporäre Dateien schreiben, ohne zusätzliche Konfiguration funktionieren.
Befehle außerhalb der Sandbox übernehmen das $TMPDIR Ihrer Shell, sofern es gesetzt ist. Solange die Dateisystemisolation aktiv ist, lösen Befehle innerhalb und außerhalb der Sandbox $TMPDIR daher in unterschiedliche Verzeichnisse auf. Wenn Ihre Shell $TMPDIR nicht setzt oder leer lässt, erhält ein Befehl außerhalb der Sandbox, der auf $TMPDIR verweist, Ihre Überschreibung CLAUDE_CODE_TMPDIR oder das temporäre Verzeichnis des Betriebssystems, wenn Sie keine festgelegt haben oder die Überschreibung ein langer Pfad ist, sodass die Variable nicht zu einer leeren Zeichenfolge expandiert wird. Um temporäre Dateien zwischen beiden auszutauschen, schreiben Sie sie stattdessen unterhalb des Arbeitsverzeichnisses.
Sandboxing konfigurieren
Passen Sie das Verhalten der Sandbox über Ihre settings.json-Datei an. Die vollständige Konfigurationsreferenz finden Sie unter Einstellungen.
Standardmäßig können in der Sandbox ausgeführte Befehle in das aktuelle Arbeitsverzeichnis, das benutzerspezifische temporäre Verzeichnis und alle Verzeichnisse schreiben, die Sie mit --add-dir, /add-dir oder permissions.additionalDirectories hinzugefügt haben. Wenn Unterprozessbefehle wie kubectl, terraform oder npm außerhalb dieser Verzeichnisse schreiben müssen, verwenden Sie sandbox.filesystem.allowWrite, um Zugriff auf bestimmte Pfade zu gewähren:
{
"sandbox": {
"enabled": true,
"filesystem": {
"allowWrite": ["~/.kube", "/tmp/build"]
}
}
}
Diese Pfade werden auf Betriebssystemebene durchgesetzt, sodass alle in der Sandbox ausgeführten Befehle einschließlich ihrer Kindprozesse sie beachten. Dies ist der empfohlene Ansatz, wenn ein Tool Schreibzugriff auf einen bestimmten Ort benötigt, anstatt das Tool mit excludedCommands vollständig von der Sandbox auszunehmen.
Wenn Sie dasselbe Dateisystem-Array in mehreren Einstellungs-Geltungsbereichen definieren, führt Claude Code diese zusammen und kombiniert die Pfade aus jedem Geltungsbereich, anstatt das Array eines Geltungsbereichs durch das eines anderen zu ersetzen.
Wenn Sie eine Quelle mit --setting-sources in der CLI oder mit settingSources im Agent SDK ausschließen, ignoriert Claude Code beim Erstellen der Sandbox-Konfiguration deren sandbox.filesystem-Einträge, deren Edit-Berechtigungsregeln und deren Read-deny-Regeln. Erfordert Claude Code v2.1.246 oder höher.
Wenn Sie diese Dateisystemlisten während einer Sitzung bearbeiten, wendet Claude Code die Änderung auf die laufende Sitzung an, sodass der nächste in der Sandbox ausgeführte Befehl mit den neuen Pfaden läuft.
Pfadpräfixe steuern, wie Pfade aufgelöst werden:
| Präfix | Bedeutung | Beispiel |
|---|---|---|
/ |
Absoluter Pfad ab dem Dateisystem-Stammverzeichnis | /tmp/build bleibt /tmp/build |
~/ |
Relativ zum Home-Verzeichnis | ~/.kube wird zu $HOME/.kube |
./ oder kein Präfix |
Relativ zum Projektstammverzeichnis bei Projekteinstellungen oder zu ~/.claude bei Benutzereinstellungen |
./output in .claude/settings.json wird zu <project-root>/output aufgelöst |
Diese Syntax unterscheidet sich von den Berechtigungsregeln für Read und Edit, die //path für absolute und /path für projektrelative Pfade verwenden. Dateisystempfade der Sandbox folgen den üblichen Konventionen: /tmp/build ist absolut. Wie Claude Code einen abschließenden Schrägstrich oder einen Platzhalter in diesen Pfaden behandelt, erfahren Sie unter Sandbox-Pfadpräfixe.
Sie können Schreib- oder Lesezugriff auch mit sandbox.filesystem.denyWrite und sandbox.filesystem.denyRead verweigern und bestimmte Pfade innerhalb eines gesperrten Bereichs mit sandbox.filesystem.allowRead wieder freigeben. Wenn sich Leseregeln überschneiden, gilt die Regel mit dem engeren Pfad:
| Beispielregeln | Ergebnis |
|---|---|
"denyRead": ["~/"] mit "allowRead": ["~/projects"] |
~/projects ist lesbar, und der Rest des Home-Verzeichnisses bleibt gesperrt. Die engere allow-Regel öffnet diesen Teil des gesperrten Bereichs wieder |
"allowRead": ["~/"] mit "denyRead": ["~/.env"] |
~/.env bleibt gesperrt, und der Rest des Home-Verzeichnisses ist lesbar. Die deny-Regel gilt auch innerhalb einer weiter gefassten allow-Regel, sodass eine breite allow-Regel ein Geheimnis nicht unbemerkt wieder freilegen kann |
"allowRead": ["~/"] mit "denyRead": ["~/**/.env"] |
Jede .env unterhalb des Home-Verzeichnisses bleibt gesperrt, und der Rest ist lesbar. Eine deny-Regel mit Platzhalter gilt innerhalb einer weiter gefassten allow-Regel genauso wie ein exakter Pfad |
Das folgende Beispiel sperrt das Lesen aus dem gesamten Home-Verzeichnis, erlaubt aber weiterhin das Lesen aus dem aktuellen Projekt. Legen Sie es in der .claude/settings.json Ihres Projekts ab, da der relative Pfad . nur dann zum Projektstammverzeichnis aufgelöst wird, wenn sich die Konfiguration in den Projekteinstellungen befindet:
{
"sandbox": {
"enabled": true,
"filesystem": {
"denyRead": ["~/"],
"allowRead": ["."]
}
}
}
Würden Sie dieselbe Konfiguration in ~/.claude/settings.json ablegen, würde . stattdessen zu ~/.claude aufgelöst, und Projektdateien blieben durch die denyRead-Regel gesperrt.
Um Befehlen in der Sandbox den Lesezugriff auf Home-Verzeichnisse und eingebundene Volumes zu verweigern und die Arbeitsverzeichnisse dennoch lesbar zu halten, setzen Sie permissions.blockReadsOutsideWorkingDirectories, anstatt Pfadregeln zu schreiben.
Befehle mit `excludedCommands` außerhalb der Sandbox ausführen
Tragen Sie ein Befehlsmuster in sandbox.excludedCommands ein, um passende Befehle außerhalb der Sandbox auszuführen, also ohne Dateisystembeschränkungen und ohne Netzwerk-Proxy. Verwenden Sie dies für ein Tool, das innerhalb der Sandbox nicht funktioniert und dem Sie Ihren vollen Zugriff anvertrauen. Ein Tool, das nur ein weiteres Verzeichnis oder einen weiteren Host benötigt, funktioniert möglicherweise mit allowWrite oder allowedDomains, wodurch der Befehl in der Sandbox bleibt.
Dieses Beispiel nimmt docker compose-Befehle aus der Sandbox heraus. Speichern Sie es in ~/.claude/settings.json, um es auf alle Ihre Projekte anzuwenden:
{
"sandbox": {
"enabled": true,
"excludedCommands": ["docker compose *"]
}
}
Claude Code prüft Ihre Einträge bei jedem Bash- und Monitor-Aufruf. Ein Aufruf ist die gesamte Befehlszeile, die Claude sendet, und kann mehrere Befehle verketten. Die folgenden Regeln entscheiden, ob ein Aufruf die Sandbox verlässt:
- Beenden Sie das Muster mit
*: Einträge verwenden dieselbe Syntax wie eineBash(...)-Berechtigungsregel, bei der ein Muster ohne Platzhalter eine exakte Übereinstimmung ist.dockerpasst nur aufdockerohne Argumente.docker *passt aufdockermit oder ohne Argumente - Jeder Befehl im Aufruf muss passen:
npm ci && docker compose buildbleibt in der Sandbox, sofern kein anderer Eintragnpm ciabdeckt - Claude Code gleicht den Text des Aufrufs ab: Ein Skript oder
make-Target, das interndockeraufruft, passt nicht, ebenso wenig/usr/local/bin/docker - Manche Aufrufe bleiben in der Sandbox: Eine Umleitung in eine Datei, ein
cdoder eine Befehlssubstitution wie$(...)hält den gesamten Aufruf in der Sandbox. Der Referenzeintrag listet weitere Aufrufe auf, die in der Sandbox bleiben - Wo Sie den Eintrag speichern, kann eine Rolle spielen: Solange die Sandbox vom Administrator vorgeschrieben ist, ignoriert Claude Code Einträge in
.claude/settings.jsonund.claude/settings.local.json
Ein ausgenommener Befehl durchläuft den regulären Berechtigungsablauf:
- Nur lesende Befehle und Befehle, die Ihre allow-Regeln abdecken, werden ohne Nachfrage ausgeführt
- Im Auto-Modus prüft der Klassifikator andere ausgenommene Befehle
- Im
bypassPermissions-Modus wird ein ausgenommener Befehl ohne Nachfrage ausgeführt, sofern keine ask-Regel auf ihn passt
Um zu bestätigen, dass ein Eintrag passt, wechseln Sie in den Manual-Modus und bitten Claude, einen passenden Befehl auszuführen, der etwas verändert, etwa docker compose up -d. Die Berechtigungsabfrage trägt den Titel „Bash command (unsandboxed)“.
Ein ausgenommener Befehl wird mit Ihrem vollen Zugriff ausgeführt. Ein breiter Eintrag wie docker * deckt alles ab, was dieses Tool tun kann. Wenn Sie ein Muster schreiben, das einen Interpreter, ein Skript in Ihrem Arbeitsverzeichnis oder ein Tool abdeckt, das auf eine Datei dort zugreift, wie es docker compose mit seiner Compose-Datei tut, kann Claude diese Datei schreiben und sie anschließend außerhalb der Sandbox ausführen. Ein engeres Muster lässt weniger übrig, das Claude außerhalb der Sandbox ausführen kann.
Dateisystem-Isolation deaktivieren
Setzen Sie sandbox.filesystem.disabled auf true, um die Dateisystem-Isolation zu überspringen und die Netzwerk-Isolation beizubehalten. Das folgende Beispiel schaltet die Dateisystem-Isolation aus und behält eine Allowlist von Netzwerkdomains bei:
{
"sandbox": {
"enabled": true,
"filesystem": {
"disabled": true
},
"network": {
"allowedDomains": ["github.com", "*.npmjs.org"]
}
}
}
Die Sandbox besteht aus zwei unabhängigen Ebenen: Die Dateisystem-Isolation steuert, welche Pfade Befehle in der Sandbox lesen und schreiben können, und die Netzwerk-Isolation steuert, welche Domains sie erreichen können. Ist die Dateisystemebene ausgeschaltet, erhalten Befehle in der Sandbox uneingeschränkten Lese- und Schreibzugriff auf das Dateisystem des Hosts, während ihr ausgehender Netzwerkverkehr auf Ihre erlaubten Domains beschränkt bleibt. Schalten Sie die Ebene aus, wenn Sie die Sandbox verwenden, um zu steuern, wohin Befehle sich verbinden, und nicht, was sie schreiben.
Die Einstellung ist standardmäßig deaktiviert und gilt auf den Plattformen, auf denen die Sandbox läuft: macOS, Linux und WSL2. Erfordert Claude Code v2.1.216 oder höher.
Bei ausgeschalteter Dateisystem-Isolation und automatisch erlaubten Befehlen kann ein Befehl in der Sandbox Dateien schreiben, die spätere Befehle ausführen oder lesen, etwa Shell-Startdateien, ausführbare Dateien im $PATH oder ~/.claude/settings.json, und diese nutzen, um beim nächsten Durchlauf seinen eigenen Zugriff zu erweitern. Setzen Sie filesystem.disabled nur dann auf true, wenn Sie den Workloads vertrauen, ihren eigenen Zugriff nicht auszuweiten. Das Sperren von Netzwerkdomains mit allowManagedDomainsOnly verringert das Risiko, beseitigt es aber nicht, da diese Sperre nur für Befehle gilt, die innerhalb der Sandbox ausgeführt werden.
Welche Einstellungen sie deaktivieren können
Da das Ausschalten der Dateisystem-Isolation erweitert, was Befehle in der Sandbox tun können, berücksichtigt Claude Code filesystem.disabled nur aus diesen Einstellungsquellen:
- Benutzereinstellungen, verwaltete Einstellungen und das CLI-Flag
--settingskönnen sie setzen. Projekteinstellungen in.claude/settings.jsonund.claude/settings.local.jsonkönnen das nicht, sodass ein ausgechecktes Projekt die Dateisystem-Isolation nicht ausschalten kann. - Wenn verwaltete Einstellungen
sandbox.filesystemüberhaupt konfigurieren oder einensandbox.credentials.files-Eintrag mit"mode": "deny"enthalten, können nur verwaltete Einstellungen den Schlüssel setzen. So bleiben vom Administrator bereitgestellte Dateisystembeschränkungen in Kraft; um eine solche Bereitstellung zu lockern, setzen Sie"disabled": truein den verwalteten Einstellungen. - Wenn
CLAUDE_CODE_SUBPROCESS_ENV_SCRUBgesetzt ist, ignoriert Claude Codefilesystem.disabledaus jeder Quelle, einschließlich der verwalteten Einstellungen, und lässt die Dateisystem-Isolation eingeschaltet.
Ob ein verwalteter credentials.files-Eintrag filesystem.disabled festlegt, also den Schlüssel auf verwaltete Einstellungen beschränkt, sodass Entwickler die Dateisystem-Isolation nicht ausschalten können, hängt vom mode des Eintrags ab und davon, was mit dem Eintrag beim Start der Sandbox geschieht:
| Verwalteter Eintrag | Legt filesystem.disabled fest |
Was die Datei schützt, wenn die Isolation aus ist |
|---|---|---|
"mode": "deny" |
Ja | Nichts: Die Lesesperre ist Teil der Dateisystemebene |
"mode": "mask", als Maske angewendet |
Nein | Die Maskierung selbst: die Sentinel-Kopie und der Proxy unter Linux und WSL2, die eigenen Leseregeln der Sandbox unter macOS |
"mode": "mask", beim Einrichten auf deny zurückgefallen |
Nein | Nichts, wie bei deny. Tragen Sie einen Pfad, der nicht maskiert werden kann, etwa ein Verzeichnis, als expliziten deny-Eintrag ein, der den Schlüssel festlegt |
"mode": "mask", durch die Validierung zu deny herabgestuft |
Ja, wie ein expliziter deny-Eintrag |
Nichts, wie bei deny |
Ein Fallback erfolgt beim Start der Sandbox, nachdem Claude Code die Einstellungen, auf denen die Prüfung der Festlegung basiert, bereits gelesen hat. Ein zurückgefallener Eintrag legt den Schlüssel daher nie fest. Die Validierung schreibt einen ungültigen Eintrag beim Laden der Einstellungen in deny um, sodass ein herabgestufter Eintrag den Schlüssel genauso festlegt wie einer, den Sie als deny geschrieben haben.
Was sich bei ausgeschalteter Dateisystem-Isolation ändert
Das Setzen von filesystem.disabled hebt die Schutzmaßnahmen auf, die die Dateisystemebene selbst durchsetzt. Schutzmaßnahmen, die andere Ebenen durchsetzen, gelten weiterhin:
| Schutzmaßnahme | Bei ausgeschalteter Dateisystem-Isolation |
|---|---|
filesystem.denyRead und deny-Lesesperren aus credentials.files |
Nicht durchgesetzt. Die Dateisystemebene wendet beide an |
deny- und mask-Einträge in credentials.envVars |
Durchgesetzt. Das Bereinigen von Umgebungsvariablen ist unabhängig von der Dateisystemebene |
mask-Einträge in credentials.files, die als Masken angewendet werden |
Durchgesetzt: Die Maskierung ist unabhängig von der Dateisystemebene. Ein Eintrag, der auf deny zurückgefallen ist, wird wie jeder deny-Eintrag nicht durchgesetzt |
Zwei weitere Dinge ändern sich:
-
Befehle in der Sandbox übernehmen das
$TMPDIRIhrer Shell anstelle des benutzerspezifischen temporären Verzeichnisses, da jedes temporäre Verzeichnis beschreibbar ist und Claude Code Befehle nicht mehr auf das benutzerspezifische umleitet.Unter Linux ist die Variable in der übergeordneten Shell oft nicht gesetzt. Die Hinweise des Bash-Tools weisen Claude an, temporäre Arbeitsverzeichnisse mit
mktemp -dzu erstellen, anstatt sich auf$TMPDIRzu verlassen. -
autoAllowBashIfSandboxedist weiterhin standardmäßigtrue, sodass Befehle in der Sandbox weiterhin ohne Nachfrage ausgeführt werden. Setzen Sie den Wert auffalse, um bei Befehlen in der Sandbox nachfragen zu lassen.
Anmeldedaten schützen
Die Einstellung sandbox.credentials legt Dateien mit Anmeldedaten und Umgebungsvariablen fest, die vor Befehlen in der Sandbox geschützt werden sollen. Jeder Eintrag benennt einen Dateipfad oder eine Umgebungsvariable sowie einen mode. Der eigene credentials-Block hält Regeln für Anmeldedaten zusammen und getrennt von allgemeinen Dateisystemregeln.
Bei Einträgen mit "mode": "deny" wird für Dateipfade das Lesen innerhalb der Sandbox verweigert, dieselbe Einschränkung, die filesystem.denyRead anwendet, und Umgebungsvariablen werden vor jedem Befehl in der Sandbox entfernt. Der Dateischutz ist Teil der Dateisystemebene und gilt daher nicht, wenn Sie die Dateisystem-Isolation deaktivieren; der Schutz der Umgebungsvariablen gilt weiterhin.
Das folgende Beispiel sperrt das Lesen der AWS-Anmeldedatendatei und des SSH-Verzeichnisses und entfernt GITHUB_TOKEN und NPM_TOKEN aus der Umgebung von Befehlen in der Sandbox:
{
"sandbox": {
"enabled": true,
"credentials": {
"files": [
{ "path": "~/.aws/credentials", "mode": "deny" },
{ "path": "~/.ssh", "mode": "deny" }
],
"envVars": [
{ "name": "GITHUB_TOKEN", "mode": "deny" },
{ "name": "NPM_TOKEN", "mode": "deny" }
]
}
}
}
Einträge für Umgebungsvariablen und Dateien akzeptieren auch "mode": "mask", beschrieben unter Anmeldedaten maskieren.
Dateipfade folgen denselben Präfixregeln wie die sandbox.filesystem.*-Einstellungen.
Claude Code führt die deny-Einträge aus jedem Einstellungs-Geltungsbereich zusammen, den die Sitzung lädt. Ein deny-Eintrag schränkt den Zugriff immer nur ein, daher kann jeder Geltungsbereich einen hinzufügen, aber kein Geltungsbereich kann einen entfernen, den ein anderer hinzugefügt hat.
Wenn Sie eine Einstellungsquelle ausschließen:
- Projekt- oder lokale Einstellungen: Claude Code wendet keinen ihrer
credentials-Einträge an. Erfordert Claude Code v2.1.246 oder höher. - Benutzereinstellungen: Claude Code wendet die
deny-Einträge in~/.claude/settings.jsonweiterhin an und behält derenmask-Einträge für Dateien als Einschränkungen bei, verwirft aber derenmask-Einträge für Umgebungsvariablen.
Es gibt keine integrierte Denylist für Anmeldedaten, daher sind nur die Dateien und Variablen eingeschränkt, die Sie auflisten.
sandbox.credentials wirkt sich nur auf Bash-Befehle in der Sandbox aus. Um Anmeldedaten unabhängig vom Sandboxing aus allen Unterprozessen zu entfernen, setzen Sie CLAUDE_CODE_SUBPROCESS_ENV_SCRUB.
Anmeldedaten maskieren
Die Maskierung geht weiter als ein deny-Eintrag unter Anmeldedaten schützen. Anstatt Anmeldedaten zu sperren, zeigt Claude Code Befehlen in der Sandbox einen Platzhalter, den Sentinel, und der Sandbox-Proxy setzt bei ausgehenden Anfragen an von Ihnen erlaubte Hosts den echten Wert ein. Bei Dateien ist die Ersetzung ein Verhalten unter Linux und WSL2; macOS sperrt die Datei stattdessen.
Umgebungsvariablen maskieren
"mode": "mask" schützt Anmeldedaten und sorgt dafür, dass die Tools, die sich damit authentifizieren, weiterhin funktionieren. deny entfernt die Variable vollständig, wodurch auch Tools nicht mehr funktionieren, die sie benötigen, etwa gh oder npm. Erfordert Claude Code v2.1.199 oder höher.
Mit mask sieht der Befehl in der Sandbox einen sitzungsspezifischen Sentinel-Wert anstelle des echten Werts. Jeder mask-Eintrag kann injectHosts auflisten, die Hosts, die der echte Wert erreichen darf. Wenn eine Anfrage die Sandbox in Richtung eines dieser Hosts verlässt, ersetzt der Sandbox-Proxy den Sentinel durch den echten Wert. Der Befehl und alles, was er protokolliert, enthalten nie die echten Anmeldedaten, aber seine Anfragen werden dennoch authentifiziert.
Der Proxy ersetzt die Anmeldedaten innerhalb des Anfrageinhalts und muss diesen daher sehen können. Setzen Sie network.tlsTerminate, damit der Proxy TLS selbst terminiert.
Ohne diese Einstellung schlägt die Maskierung fehl, ohne etwas preiszugeben: Der Befehl sieht weiterhin nur den Sentinel, aber der Sentinel erreicht den Server unverändert, und die Authentifizierung schlägt fehl. Claude Code meldet diese Fehlkonfiguration beim Start.
Die Ersetzung umfasst Header und Anfrage-Bodys. Anfragen, die sich mit einer aus den Anmeldedaten abgeleiteten Signatur statt mit den Anmeldedaten selbst authentifizieren, müssen am Proxy neu signiert werden; AWS-Anfragen neu signieren beschreibt, wie das bei AWS funktioniert.
Der Proxy fügt Anmeldedaten nur bei Verbindungen ein, die die Domain-Allowlist zulässt. Jedes injectHosts-Ziel muss daher auch über network.allowedDomains erreichbar sein.
Das folgende Beispiel maskiert zwei Token. GH_TOKEN wird nur bei Anfragen an api.github.com ersetzt, während NPM_TOKEN keine injectHosts hat und bei Anfragen an jeden Host in network.allowedDomains ersetzt wird.
{
"sandbox": {
"enabled": true,
"network": {
"tlsTerminate": {},
"allowedDomains": ["*.github.com", "registry.npmjs.org"]
},
"credentials": {
"envVars": [
{ "name": "GH_TOKEN", "mode": "mask", "injectHosts": ["api.github.com"] },
{ "name": "NPM_TOKEN", "mode": "mask" }
]
}
}
}
Schreiben Sie ein IPv6-Ziel in den beiden Listen unterschiedlich, da jede Liste ihren eigenen Matcher hat:
network.allowedDomains: die in Domainlisten verwendete Form mit eckigen Klammern, etwa"[::1]". Der Proxy prüft diese Liste, um die Verbindung zuzulassen.injectHosts: die reine Adresse in ihrer kanonischen komprimierten Form, etwa"::1"oder"2001:db8::1". Der Proxy gleicht jeden Eintrag mit der reinen Zieladresse der Verbindung ab und ignoriert dabei Ports. Eine Schreibweise mit eckigen Klammern, Zonen-ID oder anderer Komprimierung passt daher nie, und der Proxy fügt die Anmeldedaten dort nie ein.
claude doctor kennzeichnet injectHosts-Einträge, die nie passen können, mit der Warnung Sandbox credential injectHosts entries can never match their destination. Diese Prüfung erfordert Claude Code v2.1.229 oder höher.
Anders als deny autorisiert die Maskierung den Proxy, Ihre echten Anmeldedaten an die aufgelisteten Hosts zu senden. Claude Code berücksichtigt sie daher nur aus Einstellungen, die Sie oder Ihr Administrator kontrollieren: Benutzereinstellungen, verwaltete Einstellungen und das CLI-Flag --settings. Claude Code ignoriert mask-Einträge in der .claude/settings.json oder .claude/settings.local.json eines Repositorys. In diesen Dateien ignoriert es auch network.tlsTerminate und credentials.allowPlaintextInject, die Einstellung, mit der der Proxy Anmeldedaten in unverschlüsselte Anfragen einfügen darf. Wenn Sie Benutzereinstellungen ausschließen, verwirft Claude Code auch die mask-Einträge für Umgebungsvariablen in ~/.claude/settings.json.
Wenn Ihr Administrator mask-Einträge, network.tlsTerminate oder credentials.allowPlaintextInject über serververwaltete Einstellungen bereitstellt, zählen diese zu den Einstellungen, die eine Genehmigung erfordern.
Wenn dieselbe Variable in einem beliebigen Geltungsbereich mit deny aufgeführt ist, hat deny Vorrang.
Die Maskierung ersetzt standardmäßig den gesamten Wert der Variable, was für ein einfaches Token geeignet ist. Optionale Eintragsfelder, die Claude Code v2.1.224 oder höher erfordern, verarbeiten strukturierte Werte:
extract: ein regulärer Ausdruck, den Claude Code auf den gesamten Wert anwendet, wobei nur der von Gruppe 1 jeder Übereinstimmung erfasste Text ersetzt wird. So funktioniert ein Tool, das den Wert parst, etwa bei einemDATABASE_URL-Verbindungsstring, auch innerhalb der Sandbox weiter. Das Muster muss mindestens eine Erfassungsgruppe enthalten.onExtractNoMatchsteuert, was passiert, wenn das Muster auf nichts passt:warn, der Standard, gibt eine Warnung aus und reicht die Variable unmaskiert durchdenyentfernt die Variable innerhalb der Sandboxerrorstoppt die Einrichtung der Sandbox, bis Sie die Konfiguration korrigieren
decode: "jwt": für eine Variable, die ein JSON Web Token (JWT) enthält. Claude Code prüft, ob der Wert ein JWT ist, und ersetzt ihn durch ein strukturell gültiges gefälschtes Token, sodass Code innerhalb der Sandbox, der das Token dekodiert, weiterhin funktioniert. Fügen SiemaskClaimshinzu, um Claims der obersten Ebene der Payload aufzulisten, die einzeln maskiert werden sollen, anstatt das gesamte Token zu ersetzen; die übrigen Claims bleiben lesbar. Wenn sich der Wert nicht als JWT verifizieren lässt oder kein aufgeführter Claim passt, reicht Claude Code die Variable mit einer Warnung unmaskiert durch.decodekann nicht mitextractkombiniert werden.
Die vollständige Feldliste finden Sie in den Zeilen zu credentials.envVars[] in der Einstellungsreferenz.
AWS-Anfragen neu signieren
AWS-Anfragen tragen SigV4-Signaturen über den Anfrageinhalt. Maskieren Sie daher AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY gemeinsam. Der Proxy erkennt eine SigV4-Anfrage am Sentinel des Zugriffsschlüssels und signiert sie neu, nachdem er die echten Werte eingesetzt hat. Wird nur der geheime Schlüssel maskiert, bleiben Anfragen mit dem Platzhalter signiert, den der Proxy nicht erkennen kann, sodass sie bei AWS fehlschlagen; Claude Code warnt in diesem Fall beim Start, jedoch nicht, wenn nur die Zugriffsschlüssel-ID maskiert ist. Eine erkannte Anfrage, die der Proxy nicht neu signieren kann, etwa eine ohne x-amz-date-Header, schlägt mit einem Proxy-Fehler fehl, anstatt den Server mit einer fehlerhaften Signatur zu erreichen.
Claude Code verknüpft die üblichen Variablen AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY und AWS_SESSION_TOKEN automatisch zu einem Satz Anmeldedaten, wenn Sie deren gesamte Werte maskieren. Wenn Ihre AWS-Anmeldedaten in Variablen mit anderen Namen liegen, gruppieren Sie diese selbst mit credentials.awsPairs, was Claude Code v2.1.224 oder höher erfordert. Dieses Beispiel fügt die Zuordnung einer Konfiguration hinzu, die MY_KEY_ID, MY_SECRET_KEY und MY_SESSION_TOKEN bereits vollständig maskiert, wie in der obigen Maskierungskonfiguration:
{
"sandbox": {
"credentials": {
"awsPairs": [
{
"accessKeyIdVar": "MY_KEY_ID",
"secretAccessKeyVar": "MY_SECRET_KEY",
"sessionTokenVar": "MY_SESSION_TOKEN"
}
]
}
}
}
Jeder Eintrag folgt diesen Regeln:
accessKeyIdVarundsecretAccessKeyVarbenennen die maskiertenenvVars-Einträge, die die Zugriffsschlüssel-ID und den geheimen Schlüssel enthalten. Das optionalesessionTokenVarbenennt den Eintrag mit dem Sitzungstoken für temporäre Anmeldedaten; wenn es gesetzt ist, sendet der Proxy bei neu signierten Anfragen das echte Token alsx-amz-security-token.- Jede benannte Variable muss ein
mask-Eintrag sein, der ihren gesamten Wert maskiert, ohneextractoderdecode. - Der Proxy signiert Anfragen an die Hosts neu, die in den
injectHostsdes Eintrags für die Zugriffsschlüssel-ID aufgeführt sind. - Wird eine der üblichen Variablen in einem Paar benannt, ersetzt dies die automatische Zuordnung.
Wie mask-Einträge wird awsPairs nur aus Benutzereinstellungen, verwalteten Einstellungen und dem CLI-Flag --settings berücksichtigt.
Drei Formen von AWS-Anfragen tragen Signaturen, die der Proxy nicht neu berechnen kann. Wenn eine solche Anfrage mit dem Platzhalter eines maskierten Paars signiert ist, lässt der Proxy sie fehlschlagen, anstatt eine fehlerhafte Signatur weiterzuleiten; Anfragen, die mit unmaskierten Anmeldedaten signiert sind, sind nie betroffen. Die Einstellung credentials.sigv4, die Claude Code v2.1.224 oder höher erfordert, lockert dies je Form: Wird der Schlüssel einer Form auf passthrough gesetzt, wird die Anfrage mit ihrer vom Platzhalter abgeleiteten Signatur weitergeleitet, sodass das aufrufende Tool die Ablehnungsantwort von AWS selbst statt eines Proxy-Fehlers erhält. Wie awsPairs wird sigv4 nur aus Benutzereinstellungen, verwalteten Einstellungen und dem CLI-Flag --settings berücksichtigt.
| Anfrageform | sigv4-Schlüssel |
Warum der Proxy sie nicht neu signieren kann |
|---|---|---|
| aws-chunked-Streaming-Uploads | streaming |
Die Signaturen pro Chunk bauen auf der Ausgangssignatur auf, sodass ein Neusignieren das Umschreiben des Bodys erfordern würde |
| Vorsignierte URLs | presigned |
Die Signatur befindet sich in der URL selbst, ohne Authorization-Header |
| Asymmetrische SigV4A-Signaturen | sigv4a |
Es gibt keinen HMAC mit gemeinsamem Schlüssel, der neu berechnet werden könnte |
Dateien mit Anmeldedaten maskieren
Dateieinträge akzeptieren ebenfalls "mode": "mask", was Claude Code v2.1.221 oder höher erfordert. Was ein Befehl in der Sandbox sieht, hängt von der Plattform ab:
- Linux und WSL2: Befehle in der Sandbox lesen eine Sentinel-Kopie der Datei, einen Ersatz, dessen Geheimnis durch einen Platzhalterwert ersetzt ist, und der Sandbox-Proxy setzt beim ausgehenden Verkehr den echten Wert ein.
- macOS: Befehle in der Sandbox können die aufgeführte Datei überhaupt nicht lesen. Claude Code erstellt keine Sentinel-Kopie und ersetzt beim ausgehenden Verkehr nichts, sodass Tools, die sich mit der Datei authentifizieren, innerhalb der Sandbox nicht funktionieren, mit derselben Wirkung wie
deny. Anders als bei einemdeny-Eintrag bleibt die Lesesperre auch dann bestehen, wenn Sie die Dateisystem-Isolation deaktivieren.
Auf jeder Plattform wendet Claude Code die Anforderung network.tlsTerminate und injectHosts genauso an wie bei maskierten Umgebungsvariablen und ignoriert Repository-Einstellungen auf dieselbe Weise. Wenn Sie Benutzereinstellungen ausschließen, behält Claude Code die mask-Einträge für Dateien in ~/.claude/settings.json als Einschränkungen bei, aber die Einträge autorisieren den Proxy nicht mehr, den echten Wert einzusetzen.
Das folgende Beispiel maskiert ein GitHub-Token, das in ~/.config/gh/hosts.yml gespeichert ist; das weiter unten beschriebene extract-Muster teilt Claude Code mit, welcher Teil der Datei das Geheimnis ist. Unter Linux und WSL2 erhalten Befehle in der Sandbox, die die Datei lesen, einen Sentinel anstelle des Tokens, und der Proxy setzt bei Anfragen an api.github.com das echte Token ein:
{
"sandbox": {
"enabled": true,
"network": {
"tlsTerminate": {},
"allowedDomains": ["*.github.com"]
},
"credentials": {
"files": [
{
"path": "~/.config/gh/hosts.yml",
"mode": "mask",
"extract": "oauth_token:\\s*(\\S+)",
"injectHosts": ["api.github.com"]
}
]
}
}
}
Um zu bestätigen, dass die Maske aktiv ist, bitten Sie Claude, cat ~/.config/gh/hosts.yml in einem Befehl in der Sandbox auszuführen: Unter Linux und WSL2 zeigt die Ausgabe einen Sentinel-Wert anstelle des Tokens, und unter macOS schlägt das Lesen stattdessen fehl.
Unter Linux und WSL2 sorgt das extract-Muster dafür, dass der Rest von hosts.yml lesbar bleibt. Claude Code wendet den regulären Ausdruck auf die gesamte Datei an und ersetzt nur den von Gruppe 1 jeder Übereinstimmung erfassten Text, sodass gh seine Konfiguration weiterhin parst und nur das Token ein Platzhalter ist. Verwenden Sie extract für jede strukturierte Datei, die Tools parsen, etwa .netrc, JSON oder YAML; das Muster muss mindestens eine Erfassungsgruppe enthalten. Ohne extract ersetzt Claude Code den gesamten Dateiinhalt durch einen einzigen Sentinel-Wert, was für eine Datei geeignet ist, die nur ein einzelnes Geheimnis und sonst nichts enthält.
Für eine Datei, die ein JSON Web Token (JWT) enthält, setzen Sie decode: "jwt" anstelle von oder zusammen mit extract. decode erfordert Claude Code v2.1.224 oder höher. Claude Code findet JWT-Kandidaten mit einem integrierten Muster oder, falls gesetzt, mit Ihrem extract-Muster, prüft, ob jeder Kandidat ein JWT ist, und ersetzt ihn durch ein strukturell gültiges gefälschtes Token, sodass Code, der das Token innerhalb der Sandbox dekodiert, weiterhin funktioniert. Fügen Sie maskClaims hinzu, um nur die benannten Claims der obersten Ebene der Payload innerhalb jedes verifizierten Tokens zu maskieren und die übrigen Claims lesbar zu lassen. Wenn sich kein Kandidat verifizieren lässt oder kein benannter Claim passt, bestimmt das unten beschriebene Feld onExtractNoMatch das Ergebnis, genauso wie bei einem Muster, das auf nichts passt.
Zwei optionale Felder verfeinern das Abgleichverhalten. Beide gelten nur, wenn mode auf mask steht und extract oder decode gesetzt ist. Unter macOS wendet Claude Code mask-Einträge bei eingeschalteter Dateisystem-Isolation als deny an, bevor das Muster ausgeführt wird. Diese Felder und die unten beschriebenen Ergebnisse bei fehlender Übereinstimmung wirken dort daher nur, wenn die Dateisystem-Isolation ausgeschaltet ist:
-
onExtractNoMatchsteuert, was passiert, wenn der Abgleich in der Datei nichts zum Maskieren findet:warn, der Standard, gibt eine Warnung aus und überspringt den Eintrag, sodass Befehle in der Sandbox die echte Datei unmaskiert lesen können. Der Standard eignet sich für Anmeldedaten, die berechtigterweise fehlen können; wenn das Geheimnis vorhanden sein könnte, das Muster es aber möglicherweise verfehlt, verwenden Siedenydenymacht die Datei stattdessen unlesbarerrorstoppt die Einrichtung der Sandbox, bis Sie die Konfiguration korrigieren
Claude Code behandelt
denyalserror, wann immer die Lesesperre nicht durchgesetzt würde: wenn Sie die Dateisystem-Isolation deaktivieren und wenn einfilesystem.allowRead-Eintrag den Pfad der Datei wieder freigibt. -
maskDuplicatesersetzt zusätzlich wörtliche Kopien jedes maskierten Anmeldedatenwerts, also einerextract-Erfassung oder eines durchdecodeverifizierten Tokens, die außerhalb der abgeglichenen Bereiche gefunden werden, für ein Geheimnis, das an Stellen wiederholt wird, die der Abgleich nicht erreicht. Es gleicht rohe Teilstrings ab, sodass ein kurzer oder häufiger Wert überall ersetzt würde, wo er vorkommt; verwenden Sie es daher nur für lange Geheimnisse mit hoher Entropie. Standard: false.
mask gilt für eine einzelne Datei, listen Sie daher jede Datei mit Anmeldedaten einzeln auf. Claude Code fällt bei einem mask-Eintrag, den es nicht sicher maskieren kann, auf deny zurück: bei einem Verzeichnispfad, einem Glob-Muster, einer Datei größer als 8 MiB oder einer Datei, die kein UTF-8-Text ist. Tragen Sie Verzeichnisse stattdessen als explizite deny-Einträge ein; die Tabelle unter Welche Einstellungen sie deaktivieren können beschreibt, ob jede Form filesystem.disabled festlegt und wie sie sich bei ausgeschalteter Dateisystem-Isolation verhält.
Wie Sandboxing funktioniert
Dateisystemisolation
Das in einer Sandbox ausgeführte Bash-Tool beschränkt den Dateisystemzugriff auf bestimmte Verzeichnisse:
- Standardverhalten beim Schreiben: Lese- und Schreibzugriff auf das aktuelle Arbeitsverzeichnis und seine Unterverzeichnisse, auf alle Verzeichnisse, die Sie mit
--add-dir,/add-diroderpermissions.additionalDirectorieshinzugefügt haben, sowie auf das benutzerspezifische temporäre Verzeichnis, auf das$TMPDIRverweist - Standardverhalten beim Lesen: Lesezugriff auf den gesamten Computer, mit Ausnahme bestimmter gesperrter Verzeichnisse. Diese Standardeinstellung erlaubt weiterhin das Lesen von Dateien mit Anmeldedaten, daher sollten Sie Anmeldedaten schützen, die Befehle nicht lesen sollen.
- Lesesperre: Wenn
permissions.blockReadsOutsideWorkingDirectoriesaktiviert ist, verlieren in der Sandbox ausgeführte Befehle außerdem den Lesezugriff auf Ihr Home-Verzeichnis und die anderen Verzeichnisse, die Benutzerdateien enthalten, mit Ausnahme der Pfade, die unter Befehle in der Sandbox unter der Sperre aufgeführt sind. Dieser Abschnitt beschreibt auch, wann dieser Teil der Sperre nicht gilt. - Git-Worktrees: Wenn das Arbeitsverzeichnis ein verknüpfter Git-Worktree ist, erlaubt die Sandbox auch Schreibvorgänge im gemeinsamen
.git-Verzeichnis des Haupt-Repositorys, damit Befehle wiegit commitRefs und den Index aktualisieren können. Schreibvorgänge inhooks/undconfiginnerhalb dieses Verzeichnisses bleiben gesperrt.
Um die Dateisystemisolation vollständig zu überspringen und gleichzeitig die Netzwerkisolation beizubehalten, setzen Sie sandbox.filesystem.disabled.
Geschützte Pfade
Innerhalb der Verzeichnisse, in die in der Sandbox ausgeführte Befehle schreiben dürfen, verweigert die Sandbox weiterhin Schreibvorgänge in die Dateien, aus denen Claude Code Konfiguration und Code lädt. Ein Befehl, der diese Dateien bearbeiten könnte, könnte sich selbst Berechtigungen erteilen oder einen Hook oder MCP-Server hinzufügen, den Claude Code außerhalb der Sandbox ausführt. Das Berechtigungssystem hat eigene geschützte Pfade, die steuern, was Claude Code genehmigt, bevor ein Tool ausgeführt wird; die Liste der Sandbox gilt für einen Befehl, der bereits läuft. Sie umfasst vier Gruppen von Pfaden:
- In Ihrem Arbeitsverzeichnis und den darüberliegenden Verzeichnissen: die
.claude-Einstellungsdateien, die Verzeichnisse.claude/skills,.claude/agents,.claude/commandsund.claude/hooks,.mcp.jsonsowie die Dateien, die Claude Code selbstständig ausführt, etwa.claude/workflowsund.claude/scheduled_tasks.json - Nur in Ihrem Arbeitsverzeichnis: Shell-Startdateien wie
.bashrcund.zshrc,.gitconfig, die Verzeichnisse.vscodeund.ideasowiehooksundconfiginnerhalb von.git - Dateien, die Ihr Arbeitsverzeichnis in ein Bare-Git-Repository verwandeln würden:
HEAD,objectsundrefsauf oberster Ebene sowie dort vorhandeneconfig- undhooks-Einträge, wenn daneben einHEADliegt. Eine Datei namensconfigwird auch ohneHEADgesperrt. Unter Linux und WSL2 löscht die Sandbox eineHEAD-Datei bzw. einobjects- oderrefs-Verzeichnis auf oberster Ebene, das erscheint, während ein Befehl in der Sandbox läuft - In
~/.claudeoder dem Verzeichnis, auf dasCLAUDE_CONFIG_DIRverweist: der Großteil des Inhalts sowie~/.claude.jsonund der Anmeldedatenspeicher.credentials.json
Wenn während der Sitzung ein Symlink am Pfad einer geschützten Einstellungsdatei erscheint, verweigert die Sandbox ab dem nächsten Befehl auch Schreibvorgänge in die Datei, auf die er verweist.
Es gibt keine Möglichkeit, einen dieser Pfade auszunehmen: Ein allowWrite-Eintrag oder eine Edit-allow-Regel, die den Pfad abdeckt, hebt den Schutz nicht auf. Die einzige Möglichkeit, den Schutz auszuschalten, ist filesystem.disabled, wodurch die Dateisystemisolation für alle Pfade ausgeschaltet wird. Um die meisten dieser Pfade für Ihren Rechner aufgelöst zu sehen, führen Sie /sandbox aus und öffnen Sie den Tab Config, der sie unter Denied within allowed zusammen mit Ihren eigenen denyWrite-Einträgen auflistet.
Wenn git merge oder git checkout bei einem dieser Pfade mit unable to unlink old fehlschlägt, lesen Sie Fehlerbehebung.
Netzwerkisolation
Ein in der Sandbox ausgeführter Befehl hat keinen direkten Zugang zum Netzwerk:
- Linux und WSL2: Der Befehl läuft in einem separaten Netzwerk-Namespace, der keine Verbindung zu Ihrem Netzwerk hat
- macOS: Das Sandbox-Framework Seatbelt blockiert standardmäßig alle Verbindungen außer der zum Sandbox-Proxy
Claude Code betreibt den Sandbox-Proxy auf Ihrem Rechner außerhalb der Sandbox und leitet Befehle mit HTTP_PROXY, HTTPS_PROXY, ALL_PROXY und verwandten Umgebungsvariablen zu ihm. Der Proxy prüft den Hostnamen jeder Verbindung anhand Ihrer erlaubten und gesperrten Domains.
Was ein Tool erreichen kann, hängt davon ab, ob es den Proxy verwendet:
- Tools, die die Proxy-Variablen lesen:
curl,npm,gitüber HTTPS und ähnliche Tools verbinden sich, sobald ihr Host erlaubt ist. EinallowedDomains-Eintrag ohne Port erlaubt jeden Port auf diesem Host - Tools, die die Proxy-Variablen ignorieren: einfaches
ssh, die meisten Datenbanktreiber und ähnliche Tools können sich nicht verbinden, selbst zu einem erlaubten Host. Siehe Ein Datenbank-Client oder ein anderes Nicht-HTTP-Tool erreicht einen erlaubten Host nicht - Alles, was nicht TCP ist: UDP, HTTP/3 über QUIC und ICMP-Tools wie
pingkönnen die Sandbox nicht verlassen
Die folgenden Einstellungen und Verhaltensweisen steuern, welche Hosts der Proxy erlaubt:
- Domain-Beschränkungen: Ihre erlaubten Domains sind anfangs leer. Hosts außerhalb Ihrer erlaubten Domains beschreibt, was passiert, wenn ein Befehl zum ersten Mal eine neue Domain benötigt.
- Genehmigungsoptionen: Wenn Sie bei der Abfrage Yes wählen, erlaubt Claude Code den Host für den Rest der aktuellen Sitzung. Wenn Sie „Yes, and don't ask again" wählen, speichert Claude Code eine
WebFetch(domain:...)-allow-Regel in Ihren lokalen Einstellungen, sodass der Host auch in zukünftigen Sitzungen erlaubt bleibt. Solange die Sandbox vom Administrator vorgeschrieben ist, speichert Claude Code die Regel in Ihren Benutzereinstellungen, wo sie in jedem Projekt gilt. - Vorab erlaubte Domains: Erlauben Sie Domains vorab mit
allowedDomains, um die Abfrage ganz zu vermeiden. Claude Code erlaubt außerdem vorab Domains ausWebFetch(domain:...)-allow-Regeln, wie unter Berechtigungsregeln beschrieben. - Strikte Allowlist: Wenn Sie
strictAllowlistin Benutzer-, verwalteten oder CLI---settings-Einstellungen auftruesetzen, verweigert Claude Code Befehlen in der Sandbox den Zugriff auf jeden Host außerhalb der Allowlist, statt nachzufragen. Die Allowlist besteht ausallowedDomainsplus Domains ausWebFetch(domain:...)-allow-Regeln oder nur aus den Einträgen der verwalteten Einstellungen, wennallowManagedDomainsOnlygesetzt ist. Sperren, die ohne vom Administrator vorgeschriebene Sandbox gelten behandelt die Einträge eines Repositorys. Claude Code erzwingt dies nur für Befehle in der Sandbox; prozessinterne Tools wieWebFetchfolgen weiterhin ihren Berechtigungsregeln. Das Setzen in.claude/settings.jsonoder.claude/settings.local.jsoneines Repositorys hat keine Wirkung. Erfordert Claude Code v2.1.219 oder höher. - Verwaltete Sperre: Wenn
allowManagedDomainsOnlyin verwalteten Einstellungen gesetzt ist, werden nicht erlaubte Domains automatisch blockiert, statt nachzufragen, und nurallowedDomainsundWebFetch(domain:...)-allow-Regeln aus verwalteten Einstellungen werden berücksichtigt. - Unternehmens-Proxy: Wenn Ihr Netzwerk verlangt, dass ausgehender Datenverkehr über einen Unternehmens-Proxy läuft, setzen Sie
HTTPS_PROXY,HTTP_PROXYundNO_PROXYwie unter Proxy-Konfiguration beschrieben, und zwar imenv-Block Ihrer Einstellungen, damit auch Hintergrund-Agenten sie erhalten, oder in der Umgebung, aus der Sie Claude Code starten. Claude Code erzwingt die Domain-Allowlist und tunnelt erlaubte Verbindungen dann über diesen vorgelagerten Proxy.http://- undhttps://-Proxy-URLs funktionieren, bei Bedarf mit Basic-Authentifizierung in der URL.
In einer WebFetch(domain:...)-Regel berücksichtigt die Sandbox zwei Platzhalterformen: ein führendes *., etwa *.example.com, und ein alleinstehendes *. Die Form mit alleinstehendem * erfordert Claude Code v2.1.186 oder höher. Ein Platzhalter an jeder anderen Position, etwa WebFetch(domain:example.*), passt weiterhin auf Abrufe, hat aber keine Wirkung auf Befehle in der Sandbox.
Der integrierte Proxy erzwingt die Allowlist anhand des angefragten Hostnamens und terminiert oder prüft TLS-Datenverkehr standardmäßig nicht. Die experimentelle Einstellung network.tlsTerminate, verfügbar in Claude Code v2.1.199 und höher, lässt den integrierten Proxy TLS selbst terminieren, was für mask-Anmeldedateneinträge erforderlich ist. Siehe Sicherheitseinschränkungen für die Auswirkungen der Standardeinstellung und Benutzerdefinierte Proxy-Konfiguration, falls Ihr Bedrohungsmodell eine TLS-Prüfung erfordert.
Hosts außerhalb Ihrer erlaubten Domains
Wenn sich ein Befehl in der Sandbox mit einem Host verbindet, der nicht zu Ihren erlaubten Domains gehört, bleibt der Befehl in der Sandbox und wartet auf eine Entscheidung. In einer interaktiven Terminal-Sitzung hängt die Entscheidung von Ihrem Berechtigungsmodus ab:
| Berechtigungsmodus | Was mit der Verbindung passiert |
|---|---|
bypassPermissions-Modus sowie Plan-Modus mit verfügbarem Umgehen von Berechtigungen |
Ohne Abfrage erlaubt |
Manueller Modus, acceptEdits-Modus und Plan-Modus in anderen Fällen |
Sie erhalten eine Abfrage |
| Auto-Modus | Abgelehnt, sofern der Befehl den Host nicht aufgeführt hat und der Klassifikator die Liste genehmigt hat |
dontAsk-Modus |
Abgelehnt |
Wenn strictAllowlist oder allowManagedDomainsOnly aktiviert ist, lehnt der integrierte Sandbox-Proxy die Verbindung in jedem Berechtigungsmodus ab. Im bypassPermissions-Modus sind Hosts außerhalb Ihrer erlaubten Domains erlaubt, sofern keine dieser Einstellungen aktiviert ist. Der Notausgang des Wiederholungsversuchs außerhalb der Sandbox beschreibt, wann ein Befehl die Sandbox in diesem Modus verlassen kann. Eine Verbindung zu einem Host in deniedDomains wird ebenfalls in jedem Berechtigungsmodus abgelehnt.
Hostnamen, die zu lokalen Adressen aufgelöst werden
Nachdem ein Hostname die Allowlist passiert hat, löst der Sandbox-Proxy ihn auf und lehnt die Verbindung ab, wenn der Name ausschließlich zu lokalen Adressen aufgelöst wird. Zu den lokalen Adressen gehören Loopback-Adressen wie 127.0.0.1, Link-Local-Adressen wie der Cloud-Metadaten-Endpunkt 169.254.169.254 sowie Adressen, die Ihrem eigenen Rechner zugewiesen sind. Die Namen localhost und *.localhost dürfen zu Loopback aufgelöst werden.
Ein erlaubter Intranet-Hostname, der zu einem privaten Bereich wie 10.0.0.0/8 aufgelöst wird, verbindet sich. Damit ein Name zu einer abgelehnten Adresse aufgelöst werden darf, fügen Sie diese IP-Adresse zu allowedDomains hinzu, etwa "127.0.0.1:8080".
Die Prüfung gilt für Hostnamen. Über eine Verbindung zu einer IP-Adresse entscheiden Ihre erlaubten Domains und Ihr Berechtigungsmodus. Der Proxy überspringt die Prüfung außerdem bei Verbindungen, die er über einen vorgelagerten Unternehmens-Proxy sendet, da dieser Proxy den Namen auflöst.
Erlaubte Domains pro Befehl im Auto-Modus
Im Auto-Modus mit aktiviertem Sandboxing benennt Claude die Hosts, die ein Befehl benötigt, direkt am Befehl, statt für jede Verbindung eine Netzwerkgenehmigung auszulösen. Jeder Bash-, PowerShell- oder Monitor-Befehl, der in der Sandbox läuft, kann eine Liste von Hosts über die Allowlist der Sandbox hinaus mitführen: eine Domain wie registry.npmjs.org, einen Platzhalter wie *.pythonhosted.org oder eine IP-Adresse, jeweils mit optionalem :port. Der Klassifikator prüft die Hosts zusammen mit dem Befehl. Erfordert Claude Code v2.1.271 oder höher.
Eine genehmigte Liste öffnet diese Hosts nur für diesen einen Befehl, solange er läuft. Weder den erlaubten Hosts Ihrer Sitzung noch Ihren Einstellungen wird etwas hinzugefügt; der nächste Befehl benennt seine eigenen Hosts.
Ein Befehl, der Hosts mitführt, geht an den Klassifikator, statt durch eine Berechtigungsregel oder den Auto-Allow-Modus der Sandbox genehmigt zu werden. Wenn eine ask-Regel eine Abfrage für den Befehl erzwingt, listet der Berechtigungsdialog in Ihrem Terminal die Hosts daneben auf, und eine Genehmigung dort deckt beides ab.
Eine Liste pro Befehl erweitert nur das, was die Sandbox standardmäßig verweigert. Einträge in deniedDomains blockieren weiterhin. Wenn strictAllowlist oder allowManagedDomainsOnly die Allowlist sperrt, lehnt Claude Code Listen pro Befehl ab.
Solange Listen pro Befehl gelten, lehnt Claude Code eine Verbindung zu einem Host, den kein genehmigter Befehl aufgeführt hat, ohne Abfrage und ohne Prüfung durch den Klassifikator ab. Die Ablehnung nennt den Host im Ergebnis des Befehls, und Claude führt den Befehl mit hinzugefügtem Host erneut aus.
IPv6-Adressen in Domain-Listen
Die Domain-Listen der Sandbox sind allowedDomains, deniedDomains und die WebFetch(domain:...)-Regeln, die in sie einfließen. Um in einer davon eine IPv6-Adresse abzugleichen, schreiben Sie das Literal in eckigen Klammern: "[::1]" passt auf diese Adresse an jedem Port, und "[::1]:443" passt nur an Port 443. Schreiben Sie den Port als Zahl von 1 bis 65535 ohne führende Nullen. Die Form in eckigen Klammern erfordert Claude Code v2.1.229 oder höher. Vor v2.1.229 las Claude Code den Text nach dem letzten Doppelpunkt eines Eintrags ohne Klammern als Port, wenn es sich um eine Portnummer handelte, sodass ::1:443 die Adresse ::1 an Port 443 bezeichnete.
Wenn Sie bei der Netzwerk-Genehmigungsabfrage für eine IPv6-Adresse „Yes, and don't ask again" wählen, speichert Claude Code die WebFetch(domain:...)-Regel mit der Adresse in eckigen Klammern, sodass die Regel die Adresse auch in zukünftigen Sitzungen weiterhin abgleicht.
Ein Eintrag ohne Klammern mit zwei oder mehr Doppelpunkten ist mehrdeutig: ::1:443 ist sowohl eine vollständige IPv6-Adresse als auch eine Adresse gefolgt von einem Port. Claude Code setzt mehrdeutige Schreibweisen konservativ durch, statt zu raten, welche Lesart Sie gemeint haben:
- Denylists: Claude Code sperrt jede Lesart, als die der Eintrag geparst werden kann, sodass die von Ihnen gemeinte Lesart in jedem Fall blockiert ist. Bei einem Eintrag ohne parsbare Lesart blockiert Claude Code nichts.
- Allowlists: Claude Code erlaubt nie mehr, als Sie geschrieben haben. Es schreibt einen mehrdeutigen Eintrag in seine Host-und-Port-Lesart um, wenn diese Lesart sauber geparst werden kann, und verwirft den Eintrag gegebenenfalls ganz, statt die Allowlist zu erweitern.
Führen Sie claude doctor in Ihrem Terminal aus, um die betroffenen Einträge zu finden: Die Warnung Sandbox network domain entries have unreliable spellings nennt bis zu drei davon und zählt die übrigen. Schreiben Sie jeden davon in die Form mit eckigen Klammern um, damit die Warnung verschwindet. Die Warnung nennt auch Einträge, deren Schreibweise aus anderen Gründen unzuverlässig ist, etwa wegen @, Pfad- oder Query-Zeichen oder Platzhaltern innerhalb eckiger Klammern.
Durchsetzung auf Betriebssystemebene
Das in einer Sandbox ausgeführte Bash-Tool verwendet Sicherheitsprimitive des Betriebssystems:
- macOS: verwendet Seatbelt zur Durchsetzung der Sandbox
- Linux: verwendet bubblewrap zur Isolation
- WSL2: verwendet bubblewrap, wie Linux
WSL1 wird nicht unterstützt, da bubblewrap Kernel-Funktionen benötigt, die nur in WSL2 verfügbar sind.
Sie können das Paket @anthropic-ai/sandbox-runtime auch eigenständig ausführen, um den Claude Code-Prozess zu umschließen. Siehe Sandbox-Laufzeit.
Wie Sandboxing sich auf Genehmigungen und Genehmigungsmodi bezieht
Sandboxing, Genehmigungsregeln und Genehmigungsmodi sind komplementäre Schichten. Die folgenden Abschnitte behandeln, wie die Sandbox mit jedem interagiert.
Genehmigungsregeln
Genehmigungsregeln und Sandboxing steuern verschiedene Dinge:
- Genehmigungsregeln steuern, welche Tools Claude Code verwenden kann, und werden evaluiert, bevor ein Tool ausgeführt wird. Sie gelten für alle Tools: Bash, Read, Edit, WebFetch, MCP und andere, außer dass eine Deny- oder Ask-Regel
EndConversationnicht blockieren kann, während ein anderes Tool verbleibt. - Sandboxing bietet OS-Level-Durchsetzung, die einschränkt, worauf Shell-Befehle auf Dateisystem- und Netzwerk-Ebene zugreifen können. Es gilt nur für Bash, PowerShell und Monitor-Befehle und ihre Kindprozesse.
Die beiden Schichten unterscheiden sich auch in ihrer Durchsetzung. Claude Code evaluiert Genehmigungsentscheidungen, bevor ein Befehl ausgeführt wird, basierend auf der Befehlszeichenfolge und, im Auto-Modus, dem Urteil eines separaten Klassifizierers darüber, ob der Befehl sicher ist. Das Betriebssystem erzwingt die Sandbox-Grenze auf dem laufenden Prozess, daher gilt sie unabhängig davon, was das Modell ausführen wollte, und selbst wenn ein zulässiger Befehl mehr tut als sein Name vermuten lässt.
Dateisystem- und Netzwerk-Einschränkungen werden sowohl durch Sandbox-Einstellungen als auch durch Genehmigungsregeln konfiguriert:
| Einstellung oder Regel | Was es tut |
|---|---|
sandbox.filesystem.allowWrite |
Gewährt Subprozess-Schreibzugriff auf Pfade außerhalb des Arbeitsverzeichnisses |
sandbox.filesystem.denyWrite und sandbox.filesystem.denyRead |
Blockiert Subprozess-Zugriff auf spezifische Pfade |
sandbox.filesystem.allowRead |
Erlaubt das Lesen spezifischer Pfade innerhalb einer denyRead-Region erneut |
sandbox.filesystem.disabled |
Deaktiviert die Dateisystem-Schicht vollständig, während die Netzwerk-Isolation beibehalten wird |
Edit Zulassungsregeln |
Gewähren Schreibzugriff auf spezifische Pfade, auf die gleiche Weise wie sandbox.filesystem.allowWrite |
Read und Edit Deny-Regeln |
Blockiert Zugriff auf spezifische Dateien oder Verzeichnisse |
WebFetch(domain:...) Zulassungs- und Deny-Regeln |
Steuern Domain-Zugriff |
Sandbox allowedDomains |
Steuert, auf welche Domains Shell-Befehle zugreifen können |
Sandbox deniedDomains |
Blockiert spezifische Domains, auch wenn ein breiteres allowedDomains-Wildcard sie sonst zulassen würde |
Pfade und Domains aus beiden Sandbox-Einstellungen und Genehmigungsregeln werden zusammengeführt in die endgültige Sandbox-Konfiguration.
Das Repository der claude-code mit Beispielen enthält Starter-Einstellungskonfigurationen für häufige Bereitstellungsszenarien, einschließlich Sandbox-spezifischer Beispiele. Verwenden Sie diese als Ausgangspunkte und passen Sie sie an Ihre Anforderungen an.
Genehmigungsmodi
/sandbox ist kein Genehmigungsmodus. Genehmigungsmodi entscheiden, ob ein Tool-Aufruf ausgeführt wird und ob Sie zuerst aufgefordert werden, während die Sandbox einschränkt, worauf ein Bash-Befehl zugreifen kann, sobald er ausgeführt wird. Sie unterscheiden sich darin, was sie steuern und was die Pro-Aktion-Eingabeaufforderung ersetzt:
| Was es steuert | Was die Eingabeaufforderung ersetzt | |
|---|---|---|
/sandbox |
Worauf ein Bash-Befehl zugreifen kann, sobald er ausgeführt wird | Die Sandbox-Grenze selbst, im Auto-Allow-Modus |
| Auto-Modus | Ob jeder Tool-Aufruf ausgeführt wird | Ein Klassifizierer, der Aktionen überprüft |
--dangerously-skip-permissions |
Ob jeder Tool-Aufruf ausgeführt wird | Nichts. Geschützte Pfad-Prüfungen werden auch übersprungen; die Aktionen, die kein Modus automatisch genehmigt, gelten immer noch |
Der Auto-Allow-Modus der Sandbox ist separat vom Auto-Modus: Auto-Allow genehmigt Bash-Befehle, weil die Sandbox-Grenze sie enthält, während der Auto-Modus einen Klassifizierer verwendet, um Aktionen zu überprüfen. Die beiden funktionieren unabhängig und können kombiniert werden, mit den Ausnahmen, die unter Sandbox-Modi aufgelistet sind. Um eine Isolationsgrenze für unbeaufsichtigte Läufe zu wählen, siehe Sandbox-Umgebungen. Eine Tabelle mit häufigen Genehmigungsmodus- und Sandbox-Paarungen mit den Flags, die jeweils starten, finden Sie unter Häufige Setups.
Konfigurieren Sie die Sandbox für Ihre Organisation
Administratoren können Sandboxing für jeden Benutzer erfordern, Entwickler daran hindern, die Richtlinie zu erweitern, und Sandbox-Datenverkehr durch einen Unternehmens-Proxy leiten.
Erzwingen Sie Sandboxing mit verwalteten Einstellungen
Um die Sandbox für jeden Entwickler zu erfordern, liefern Sie die sandbox-Schlüssel über verwaltete Einstellungen, entweder als Datei, die von Ihrem MDM verwaltet wird, oder über server-verwaltete Einstellungen auf claude.ai.
Die folgende Konfiguration verwalteter Einstellungen aktiviert die Sandbox, verweigert den Start von Claude Code, wenn die Plattform nicht unterstützt wird oder eine Abhängigkeit fehlt, und verhindert, dass das Modell Befehle außerhalb der Sandbox erneut versucht:
{
"sandbox": {
"enabled": true,
"failIfUnavailable": true,
"allowUnsandboxedCommands": false
}
}
Die beiden Schlüssel über enabled hinaus steuern, was passiert, wenn die Sandbox einen Befehl nicht ausführen kann:
failIfUnavailable: Eine fehlende Abhängigkeit wie bubblewrap auf Linux verhindert den Start von Claude Code, anstatt auf eine Ausführung ohne Sandbox zurückzufallenallowUnsandboxedCommands: false: Claude Code ignoriert diedangerouslyDisableSandbox-Fluchtluke. Wenn ein Befehl unter der Sandbox fehlschlägt, kann Claude ihn daher nicht ohne Sandbox erneut versuchen
Erwägen Sie zusätzlich diese Ergänzungen:
- Fügen Sie
excludedCommandsfür alle von der Organisation genehmigten Tools hinzu, die ohne Isolation ausgeführt werden müssen, da diese Konfiguration verhindert, dass die Einstellungen eines Repositorys Befehle aus der Sandbox herausnehmen - Fügen Sie
sandbox.credentials-Einträge für Anmeldedaten-Verzeichnisse wie~/.awsund~/.sshund für geheime Umgebungsvariablen hinzu, da die Standard-Leserichtlinie diese immer noch zulässt
Diese Konfiguration führt die Befehle, die Claude ausführt, in der Sandbox aus. Ein Entwickler kann immer noch einen Befehl an der !-Shell-Modus-Eingabeaufforderung eingeben und ihn außerhalb der Sandbox ausführen, mit dem gleichen Zugriff, den er bereits in jedem Terminal außerhalb von Claude Code hat. Siehe strikter Sandbox-Modus für die Sitzungen, in denen eingegebene Befehle in der Sandbox ausgeführt werden.
Die Sandbox läuft nicht auf nativem Windows, daher beendet sich Claude Code auf diesen Rechnern beim Start, wenn failIfUnavailable gesetzt ist. Wenn Ihre Flotte Windows-Hosts enthält, können Sie:
- Die Konfiguration nach Betriebssystem ausliefern: Stellen Sie sie über Ihr MDM oder als Datei für verwaltete Einstellungen nur auf macOS- und Linux-Rechnern bereit. Server-verwaltete Einstellungen gelten für alle Benutzer in der Organisation
- Windows-Benutzer in eine unterstützte Umgebung verlagern: Lassen Sie sie Claude Code in WSL2 oder einem Container ausführen
Verhindern Sie, dass Entwickler die Richtlinie erweitern
Wenn verwaltete Einstellungen einen booleschen Schlüssel wie enabled oder failIfUnavailable setzen, verwendet Claude Code den verwalteten Wert und ignoriert alles, was ein Entwickler lokal setzt. Für Array-Schlüssel wie allowRead führt Claude Code Einträge aus den Geltungsbereichen zusammen, die die Sitzung lädt, daher kann ein Entwickler Einträge anhängen, die die Richtlinie erweitern, sofern keine Sperre diesen Schlüssel abdeckt.
Sofern verwaltete Einstellungen sie nicht setzen, können die Benutzereinstellungen eines Entwicklers oder --settings die folgenden Schlüssel einschalten. Die .claude/settings.json eines Repositorys kann dies ebenfalls, es sei denn, die Sandbox ist vom Administrator erforderlich. Jeder dieser Schlüssel schwächt die Sandbox, setzen Sie ihn daher in verwalteten Einstellungen auf false, wenn Sie nicht möchten, dass er verwendet wird:
enableWeakerNestedSandboxenableWeakerNetworkIsolationnetwork.allowAllUnixSocketsnetwork.allowLocalBindingallowAppleEvents, den ein Repository nicht einschalten kann
Setzen Sie allowManagedReadPathsOnly auf true in verwalteten Einstellungen, damit nur allowRead-Einträge aus verwalteten Einstellungen berücksichtigt werden. Dies verhindert, dass Entwickler den Lesezugriff über die von der Organisation genehmigten Pfade hinaus erweitern.
Um Netzwerk-Domains auf die gleiche Weise auf die verwalteten Werte zu sperren, setzen Sie allowManagedDomainsOnly. Bei aktiver Sperre können nur verwaltete Einstellungen einen Proxy-Port setzen.
Wenn verwaltete Einstellungen sandbox.filesystem konfigurieren oder einen beliebigen sandbox.credentials.files-Eintrag mit "mode": "deny" auflisten, können nur verwaltete Einstellungen filesystem.disabled setzen, daher können Entwickler von Administratoren bereitgestellte Filesystem-Einschränkungen nicht ausschalten. Ob ein mask-Eintrag den Schlüssel fixiert, hängt davon ab, wie er sich auflöst; die Tabelle unter Welche Einstellungen können es deaktivieren behandelt die vier Fälle.
Repository-Einstellungen bei einer vom Administrator erforderlichen Sandbox
Die Sandbox ist vom Administrator erforderlich, solange eine dieser Einstellungen wirksam ist:
allowUnsandboxedCommandsist in verwalteten Einstellungen auffalsegesetzt, oder mit dem--settings-Flag, sofern verwaltete Einstellungen es nicht auftruesetzenallowManagedDomainsOnlyist in verwalteten Einstellungen auftruegesetzt
Diese Einstellungen schalten die Sandbox nicht ein, setzen Sie daher auch enabled.
Solange die Sandbox vom Administrator erforderlich ist, übernimmt Claude Code die Einstellungen, die sie lockern, nur aus verwalteten Einstellungen, dem --settings-Flag und der ~/.claude/settings.json jedes Entwicklers. Diese Einstellungen in der .claude/settings.json und .claude/settings.local.json eines Repositorys ignoriert es:
| Repository-Einstellung | Was Claude Code ignoriert |
|---|---|
excludedCommands, ignoreViolations, network.allowedDomains, network.allowUnixSockets, network.allowMachLookup, network.httpProxyPort, network.socksProxyPort |
Jeden Eintrag |
filesystem.allowWrite, Edit(...)-Allow-Regeln, permissions.additionalDirectories |
Den Schreibzugriff, den jeder Eintrag Befehlen in der Sandbox gewährt. Claudes Datei-Tools befolgen weiterhin die Edit(...)-Regeln und zusätzlichen Verzeichnisse |
WebFetch(domain:...)-Allow-Regeln |
Den Host, den jede Regel zur Sandbox-Allowlist hinzufügt. Das WebFetch-Tool befolgt die Regel weiterhin |
enableWeakerNestedSandbox, enableWeakerNetworkIsolation, network.allowAllUnixSockets, network.allowLocalBinding |
true. Ein false gilt weiterhin |
enabled, failIfUnavailable |
false, wenn die ~/.claude/settings.json des Entwicklers true setzt |
filesystem.allowRead |
Einen Eintrag an oder unterhalb eines Pfads, dessen Lesen verwaltete Einstellungen, --settings oder Benutzereinstellungen verweigern, oder ein Glob, der einen solchen treffen könnte |
Diese Einstellungen gelten weiterhin, solange die Sandbox vom Administrator erforderlich ist:
- In den Dateien eines Repositorys: Deny-Einträge und der Wert von
autoAllowBashIfSandboxed. Setzen Sie den Schlüssel in verwalteten Einstellungen, um zu verhindern, dass ein Repository ihn ändert - In den eigenen Einstellungen eines Entwicklers: Die Einstellungen aus der Tabelle gelten weiterhin aus
~/.claude/settings.jsonoder--settings, sofern keine nur verwaltete Sperre wieallowManagedDomainsOnlysie abdeckt. Die meisten davon, etwaexcludedCommandsundfilesystem.allowWrite, haben keine nur verwaltete Sperre
Die Konfiguration unter Erzwingen Sie Sandboxing mit verwalteten Einstellungen macht die Sandbox vom Administrator erforderlich. Fügen Sie die excludedCommands-, allowWrite- und Socket-Einträge, die Ihre genehmigten Tools benötigen, zu verwalteten Einstellungen hinzu, da ein Repository sie nicht bereitstellen kann.
Erfordert Claude Code v2.1.285 oder höher. Von v2.1.282 bis v2.1.284 führten dieselben Einstellungen dazu, dass Claude Code die excludedCommands-Einträge eines Repositorys ignorierte.
Sperren, die ohne eine vom Administrator erforderliche Sandbox gelten
Einige Einstellungen führen dazu, dass Claude Code die Repository-Schlüssel ignoriert, die eine Einschränkung direkt überschreiben, selbst wenn die Sandbox nicht vom Administrator erforderlich ist. Jede davon hat diese Wirkung nur, wenn Sie sie in einer Datei setzen, die in ihrer Zeile genannt ist, und die anderen Sandbox-Einstellungen des Repositorys gelten weiterhin. Erfordert Claude Code v2.1.285 oder höher.
| Einstellung | Wo Sie sie setzen | Was Claude Code in den Einstellungen eines Repositorys ignoriert |
|---|---|---|
network.deniedDomains oder eine WebFetch(domain:...)-Deny-Regel |
Verwaltete Einstellungen, --settings |
httpProxyPort und socksProxyPort |
network.strictAllowlist |
Verwaltete Einstellungen, --settings, Benutzereinstellungen |
Die Proxy-Ports, allowedDomains und WebFetch(domain:...)-Allow-Regeln |
filesystem.denyRead, eine Read(...)-Deny-Regel oder ein credentials.files-Eintrag |
Verwaltete Einstellungen, --settings |
Einen allowRead-, allowWrite-, Edit(...)-Allow- oder additionalDirectories-Eintrag an oder unterhalb eines Pfads, dessen Lesen verwaltete Einstellungen, --settings oder Benutzereinstellungen verweigern, oder ein Glob, der einen solchen treffen könnte |
Diese Sperren ändern, was Befehle in der Sandbox erreichen können. Das WebFetch-Tool und Claudes Datei-Tools befolgen weiterhin die Regeln und zusätzlichen Verzeichnisse eines Repositorys.
Benutzerdefinierte Proxy-Konfiguration
Um Sandbox-Datenverkehr mit Ihren eigenen Tools zu inspizieren, zu filtern oder zu protokollieren, ersetzen Sie den integrierten Sandbox-Proxy durch einen Proxy, den Sie auf demselben Rechner betreiben.
Um Sandbox-Datenverkehr stattdessen durch einen Unternehmens-Proxy an anderer Stelle in Ihrem Netzwerk zu leiten, setzen Sie HTTPS_PROXY, wie es der Eintrag Unternehmens-Proxy unter Netzwerkisolation beschreibt. Auf diese Weise gilt die Allowlist von Claude Code weiterhin.
Um Befehle in der Sandbox an Ihren Proxy zu leiten, setzen Sie die localhost-Ports, auf denen er lauscht, in Sandbox-Einstellungen:
{
"sandbox": {
"network": {
"httpProxyPort": 8080,
"socksProxyPort": 8081
}
}
}
Wenn Sie einen Port setzen und außerdem HTTPS_PROXY oder HTTP_PROXY setzen, leitet Claude Code das, was Befehle in der Sandbox an Ihren Proxy senden, nicht an den Proxy weiter, den diese Variablen nennen. Um einen Unternehmens-Proxy zu erreichen, konfigurieren Sie Ihren eigenen Proxy so, dass er an diesen weiterleitet.
Welche Dateien einen Port setzen können, hängt von Ihren anderen Sandbox-Einstellungen ab:
allowManagedDomainsOnlyist aktiviert: nur verwaltete Einstellungen- Die Sandbox ist vom Administrator erforderlich, oder eine engere Netzwerksperre gilt: verwaltete Einstellungen,
--settingsund Benutzereinstellungen - Andernfalls: jede Einstellungsdatei
Claude Code ignoriert einen Port, der an anderer Stelle gesetzt ist. Vor v2.1.285 konnte jede Einstellungsdatei einen Port setzen.
Sobald einer der beiden Ports gilt, ist Ihr Proxy dafür verantwortlich, alles zu filtern, was an ihn gesendet wird. Die eigenen Netzwerkkontrollen von Claude Code, wie allowedDomains, deniedDomains, strictAllowlist, Genehmigungsabfragen und die Prüfung auf lokale Adressen, gelten für diesen Datenverkehr nicht mehr. Ein Befehl in der Sandbox kann sich mit jedem der beiden Proxys verbinden. Wenn Sie also nur einen Port setzen, begrenzen die Domain-Listen von Claude Code auf dem anderen Proxy nicht, was der Befehl über Ihren Proxy erreicht.
Fehlerbehebung
Einige Befehle schlagen in der Sandbox fehl, obwohl sie außerhalb funktionieren. Die folgende Liste enthält kurze Lösungen. Fehler, die eine längere Erklärung erfordern, haben jeweils eine eigene Überschrift.
Wenn die Sandbox Ihrer Organisation vom Administrator vorgeschrieben ist, ignoriert Claude Code die in diesen Lösungen genannten Einstellungen in den Einstellungsdateien eines Projekts. Speichern Sie sie daher in ~/.claude/settings.json, wo sie in jedem Projekt gelten. Wenn eine Lösung trotzdem keine Wirkung zeigt, setzen die verwalteten Einstellungen Ihrer Organisation möglicherweise diesen Schlüssel.
Eine Lösung, die ein excludedCommands-Muster hinzufügt, nimmt die Befehle, auf die das Muster zutrifft, aus der Sandbox heraus. Siehe was ein ausgeschlossener Befehl tun kann.
-
Befehle schlagen mit einem host-not-allowed-Fehler fehl: Viele CLI-Tools müssen bestimmte Hosts erreichen. Genehmigen Sie den Host, wenn Sie gefragt werden, oder fügen Sie ihn zu
allowedDomainshinzu. Wenn Ihre Organisation die Allowlist mitallowManagedDomainsOnlysperrt, erscheint keine Abfrage; bitten Sie in diesem Fall Ihren Administrator, den Host hinzuzufügen. -
jesthängt oder schlägt fehl:watchmanist nicht kompatibel mit der Sandbox. Führen Sie stattdessenjest --no-watchmanaus. -
Go-basierte CLIs schlagen bei der TLS-Verifizierung auf macOS fehl: Tools wie
gh,gcloudundterraformkönnen unter Seatbelt bei der TLS-Verifizierung fehlschlagen. Fügen Sie für jedes Tool ein Muster wiegh *zuexcludedCommandshinzu. Das Tool läuft dann mit Ihrem vollen Zugriff und seinen gespeicherten Anmeldedaten. Wenn SiehttpProxyPortmit einem MITM-Proxy und einer benutzerdefinierten CA verwenden, setzen Sie stattdessenenableWeakerNetworkIsolationauftrue. -
open,osascriptoder browserbasierte Authentifizierungsabläufe schlagen mit Fehler-600auf macOS fehl: Die Sandbox blockiert Apple Events standardmäßig. Setzen SieallowAppleEventsin Ihren Benutzer-, verwalteten oder CLI-Einstellungen auftrue, um diese zuzulassen. Projekteinstellungen werden für diesen Schlüssel ignoriert. Das Aktivieren hebt die Isolation der Codeausführung auf, da in der Sandbox ausgeführte Befehle dann ohne Benutzerabfrage andere Anwendungen außerhalb der Sandbox starten und AppleScript-Befehle an laufende Anwendungen senden können, vorbehaltlich der macOS-Abfrage zur Automatisierungszustimmung (TCC). Alternativ können Sie ein Muster wieopen *zuexcludedCommandshinzufügen. Jederopen-Aufruf durchläuft dann den Berechtigungsablauf, undopenkann jede Datei oder App starten, auch eine, die Claude geschrieben hat. -
docker-Befehle schlagen fehl:dockerist nicht kompatibel mit der Sandbox. Nehmen Sie die benötigtendocker-Befehle mit einemexcludedCommands-Muster wiedocker compose *aus der Sandbox heraus. Dieser Abschnitt erklärt, was ein ausgeschlossenerdocker-Befehl erreichen kann. Ein engeres Muster nimmt weniger Befehle aus der Sandbox heraus. -
pbcopy,xclipoderwl-copyaktualisiert die Zwischenablage nicht: Diese Zwischenablage-Dienstprogramme können aus der Sandbox heraus die Systemzwischenablage möglicherweise nicht erreichen, in welchem Fall der Text, der an sie weitergeleitet wird, nicht ankommt.Um Claudes Ausgabe in Ihre Zwischenablage zu kopieren, bitten Sie Claude, sie in seiner Antwort auszugeben, und führen Sie dann
/copyaus./copyschreibt aus dem Claude Code-Prozess in die Zwischenablage, nicht aus einem in der Sandbox ausgeführten Befehl.Wenn Claude Text an eines dieser Tools weiterleitet, nimmt das Hinzufügen des Tools zu
excludedCommandsdiesen Aufruf nicht von sich aus aus der Sandbox heraus. -
Ein git-Befehl schlägt mit
unable to unlink oldfehl:git merge,git checkoutund ähnliche Befehle schlagen auf diese Weise fehl, wenn sie eine Datei ersetzen müssen, in die die Sandbox Schreibvorgänge verweigert, unabhängig davon, ob sich diese Datei unter einem geschützten Pfad wie.claude/skillsbefindet, unter einem IhrerdenyWrite-Einträge oder außerhalb der Verzeichnisse, in die die Sandbox Befehle überhaupt schreiben lässt. Unter Linux und WSL2 endet der Fehler mitRead-only file system.Nach dem Fehler kann Claude anbieten, den Befehl außerhalb der Sandbox erneut auszuführen; genehmigen Sie diesen Wiederholungsversuch, oder führen Sie den git-Befehl selbst in einem anderen Terminal aus. Wenn Sie
allowUnsandboxedCommandsauffalsegesetzt haben, kann Claude den Wiederholungsversuch nicht anbieten, also führen Sie den Befehl selbst aus. -
Bubblewrap startet in einem Container nicht: In einem unprivilegierten Container kann bubblewrap kein neues
/proc-Dateisystem einhängen, daher schlagen in der Sandbox ausgeführte Befehle mit einembwrap-Fehler wieCan't mount proc on /newroot/proc: Operation not permittedfehl. Setzen SieenableWeakerNestedSandboxauftrue, damit die innere Sandbox stattdessen das vorhandene/procdes Containers per Bind-Mount einbindet. Verwenden Sie diese Einstellung nur, wenn der äußere Container bereits die Isolationsgrenze bietet, die Sie benötigen, da sie in der Sandbox ausgeführten Befehlen Prozessinformationen zugänglich macht, die ein neu eingehängtes/procverbergen würde. -
Schreibgeschützte 0-Byte-Dateien erscheinen in
.claude-Einstellungspfaden, und „Ja, und nicht mehr fragen" wird nicht gespeichert: Unter Linux und WSL2 setzt die Sandbox eine Schreibsperre für eine noch nicht existierende Datei durch, indem sie dort einen schreibgeschützten 0-Byte-Platzhalter erstellt, während ein Befehl in der Sandbox ausgeführt wird. Die Sandbox entfernt den Platzhalter danach. Wenn eine Sitzung vor dieser Bereinigung beendet wird, beispielsweise durch SIGKILL, bleiben die Platzhalter bestehen. Spätere Sitzungen binden sie bei jedem Start erneut schreibgeschützt ein, daher schlägt ein Schreibvorgang in die Einstellungen, etwa das Speichern einer Berechtigungswahl, dort fehl, wo einer vorhanden ist.Führen Sie
claude doctoraus, um die verbleibenden Platzhalter-Dateien aufzulisten. Die WarnungStale sandbox mask files left by a killed sessionnennt bis zu drei davon und zählt den Rest. Löschen Sie jede Datei mitrm, während keine andere Claude Code-Sitzung in diesem Projekt ausgeführt wird. Vor v2.1.257 ließ Claude Code dieselben Platzhalter ohne Kennzeichnung zurück. -
--dangerously-skip-permissionsschlägt als root fehl: Dieses Flag wird blockiert, wenn es als root oder über sudo unter Linux und macOS ausgeführt wird, da root-Zugriff in Kombination mit fehlenden Berechtigungsabfragen jede Datei und jeden Dienst auf dem System ändern kann. Die Überprüfung wird in einer erkannten Sandbox automatisch übersprungen. Um autonom in einem Container zu laufen, verwenden Sie die Dev-Container-Konfiguration, die Claude Code als Nicht-Root-Benutzer ausführt.
`git` über SSH schlägt bei aktivierter Sandbox fehl
Unter macOS schlagen git fetch, git pull und git push gegen ein SSH-Remote in der Sandbox fehl, selbst wenn der Host zugelassen ist. Unter Linux und WSL2 funktionieren sie, sobald der Host zugelassen ist. Claude Code tunnelt die SSH-Verbindung von git durch den Sandbox-Proxy, und der macOS-Tunnel kann sich nicht bei diesem Proxy authentifizieren.
Prüfen Sie unter Linux und WSL2 Folgendes, wenn die Verbindung weiterhin fehlschlägt:
- Der Host ist auf Port 22 zugelassen: Ein
allowedDomains-Eintrag ohne Port, etwa"git.example.com", deckt dies ab - Ihr Unternehmensproxy lässt Port 22 zu: Wenn Ihr Netzwerk einen Upstream-Proxy erfordert, läuft auch der Tunnel darüber
- Der Schlüssel ist als Datei lesbar: Die Sandbox kann den
ssh-agent-Socket blockieren, und eindenyRead- odercredentials-Eintrag für~/.sshverbirgt Ihre Schlüsseldateien
Stellen Sie unter macOS das Remote auf HTTPS um, wofür HTTPS-Anmeldedaten wie ein Personal Access Token erforderlich sind:
git remote set-url origin https://git.example.com/example-org/example-repo.git
Wenn Sie das SSH-Remote beibehalten müssen, nehmen Sie die Netzwerkbefehle von git mit excludedCommands aus der Sandbox heraus:
{
"sandbox": {
"excludedCommands": ["git fetch *", "git pull *", "git push *"]
}
}
Diese Einträge treffen auf git push origin main zu. Ein Aufruf, der ein cd hinzufügt, git -C verwendet oder eine Befehlssubstitution enthält, bleibt in der Sandbox. Die ausgeschlossenen git-Befehle können jeden Host erreichen, nicht nur die in allowedDomains.
Einfaches ssh, scp und rsync über SSH schlagen aus dem Grund fehl, den der Eintrag zu Datenbank-Clients nennt.
Ein Datenbank-Client oder ein anderes Nicht-HTTP-Tool erreicht einen zugelassenen Host nicht
Ein Tool, das die Proxy-Umgebungsvariablen ignoriert, kann sich aus der Sandbox heraus nicht verbinden, nicht einmal mit einem Host in allowedDomains. Ein in der Sandbox ausgeführter Befehl hat keinen direkten Weg ins Netzwerk, daher schlägt ein Tool fehl, das seine eigene Verbindung öffnet. Die meisten Datenbanktreiber, einfaches ssh und Tools, die UDP verwenden, verhalten sich so.
Der Fehler sieht wie ein Netzwerk- oder Namensauflösungsfehler aus:
- macOS:
Operation not permittedoder ein Namensauflösungsfehler wieCould not resolve host - Linux und WSL2:
Network is unreachableoder ein Namensauflösungsfehler wieTemporary failure in name resolution
Ein Tool, das den Proxy verwendet, schlägt anders fehl, wenn sein Host nicht zugelassen ist. Sie erhalten eine Netzwerkabfrage, oder das Tool erhält eine 403-Antwort vom Proxy.
Damit sich das Tool verbinden kann, führen Sie den Befehl, der es benötigt, mit excludedCommands außerhalb der Sandbox aus. Dieses Beispiel schließt ein Skript aus und fügt eine Ask-Regel hinzu, sodass Sie jede Ausführung genehmigen:
{
"sandbox": {
"excludedCommands": ["python scripts/load_orders.py *"]
},
"permissions": {
"ask": ["Bash(python scripts/load_orders.py *)"]
}
}
Das Skript läuft mit Ihrem vollen Zugriff, und Claude kann ein Skript bearbeiten, das sich in Ihrem Arbeitsverzeichnis befindet. Prüfen Sie es daher, wenn die Abfrage erscheint.
Ein Befehl erreicht einen Server auf localhost nicht
Standardmäßig kann sich ein in der Sandbox ausgeführter Befehl nicht direkt mit einem Server verbinden, der auf Ihrem Rechner außerhalb der Sandbox läuft, etwa einem Dev-Server oder einer Datenbank in einem Container. Was Sie ändern können, hängt von Ihrer Plattform ab:
- macOS: Setzen Sie
network.allowLocalBindingauftrue. In der Sandbox ausgeführte Befehle können dann auf Netzwerkports lauschen und sich mit jedem Port auf localhost verbinden, was jeden anderen dort lauschenden Dienst einschließt. Ein localhost-Dienst, der keine Authentifizierung erfordert, etwa ein Debugger, kann dann für den Befehl außerhalb der Sandbox handeln, und ein Befehl, der auf einer Nicht-Loopback-Adresse lauscht, nimmt Verbindungen von anderen Rechnern an - Linux und WSL2: Das
localhosteines in der Sandbox ausgeführten Befehls ist privat für diesen Befehl. Der Befehl kann auf einem Port lauschen und Server erreichen, die er selbst gestartet hat. Eine direkte Verbindung zulocalhostoder127.0.0.1erreicht keine Server auf dem Host, undallowLocalBindinghat keine Wirkung. Führen Sie den Befehl, der den Server des Hosts benötigt, mitexcludedCommandsaußerhalb der Sandbox aus, wo er keinen Dateisystem- oder Netzwerkbeschränkungen unterliegt. Für Verbindungen, die über den Sandbox-Proxy laufen, siehe Hostnamen, die zu lokalen Adressen aufgelöst werden
Dieses Beispiel aktiviert die Einstellung für macOS:
{
"sandbox": {
"network": {
"allowLocalBinding": true
}
}
}
Ein allowedDomains-Eintrag für localhost gilt für Verbindungen, die über den Proxy laufen, und ändert daher keine direkte Verbindung. Claude Code setzt NO_PROXY für in der Sandbox ausgeführte Befehle, damit sie sich direkt statt über den Proxy mit localhost verbinden. Der Eintrag macht außerdem jeden Port auf dem localhost Ihres Rechners für einen Befehl zugänglich, der den Proxy tatsächlich verwendet. Für einen Entwicklungs-Hostnamen, der auf 127.0.0.1 zeigt, siehe Ein zugelassener Hostname wird mit resolved to a loopback address abgelehnt.
Ein zugelassener Hostname wird mit `resolved to a loopback address` abgelehnt
Der Sandbox-Proxy lehnt einen zugelassenen Hostnamen ab, der zu einer lokalen Adresse aufgelöst wird. Das betrifft Entwicklungsnamen wie myapp.test, die auf 127.0.0.1 zeigen. Der Befehl erhält eine 403-Antwort, deren Response-Body die Art der Adresse nennt, etwa Connection to myapp.test blocked: resolved to a loopback address.
Fügen Sie die IP-Adresse, zu der der Name aufgelöst wird, zusammen mit dem Hostnamen zu allowedDomains hinzu, jeweils mit dem Port, auf dem Ihr Server lauscht:
{
"sandbox": {
"network": {
"allowedDomains": ["myapp.test:3000", "127.0.0.1:3000"]
}
}
}
Ein IP-Adress-Eintrag ohne Port ermöglicht in der Sandbox ausgeführten Befehlen, jeden Dienst zu erreichen, der auf dieser Adresse lauscht.
Vor v2.1.284 verband sich der Proxy mit der Adresse, zu der ein zugelassener Hostname aufgelöst wurde, ganz gleich, welche es war.
`/sandbox` schlägt mit `Sandbox settings are overridden by a higher-priority configuration` fehl
/sandbox gibt Error: Sandbox settings are overridden by a higher-priority configuration and cannot be changed locally. aus, statt sein Panel zu öffnen, wenn eine höhere Einstellungsebene sandbox.enabled, sandbox.autoAllowBashIfSandboxed oder sandbox.allowUnsandboxedCommands setzt. Das Panel speichert Ihre Auswahl in .claude/settings.local.json, und ein dort gespeicherter Wert kann diese Ebenen nicht überschreiben.
Verwaltete Einstellungen und --settings haben Vorrang vor lokalen Einstellungen. Um zu sehen, welche davon diese Sitzung geladen hat, führen Sie /status aus und lesen Sie die Zeile Setting sources:
Command line arguments: Wenn Sie Claude Code mit--settingsgestartet haben, prüfen Sie, ob die übergebene Datei oder das übergebene JSON einen dieser Schlüssel setzt. Falls ja, ändern Sie den Wert dort, oder starten Sie Claude Code erneut ohne diese Schlüssel.Enterprise managed settings: Die verwalteten Einstellungen Ihrer Organisation sind geladen. Wenn sie einen dieser Schlüssel setzen, können Sie diesen Schlüssel weder über/sandboxnoch über eine von Ihnen kontrollierte Einstellungsdatei ändern. Wenden Sie sich in diesem Fall an Ihren Administrator.
Einschränkungen
Sandboxing reduziert das Risiko, ist aber keine vollständige Isolationsgrenze. Überprüfen Sie die folgenden Einschränkungen, bevor Sie sich darauf als Hard-Sicherheitskontrolle verlassen.
Sicherheitsbeschränkungen
- Netzwerk-Filterung: Die Sandbox schränkt ein, mit welchen Domains Prozesse sich verbinden können. Standardmäßig beendet oder inspiziert der integrierte Proxy TLS auf ausgehenden Datenverkehr nicht, daher werden die Inhalte verschlüsselter Verbindungen nicht untersucht. Die experimentelle Einstellung
network.tlsTerminatebeendet TLS am Proxy fürmask-Anmeldedaten-Substitution, fügt aber keine Inhaltsfilterung hinzu. Sie sind verantwortlich dafür, dass nur vertrauenswürdige Domains in Ihrer Richtlinie zulässig sind.
Das Zulassen breiter Domains wie github.com kann Pfade für Datenexfiltration schaffen. Da der Proxy seine Zulassungsentscheidung vom Client-bereitgestellten Hostnamen trifft, ohne TLS zu inspizieren, kann Code, der in der Sandbox ausgeführt wird, möglicherweise Domain Fronting oder ähnliche Techniken verwenden, um Hosts außerhalb der Allowlist zu erreichen. Wenn Ihr Bedrohungsmodell stärkere Garantien erfordert, konfigurieren Sie einen benutzerdefinierten Proxy, der TLS beendet und Datenverkehr inspiziert, und installieren Sie sein CA-Zertifikat in der Sandbox. Stärkere TLS-bewusste Netzwerk-Isolation ist ein aktives Entwicklungsgebiet.
- Privilege Escalation über Unix-Sockets: Die Konfiguration
allowUnixSocketskann versehentlich Zugriff auf System-Services gewähren, die zu Sandbox-Umgehungen führen könnten. Wenn Sie beispielsweise Zugriff auf/var/run/docker.sockzulassen, würde dies effektiv Zugriff auf das Host-System durch den Docker-Socket gewähren. Überdenken Sie sorgfältig alle Unix-Sockets, die Sie durch die Sandbox zulassen. - Dateisystem-Berechtigungseskalation: Übermäßig breite Dateisystem-Schreibberechtigungen können Privilege-Escalation-Angriffe ermöglichen. Das Zulassen von Schreibvorgängen zu Verzeichnissen, die ausführbare Dateien in
$PATH, System-Konfigurationsverzeichnisse oder Benutzer-Shell-Konfigurationsdateien wie.bashrcoder.zshrcenthalten, kann zu Code-Ausführung in verschiedenen Sicherheitskontexten führen, wenn andere Benutzer oder System-Prozesse auf diese Dateien zugreifen. - Linux-Sandbox-Stärke: Die Linux-Implementierung bietet starke Dateisystem- und Netzwerk-Isolation, enthält aber einen
enableWeakerNestedSandbox-Modus, der es ermöglicht, in Docker-Umgebungen ohne privilegierte Namespaces zu funktionieren. Diese Option schwächt die Sicherheit erheblich ab und sollte nur verwendet werden, wenn zusätzliche Isolation anderweitig durchgesetzt wird. - Apple Events auf macOS: Die macOS-Sandbox blockiert Apple Events standardmäßig. Die Einstellung
allowAppleEventshebt diese Einschränkung auf, damit Tools wieopenundosascriptfunktionieren, aber es entfernt Code-Ausführungs-Isolation: In der Sandbox ausgeführte Befehle können andere Anwendungen ohne Sandbox und ohne Rückfrage beim Benutzer starten und können AppleScript-Befehle an laufende Anwendungen senden, vorbehaltlich der macOS-Zustimmungsabfrage für Automatisierung pro App (TCC). Es wird nur von Benutzer-, verwalteten oder CLI-Einstellungen berücksichtigt. Projekteinstellungen können es nicht aktivieren.
Plattform- und Tool-Kompatibilität
- Plattform-Unterstützung: Unterstützt macOS, Linux und WSL2. WSL1 und native Windows werden nicht unterstützt.
- Performance-Overhead: Minimal, aber einige Dateisystem-Operationen können leicht langsamer sein.
- Tool-Kompatibilität: Einige Tools, die spezifische System-Zugriffsmuster erfordern, benötigen möglicherweise Konfigurationsanpassungen oder müssen möglicherweise außerhalb der Sandbox ausgeführt werden.
Umfang
Die Sandbox isoliert Shell-Befehle und deren untergeordnete Prozesse. Was außerhalb der Sandbox ausgeführt wird listet die Tools und Hilfsprozesse auf, die sie nicht abdeckt. Computer-Nutzung und Subagenten verhalten sich in Bezug auf die Sandbox wie folgt:
- Computer-Nutzung: Wenn Claude Apps öffnet und Ihren Bildschirm steuert, läuft es auf Ihrem tatsächlichen Desktop, anstatt in einer isolierten Umgebung. Berechtigungsabfragen pro App kontrollieren jede Anwendung. Siehe Computer-Nutzung in der CLI oder Computer-Nutzung auf Desktop.
- Subagenten: Subagenten laufen im gleichen Prozess wie die übergeordnete Sitzung und verwenden die gleiche Sandbox-Konfiguration. Bash-Befehle in einem Subagenten werden in der Sandbox ausgeführt, wenn Sandboxing in der übergeordneten Sitzung aktiviert ist.
- Mods: Ein Mod ist ein Plugin, das seinen eigenen Code innerhalb von Claude Code ausführt, und ein Prozess, den ein Mod startet, läuft außerhalb der Sandbox. Siehe Was ein Mod erreichen kann.
Effektives Sandboxing erfordert sowohl Dateisystem- als auch Netzwerk-Isolation. Ohne Netzwerk-Isolation könnte ein kompromittierter Agent sensible Dateien wie SSH-Schlüssel exfiltrieren. Ohne Dateisystem-Isolation, ob durch eine permissive Richtlinie oder durch Deaktivierung der Dateisystem-Schicht, könnte ein kompromittierter Agent System-Ressourcen manipulieren, um Netzwerkzugriff zu erlangen. Wenn Sie die Standardwerte erweitern, überprüfen Sie, dass ein allowWrite-Pfad, ein breiter allowedDomains-Eintrag oder eine excludedCommands-Ausnahme keine Einschränkung auf der anderen Seite rückgängig macht.
Siehe auch
- Sandbox-Umgebungen: Vergleichen Sie die integrierte Sandbox mit Dev-Containern, Containern und VMs
- Sicherheit: Umfassende Sicherheitsfeatures und Best Practices
- Genehmigungen: Genehmigungskonfiguration und Zugriffskontrolle
- Alle Einstellungen: Jeder Einstellungsschlüssel
- CLI-Referenz: Befehlszeilenoptionen