Gateway
Sandboxing
OpenClaw può eseguire gli strumenti all'interno di un backend sandbox per ridurre il raggio d'impatto. L'uso della sandbox è disattivato per impostazione predefinita ed è controllato da agents.defaults.sandbox (globale) o agents.list[].sandbox (per agente). Il processo Gateway rimane sempre sull'host; quando la sandbox è abilitata, solo l'esecuzione degli strumenti viene spostata al suo interno.
Cosa viene eseguito nella sandbox
- Esecuzione degli strumenti:
exec,read,write,edit,apply_patch,processe così via. - Il browser opzionale eseguito nella sandbox (
agents.defaults.sandbox.browser).
Non vengono eseguiti nella sandbox:
- Il processo Gateway stesso.
- Qualsiasi strumento esplicitamente autorizzato a essere eseguito all'esterno della sandbox tramite
tools.elevated. L'esecuzione con privilegi elevati elude la sandbox e utilizza il percorso di uscita configurato (gatewayper impostazione predefinita oppurenodequando la destinazione di esecuzione ènode). Se la sandbox è disattivata,tools.elevatednon cambia nulla, poiché l'esecuzione avviene già sull'host. Consulta Modalità con privilegi elevati.
Modalità, ambito e backend
Tre impostazioni indipendenti controllano il comportamento della sandbox:
| Impostazione | Chiave | Valori | Predefinito |
|---|---|---|---|
| Modalità | agents.defaults.sandbox.mode |
off, non-main, all |
off |
| Ambito | agents.defaults.sandbox.scope |
agent, session, shared |
agent |
| Backend | agents.defaults.sandbox.backend |
docker, ssh, openshell |
docker |
La modalità controlla quando viene applicata la sandbox:
off: nessuna sandbox.non-main: esegue nella sandbox ogni sessione tranne la sessione principale dell'agente. La chiave della sessione principale è sempreagent:<agentId>:main(oppureglobalquandosession.scopeè"global"); non è configurabile. Le sessioni di gruppo/canale utilizzano chiavi proprie, quindi sono sempre considerate non principali e vengono eseguite nella sandbox.all: ogni sessione viene eseguita in una sandbox.
L'ambito controlla quanti contenitori/ambienti vengono creati:
agent: un contenitore per agente.session: un contenitore per sessione.shared: un contenitore condiviso da tutte le sessioni eseguite nella sandbox (con questo ambito, le sostituzionidocker/ssh/browserper agente vengono ignorate).
Il backend controlla quale runtime esegue gli strumenti nella sandbox. La configurazione specifica per SSH si trova in agents.defaults.sandbox.ssh; quella specifica per OpenShell si trova in plugins.entries.openshell.config.
| Docker | SSH | OpenShell | |
|---|---|---|---|
| Dove viene eseguito | Contenitore locale | Qualsiasi host accessibile tramite SSH | Sandbox gestita da OpenShell |
| Configurazione | scripts/sandbox-setup.sh |
Chiave SSH + host di destinazione | Plugin OpenShell abilitato |
| Modello dello spazio di lavoro | Montaggio associato o copia | Remoto canonico (inizializzazione unica) | mirror o remote |
| Controllo della rete | docker.network (predefinito: nessuno) |
Dipende dall'host remoto | Dipende da OpenShell |
| Sandbox del browser | Supportata | Non supportata | Non ancora supportata |
| Montaggi associati | docker.binds |
N/D | N/D |
| Ideale per | Sviluppo locale, isolamento completo | Delega a una macchina remota | Sandbox remote gestite con sincronizzazione bidirezionale opzionale |
Backend Docker
Docker è il backend predefinito quando viene abilitata la sandbox. Esegue localmente gli strumenti e i browser nella sandbox tramite il socket del daemon Docker (/var/run/docker.sock); l'isolamento è fornito dagli spazi dei nomi Docker.
Valori predefiniti: network: "none" (nessun traffico in uscita), readOnlyRoot: true, capDrop: ["ALL"], immagine openclaw-sandbox:bookworm-slim.
Per rendere disponibili le GPU dell'host, imposta agents.defaults.sandbox.docker.gpus (o la sostituzione per agente) su un valore come "all" o "device=GPU-uuid". Il valore viene passato al flag --gpus di Docker e richiede un runtime host compatibile, come NVIDIA Container Toolkit.
Browser nella sandbox
- Il browser nella sandbox si avvia automaticamente (assicurando che CDP sia raggiungibile) quando lo strumento browser ne ha bisogno. Configuralo tramite
agents.defaults.sandbox.browser.autoStart(valore predefinitotrue) eautoStartTimeoutMs(valore predefinito 12 s). - I contenitori del browser nella sandbox utilizzano una rete Docker dedicata (
openclaw-sandbox-browser) invece della rete globalebridge. Configurala conagents.defaults.sandbox.browser.network. agents.defaults.sandbox.browser.cdpSourceRangelimita l'ingresso CDP al confine del contenitore tramite un elenco CIDR consentito (ad esempio172.21.0.1/32).- Per impostazione predefinita, l'accesso dell'osservatore noVNC è protetto da password; OpenClaw genera un URL con token di breve durata che fornisce una pagina di avvio locale e apre noVNC con la password nel frammento dell'URL, non nella stringa di query o nei log delle intestazioni.
agents.defaults.sandbox.browser.allowHostControl(valore predefinitofalse) consente alle sessioni nella sandbox di selezionare esplicitamente il browser dell'host come destinazione.- Elenchi consentiti opzionali controllano
target: "custom":allowedControlUrls,allowedControlHosts,allowedControlPorts.
Backend SSH
Usa backend: "ssh" per eseguire nella sandbox exec, gli strumenti per i file e le letture multimediali su una macchina arbitraria accessibile tramite SSH.
{ agents: { defaults: { sandbox: { mode: "all", backend: "ssh", scope: "session", workspaceAccess: "rw", ssh: { target: "user@gateway-host:22", workspaceRoot: "/tmp/openclaw-sandboxes", strictHostKeyChecking: true, updateHostKeys: true, identityFile: "~/.ssh/id_ed25519", certificateFile: "~/.ssh/id_ed25519-cert.pub", knownHostsFile: "~/.ssh/known_hosts", // In alternativa, usa SecretRefs o contenuti inline invece dei file locali: // identityData: { source: "env", provider: "default", id: "SSH_IDENTITY" }, // certificateData: { source: "env", provider: "default", id: "SSH_CERTIFICATE" }, // knownHostsData: { source: "env", provider: "default", id: "SSH_KNOWN_HOSTS" }, }, }, }, },}Valori predefiniti: command: "ssh", workspaceRoot: "/tmp/openclaw-sandboxes", strictHostKeyChecking: true, updateHostKeys: true.
- Ciclo di vita: OpenClaw crea una radice remota per ambito in
sandbox.ssh.workspaceRoot. Al primo utilizzo dopo la creazione o la ricreazione, inizializza una sola volta lo spazio di lavoro remoto a partire da quello locale. Successivamente,exec,read,write,edit,apply_patch, le letture dei contenuti multimediali dei prompt e la predisposizione dei contenuti multimediali in ingresso operano direttamente sullo spazio di lavoro remoto tramite SSH. OpenClaw non sincronizza automaticamente le modifiche remote con lo spazio di lavoro locale. - Materiale di autenticazione:
identityFile/certificateFile/knownHostsFilefanno riferimento a file locali esistenti.identityData/certificateData/knownHostsDataaccettano stringhe inline o SecretRefs, risolti tramite la normale istantanea del runtime dei segreti, scritti in file temporanei con modalità0600ed eliminati al termine della sessione SSH. Se per lo stesso elemento sono impostate sia una variante*Filesia una variante*Data, per quella sessione prevale*Data. - Conseguenze del modello remoto canonico: dopo l'inizializzazione iniziale, lo spazio di lavoro SSH remoto diventa lo stato effettivo della sandbox. Le modifiche locali sull'host apportate all'esterno di OpenClaw dopo la fase di inizializzazione non sono visibili in remoto finché non ricrei la sandbox.
openclaw sandbox recreateelimina la radice remota per ambito ed esegue nuovamente l'inizializzazione dal contenuto locale al successivo utilizzo. La sandbox del browser non è supportata su questo backend e le impostazionisandbox.docker.*non si applicano.
Backend OpenShell
Usa backend: "openshell" per eseguire gli strumenti in una sandbox all'interno di un ambiente remoto gestito da OpenShell. OpenShell riutilizza lo stesso trasporto SSH e lo stesso bridge del file system remoto del backend SSH generico, aggiungendo il ciclo di vita di OpenShell (sandbox create/get/delete/ssh-config) e una modalità opzionale di sincronizzazione dello spazio di lavoro mirror.
{ agents: { defaults: { sandbox: { mode: "all", backend: "openshell", scope: "session", workspaceAccess: "rw", }, }, }, plugins: { entries: { openshell: { enabled: true, config: { from: "openclaw", mode: "remote", // mirror | remote }, }, }, },}mode: "mirror" (valore predefinito) mantiene canonico lo spazio di lavoro locale: OpenClaw sincronizza il contenuto locale nella sandbox prima di exec e lo sincronizza nuovamente in locale al termine. mode: "remote" inizializza una sola volta lo spazio di lavoro remoto dal contenuto locale, quindi esegue exec/read/write/edit/apply_patch direttamente sullo spazio di lavoro remoto senza sincronizzare le modifiche in locale; le modifiche locali successive all'inizializzazione non sono visibili finché non esegui openclaw sandbox recreate. Con scope: "agent" o scope: "shared", lo spazio di lavoro remoto viene condiviso nello stesso ambito. Limitazioni attuali: la sandbox del browser non è ancora supportata e sandbox.docker.binds non si applica a questo backend.
openclaw sandbox list/recreate/prune trattano tutti i runtime OpenShell allo stesso modo dei runtime Docker; la logica di eliminazione è consapevole del backend.
Per i prerequisiti completi, il riferimento alla configurazione, il confronto tra le modalità dello spazio di lavoro e i dettagli sul ciclo di vita, consulta OpenShell.
Accesso allo spazio di lavoro
agents.defaults.sandbox.workspaceAccess controlla ciò che la sandbox può vedere:
| Valore | Comportamento |
|---|---|
none (predefinito) |
Gli strumenti vedono uno spazio di lavoro sandbox isolato in ~/.openclaw/sandboxes. |
ro |
Monta lo spazio di lavoro dell'agente in sola lettura in /agent (disabilita write/edit/apply_patch). |
rw |
Monta lo spazio di lavoro dell'agente in lettura/scrittura in /workspace. |
Con il backend OpenShell, la modalità mirror continua a usare lo spazio di lavoro locale come fonte canonica tra le esecuzioni di exec, la modalità remote usa lo spazio di lavoro OpenShell remoto come fonte canonica dopo il popolamento iniziale e workspaceAccess: "ro"/"none" continua a limitare allo stesso modo le operazioni di scrittura.
I contenuti multimediali in ingresso vengono copiati nello spazio di lavoro sandbox attivo (media/inbound/*).
Montaggi bind personalizzati
agents.defaults.sandbox.docker.binds monta nel contenitore directory aggiuntive dell'host. Formato: host:container:mode (ad esempio, "/home/user/source:/source:rw").
I bind globali e quelli per agente vengono uniti, non sostituiti. Con scope: "shared", i bind per agente vengono ignorati.
agents.defaults.sandbox.browser.binds monta directory aggiuntive dell'host solo nel contenitore del browser sandbox. Quando è impostato (anche su []), sostituisce docker.binds per il contenitore del browser; quando è omesso, il contenitore del browser usa docker.binds come ripiego.
{ agents: { defaults: { sandbox: { docker: { binds: ["/home/user/source:/source:ro", "/var/data/myapp:/data:ro"], }, }, }, list: [ { id: "build", sandbox: { docker: { binds: ["/mnt/cache:/cache:rw"], }, }, }, ], },}Immagini e configurazione
Immagine Docker predefinita: openclaw-sandbox:bookworm-slim
Compilare l'immagine predefinita
Da un checkout del sorgente:
scripts/sandbox-setup.shDa un'installazione npm (non è necessario un checkout del sorgente):
docker build -t openclaw-sandbox:bookworm-slim - <<'DOCKERFILE'FROM debian:bookworm-slimENV DEBIAN_FRONTEND=noninteractiveRUN apt-get update && apt-get install -y --no-install-recommends \ bash ca-certificates curl git jq python3 ripgrep \ && rm -rf /var/lib/apt/lists/*RUN useradd --create-home --shell /bin/bash sandboxUSER sandboxWORKDIR /home/sandboxCMD ["sleep", "infinity"]DOCKERFILEL'immagine predefinita non include Node. Se una Skill richiede Node o altri ambienti di esecuzione, creare un'immagine personalizzata che li includa oppure installarli tramite sandbox.docker.setupCommand (richiede accesso di rete in uscita, una radice scrivibile e l'utente root).
OpenClaw non sostituisce automaticamente openclaw-sandbox:bookworm-slim con la semplice immagine debian:bookworm-slim quando la prima non è disponibile. Le esecuzioni sandbox che usano l'immagine predefinita terminano immediatamente mostrando le istruzioni di compilazione finché l'immagine non viene creata, perché l'immagine fornita include python3 per gli strumenti di scrittura e modifica della sandbox.
Facoltativo: compilare l'immagine comune
Per un'immagine sandbox più funzionale con strumenti comuni, ad esempio curl, jq, Node 24, pnpm, python3 e git:
Da un checkout del sorgente:
scripts/sandbox-common-setup.shDa un'installazione npm, compilare prima l'immagine predefinita (vedere sopra), quindi compilare l'immagine comune sovrapponendola tramite scripts/docker/sandbox/Dockerfile.common dal repository.
Impostare quindi agents.defaults.sandbox.docker.image su openclaw-sandbox-common:bookworm-slim.
Facoltativo: compilare l'immagine del browser sandbox
Da un checkout del sorgente:
scripts/sandbox-browser-setup.shDa un'installazione npm, compilare usando scripts/docker/sandbox/Dockerfile.browser dal repository.
Per impostazione predefinita, i contenitori della sandbox Docker vengono eseguiti senza rete. Per modificare questa impostazione, usare agents.defaults.sandbox.docker.network.
Impostazioni predefinite di Chromium nel browser sandbox
L'immagine fornita del browser sandbox applica opzioni di avvio conservative di Chromium per i carichi di lavoro in contenitori:
--remote-debugging-address=127.0.0.1--remote-debugging-port=<derived from OPENCLAW_BROWSER_CDP_PORT>--user-data-dir=${HOME}/.chrome--no-first-run--no-default-browser-check--disable-dev-shm-usage--disable-background-networking--disable-breakpad--disable-crash-reporter--no-zygote--metrics-recording-only--password-store=basic--use-mock-keychain--headless=newquandobrowser.headlessè abilitato.--no-sandbox --disable-setuid-sandboxquandobrowser.noSandboxè abilitato.--disable-3d-apis,--disable-gpu,--disable-software-rasterizerper impostazione predefinita; queste opzioni di rafforzamento della sicurezza grafica sono utili per i contenitori senza supporto GPU. ImpostareOPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0se il carico di lavoro richiede WebGL o altre funzionalità 3D.--disable-extensionsper impostazione predefinita; impostareOPENCLAW_BROWSER_DISABLE_EXTENSIONS=0per i flussi che dipendono dalle estensioni.--renderer-process-limit=2per impostazione predefinita; controllato daOPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N>, dove0mantiene il valore predefinito di Chromium.
Se è necessario un profilo di esecuzione diverso, usare un'immagine del browser personalizzata e fornire un entrypoint proprio. Per i profili Chromium locali, non eseguiti in contenitori, usare browser.extraArgs per aggiungere ulteriori opzioni di avvio.
Impostazioni predefinite per la sicurezza della rete
network: "host"è bloccato.network: "container:<id>"è bloccato per impostazione predefinita a causa del rischio di aggiramento tramite l'unione dello spazio dei nomi.- Opzione di emergenza:
agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true.
Le installazioni Docker e il Gateway in contenitore sono descritti qui: Docker
Per le distribuzioni del Gateway Docker, scripts/docker/setup.sh può inizializzare la configurazione della sandbox. Impostare OPENCLAW_SANDBOX=1 (oppure true/yes/on) per abilitare questo percorso. Per modificare la posizione del socket, usare OPENCLAW_DOCKER_SOCKET. Configurazione completa e riferimento delle variabili di ambiente: Docker.
setupCommand (configurazione una tantum del contenitore)
setupCommand viene eseguito una sola volta dopo la creazione del contenitore sandbox, non a ogni esecuzione. Viene eseguito all'interno del contenitore tramite sh -lc.
Percorsi:
- Globale:
agents.defaults.sandbox.docker.setupCommand - Per agente:
agents.list[].sandbox.docker.setupCommand
Problemi comuni
- Il valore predefinito di
docker.networkè"none"(nessun accesso in uscita), quindi le installazioni dei pacchetti non riusciranno. docker.network: "container:<id>"richiededangerouslyAllowContainerNamespaceJoin: trueed è esclusivamente un'opzione di emergenza.readOnlyRoot: trueimpedisce le scritture; impostarereadOnlyRoot: falseoppure creare un'immagine personalizzata.- Per installare pacchetti,
userdeve essere root: omettereuseroppure impostareuser: "0:0". - L'esecuzione nella sandbox non eredita il
process.envdell'host. Usareagents.defaults.sandbox.docker.envo un'immagine personalizzata per le chiavi API delle Skills. - I valori in
agents.defaults.sandbox.docker.envvengono passati come variabili di ambiente esplicite del contenitore Docker. Chiunque disponga dell'accesso al daemon Docker può esaminarli con comandi per i metadati Docker comedocker inspect. Se questa esposizione nei metadati non è accettabile, usare un'immagine personalizzata, un file di segreti montato o un altro metodo di distribuzione dei segreti.
Criteri degli strumenti e vie di fuga
I criteri di autorizzazione e negazione degli strumenti vengono comunque applicati prima delle regole della sandbox. Se uno strumento è negato a livello globale o per agente, la sandbox non lo rende nuovamente disponibile.
tools.elevated è una via di fuga esplicita che esegue exec all'esterno della sandbox, nel gateway per impostazione predefinita oppure nel node quando la destinazione di esecuzione è node. Le direttive /exec si applicano solo ai mittenti autorizzati e persistono per la sessione; per disabilitare completamente exec, usare il criterio di negazione degli strumenti (consultare Sandbox, criteri degli strumenti ed esecuzione con privilegi elevati).
Debug:
openclaw sandbox listmostra i contenitori sandbox, lo stato, la corrispondenza dell'immagine, l'età, il tempo di inattività e la sessione o l'agente associato.openclaw sandbox explain [--session <key>] [--agent <id>]esamina la modalità sandbox effettiva, lo spazio di lavoro dell'host, la directory di lavoro dell'ambiente di esecuzione, i montaggi Docker, i criteri degli strumenti e le chiavi di configurazione per la correzione. Il campoworkspaceRootresta la radice sandbox configurata;effectiveHostWorkspaceRootindica dove risiede effettivamente lo spazio di lavoro attivo.openclaw sandbox recreate [--all | --session <key> | --agent <id>] [--browser] [--force]rimuove contenitori e ambienti affinché vengano ricreati con la configurazione corrente al successivo utilizzo.- Consultare Sandbox, criteri degli strumenti ed esecuzione con privilegi elevati per il modello mentale che spiega perché un'operazione viene bloccata.
Sostituzioni per più agenti
Ogni agente può sostituire le impostazioni della sandbox e degli strumenti: agents.list[].sandbox e agents.list[].tools, oltre a agents.list[].tools.sandbox.tools per i criteri degli strumenti della sandbox. Consultare Sandbox e strumenti multi-agente per l'ordine di precedenza.
Esempio minimo di abilitazione
{ agents: { defaults: { sandbox: { mode: "non-main", scope: "session", workspaceAccess: "none", }, }, },}Pagine correlate
- Sandbox e strumenti multi-agente -- sostituzioni specifiche per agente e precedenza
- OpenShell -- configurazione del backend sandbox gestito, modalità dell'area di lavoro e riferimento della configurazione
- Configurazione della sandbox
- Sandbox, criteri degli strumenti e modalità con privilegi elevati a confronto -- risoluzione del problema "perché è bloccato?"
- Sicurezza