Gateway
Sandboxing
OpenClaw pode executar ferramentas dentro de backends de sandbox para reduzir o raio de impacto. Isso é opcional e controlado por configuração (agents.defaults.sandbox ou agents.list[].sandbox). Se o sandbox estiver desativado, as ferramentas rodam no host. O Gateway permanece no host; a execução de ferramentas roda em um sandbox isolado quando habilitada.
O que entra em sandbox
- Execução de ferramentas (
exec,read,write,edit,apply_patch,process, etc.). - Navegador em sandbox opcional (
agents.defaults.sandbox.browser).
Detalhes do navegador em sandbox
- Por padrão, o navegador do sandbox inicia automaticamente (garante que o CDP esteja acessível) quando a ferramenta de navegador precisa dele. Configure via
agents.defaults.sandbox.browser.autoStarteagents.defaults.sandbox.browser.autoStartTimeoutMs. - Por padrão, os contêineres do navegador do sandbox usam uma rede Docker dedicada (
openclaw-sandbox-browser) em vez da rede globalbridge. Configure comagents.defaults.sandbox.browser.network. - O
agents.defaults.sandbox.browser.cdpSourceRangeopcional restringe a entrada CDP na borda do contêiner com uma lista de permissões CIDR (por exemplo,172.21.0.1/32). - O acesso de observador noVNC é protegido por senha por padrão; o OpenClaw emite uma URL de token de curta duração que serve uma página de bootstrap local e abre o noVNC com a senha no fragmento da URL (não em logs de consulta/cabeçalho).
agents.defaults.sandbox.browser.allowHostControlpermite que sessões em sandbox apontem explicitamente para o navegador do host.- Listas de permissões opcionais controlam
target: "custom":allowedControlUrls,allowedControlHosts,allowedControlPorts.
Não entra em sandbox:
- O próprio processo do Gateway.
- Qualquer ferramenta explicitamente autorizada a rodar fora do sandbox (por exemplo,
tools.elevated).- Exec elevado ignora o sandbox e usa o caminho de escape configurado (
gatewaypor padrão, ounodequando o alvo do exec énode). - Se o sandbox estiver desativado,
tools.elevatednão altera a execução (já está no host). Consulte Modo Elevado.
- Exec elevado ignora o sandbox e usa o caminho de escape configurado (
Modos
agents.defaults.sandbox.mode controla quando o sandbox é usado:
off
Sem sandbox.
non-main
Coloca em sandbox apenas sessões não principais (padrão se você quiser chats normais no host).
"non-main" é baseado em session.mainKey (padrão "main"), não no id do agente. Sessões de grupo/canal usam suas próprias chaves, portanto contam como não principais e entrarão em sandbox.
all
Toda sessão roda em um sandbox.
Escopo
agents.defaults.sandbox.scope controla quantos contêineres são criados:
"agent"(padrão): um contêiner por agente."session": um contêiner por sessão."shared": um contêiner compartilhado por todas as sessões em sandbox.
Backend
agents.defaults.sandbox.backend controla qual runtime fornece o sandbox:
"docker"(padrão quando o sandbox está habilitado): runtime de sandbox local baseado em Docker."ssh": runtime de sandbox remoto genérico baseado em SSH."openshell": runtime de sandbox baseado no OpenShell.
A configuração específica de SSH fica em agents.defaults.sandbox.ssh. A configuração específica do OpenShell fica em plugins.entries.openshell.config.
Escolhendo um backend
| Docker | SSH | OpenShell | |
|---|---|---|---|
| Onde roda | Contêiner local | Qualquer host acessível por SSH | Sandbox gerenciado pelo OpenShell |
| Configuração | scripts/sandbox-setup.sh |
Chave SSH + host de destino | Plugin OpenShell habilitado |
| Modelo de workspace | Bind mount ou cópia | Canônico remoto (semeia uma vez) | mirror ou remote |
| Controle de rede | docker.network (padrão: none) |
Depende do host remoto | Depende do OpenShell |
| Sandbox de navegador | Compatível | Não compatível | Ainda não compatível |
| Bind mounts | docker.binds |
N/A | N/A |
| Melhor para | Desenvolvimento local, isolamento completo | Descarregar para uma máquina remota | Sandboxes remotos gerenciados com sincronização bidirecional opcional |
Backend Docker
O sandbox fica desativado por padrão. Se você habilitar o sandbox e não escolher um backend, o OpenClaw usa o backend Docker. Ele executa ferramentas e navegadores em sandbox localmente via socket do daemon Docker (/var/run/docker.sock). O isolamento do contêiner de sandbox é determinado pelos namespaces do Docker.
Para expor GPUs do host a sandboxes Docker, defina agents.defaults.sandbox.docker.gpus ou a substituição por agente agents.list[].sandbox.docker.gpus. O valor é passado para a flag --gpus do Docker como um argumento separado, por exemplo "all" ou "device=GPU-uuid", e exige um runtime de host compatível, como NVIDIA Container Toolkit.
Backend SSH
Use backend: "ssh" quando você quiser que o OpenClaw coloque exec, ferramentas de arquivo e leituras de mídia em sandbox em uma máquina arbitrária acessível por 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", // Or use SecretRefs / inline contents instead of local files: // 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" }, }, }, }, },}Como funciona
- O OpenClaw cria uma raiz remota por escopo em
sandbox.ssh.workspaceRoot. - No primeiro uso após criar ou recriar, o OpenClaw semeia esse workspace remoto a partir do workspace local uma vez.
- Depois disso,
exec,read,write,edit,apply_patch, leituras de mídia de prompt e staging de mídia de entrada rodam diretamente contra o workspace remoto via SSH. - O OpenClaw não sincroniza automaticamente alterações remotas de volta para o workspace local.
Material de autenticação
identityFile,certificateFile,knownHostsFile: usam arquivos locais existentes e os passam pela configuração do OpenSSH.identityData,certificateData,knownHostsData: usam strings inline ou SecretRefs. O OpenClaw os resolve por meio do snapshot normal do runtime de segredos, grava-os em arquivos temporários com0600e os exclui quando a sessão SSH termina.- Se tanto
*Filequanto*Dataestiverem definidos para o mesmo item,*Dataprevalece nessa sessão SSH.
Consequências do modelo canônico remoto
Este é um modelo canônico remoto. O workspace SSH remoto se torna o estado real do sandbox após a semeadura inicial.
- Edições locais no host feitas fora do OpenClaw após a etapa de semeadura não ficam visíveis remotamente até você recriar o sandbox.
openclaw sandbox recreateexclui a raiz remota por escopo e semeia novamente a partir do local no próximo uso.- Sandbox de navegador não é compatível com o backend SSH.
- Configurações
sandbox.docker.*não se aplicam ao backend SSH.
Backend OpenShell
Use backend: "openshell" quando você quiser que o OpenClaw coloque ferramentas em sandbox em um ambiente remoto gerenciado pelo OpenShell. Para o guia completo de configuração, a referência de configuração e a comparação de modos de workspace, consulte a página do OpenShell dedicada.
O OpenShell reutiliza o mesmo transporte SSH central e a mesma ponte de sistema de arquivos remoto do backend SSH genérico, e adiciona ciclo de vida específico do OpenShell (sandbox create/get/delete, sandbox ssh-config) mais o modo de workspace mirror opcional.
{ agents: { defaults: { sandbox: { mode: "all", backend: "openshell", scope: "session", workspaceAccess: "rw", }, }, }, plugins: { entries: { openshell: { enabled: true, config: { from: "openclaw", mode: "remote", // mirror | remote remoteWorkspaceDir: "/sandbox", remoteAgentWorkspaceDir: "/agent", }, }, }, },}Modos do OpenShell:
mirror(padrão): o workspace local permanece canônico. O OpenClaw sincroniza arquivos locais para o OpenShell antes do exec e sincroniza o workspace remoto de volta após o exec.remote: o workspace OpenShell é canônico depois que o sandbox é criado. O OpenClaw semeia o workspace remoto uma vez a partir do workspace local; em seguida, ferramentas de arquivo e exec rodam diretamente contra o sandbox remoto sem sincronizar alterações de volta.
Detalhes do transporte remoto
- O OpenClaw solicita ao OpenShell a configuração SSH específica do sandbox via
openshell sandbox ssh-config <name>. - O core grava essa configuração SSH em um arquivo temporário, abre a sessão SSH e reutiliza a mesma ponte de sistema de arquivos remoto usada por
backend: "ssh". - No modo
mirror, apenas o ciclo de vida difere: sincroniza o local para o remoto antes do exec e depois sincroniza de volta após o exec.
Limitações atuais do OpenShell
- o navegador do sandbox ainda não é compatível
sandbox.docker.bindsnão é compatível no backend do OpenShell- controles de runtime específicos do Docker em
sandbox.docker.*ainda se aplicam apenas ao backend Docker
Modos de workspace
O OpenShell tem dois modelos de workspace. Esta é a parte que mais importa na prática.
mirror (local canônico)
Use plugins.entries.openshell.config.mode: "mirror" quando quiser que o workspace local permaneça canônico.
Comportamento:
- Antes de
exec, o OpenClaw sincroniza o workspace local para o sandbox do OpenShell. - Após
exec, o OpenClaw sincroniza o workspace remoto de volta para o workspace local. - As ferramentas de arquivo ainda operam pela ponte do sandbox, mas o workspace local continua sendo a fonte da verdade entre turnos.
Use isto quando:
- você edita arquivos localmente fora do OpenClaw e quer que essas alterações apareçam no sandbox automaticamente
- você quer que o sandbox do OpenShell se comporte o mais parecido possível com o backend Docker
- você quer que o workspace do host reflita as gravações do sandbox após cada turno de exec
Tradeoff: custo extra de sincronização antes e depois do exec.
remote (OpenShell canônico)
Use plugins.entries.openshell.config.mode: "remote" quando quiser que o workspace do OpenShell se torne canônico.
Comportamento:
- Quando o sandbox é criado pela primeira vez, o OpenClaw inicializa o workspace remoto a partir do workspace local uma vez.
- Depois disso,
exec,read,write,editeapply_patchoperam diretamente no workspace remoto do OpenShell. - O OpenClaw não sincroniza alterações remotas de volta para o workspace local após o exec.
- Leituras de mídia no momento do prompt ainda funcionam porque as ferramentas de arquivo e mídia leem pela ponte do sandbox em vez de assumir um caminho local do host.
- O transporte é SSH para o sandbox do OpenShell retornado por
openshell sandbox ssh-config.
Consequências importantes:
- Se você editar arquivos no host fora do OpenClaw após a etapa de inicialização, o sandbox remoto não verá essas alterações automaticamente.
- Se o sandbox for recriado, o workspace remoto será inicializado a partir do workspace local novamente.
- Com
scope: "agent"ouscope: "shared", esse workspace remoto é compartilhado nesse mesmo escopo.
Use isto quando:
- o sandbox deve viver principalmente no lado remoto do OpenShell
- você quer menor sobrecarga de sincronização por turno
- você não quer que edições locais do host sobrescrevam silenciosamente o estado do sandbox remoto
Escolha mirror se você pensa no sandbox como um ambiente de execução temporário. Escolha remote se você pensa no sandbox como o workspace real.
Ciclo de vida do OpenShell
Os sandboxes do OpenShell ainda são gerenciados pelo ciclo de vida normal de sandbox:
openclaw sandbox listmostra runtimes do OpenShell e também runtimes Dockeropenclaw sandbox recreateexclui o runtime atual e permite que o OpenClaw o recrie no próximo uso- a lógica de prune também é ciente do backend
Para o modo remote, recriar é especialmente importante:
- recriar exclui o workspace remoto canônico desse escopo
- o próximo uso inicializa um workspace remoto novo a partir do workspace local
Para o modo mirror, recriar principalmente redefine o ambiente de execução remoto, porque o workspace local permanece canônico de qualquer forma.
Acesso ao workspace
agents.defaults.sandbox.workspaceAccess controla o que o sandbox pode ver:
none (padrão)
As ferramentas veem um workspace de sandbox em ~/.openclaw/sandboxes.
ro
Monta o workspace do agente como somente leitura em /agent (desabilita write/edit/apply_patch).
rw
Monta o workspace do agente como leitura/gravação em /workspace.
Com o backend do OpenShell:
- o modo
mirrorainda usa o workspace local como a fonte canônica entre turnos de exec - o modo
remoteusa o workspace remoto do OpenShell como a fonte canônica após a inicialização inicial workspaceAccess: "ro"e"none"ainda restringem o comportamento de gravação da mesma forma
Mídia de entrada é copiada para o workspace ativo do sandbox (media/inbound/*).
Montagens bind personalizadas
agents.defaults.sandbox.docker.binds monta diretórios adicionais do host no contêiner. Formato: host:container:mode (por exemplo, "/home/user/source:/source:rw").
Binds globais e por agente são mesclados (não substituídos). Em scope: "shared", binds por agente são ignorados.
agents.defaults.sandbox.browser.binds monta diretórios adicionais do host apenas no contêiner do navegador do sandbox.
- Quando definido (incluindo
[]), ele substituiagents.defaults.sandbox.docker.bindspara o contêiner do navegador. - Quando omitido, o contêiner do navegador recorre a
agents.defaults.sandbox.docker.binds(compatível com versões anteriores).
Exemplo (código-fonte somente leitura + um diretório de dados extra):
{ 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"], }, }, }, ], },}Imagens e configuração
Imagem Docker padrão: openclaw-sandbox:bookworm-slim
Crie a imagem padrão
A partir de um checkout de código-fonte:
scripts/sandbox-setup.shA partir de uma instalação npm (sem necessidade de checkout de código-fonte):
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"]DOCKERFILEA imagem padrão não inclui Node. Se uma Skill precisar de Node (ou outros runtimes), inclua em uma imagem personalizada ou instale via sandbox.docker.setupCommand (requer saída de rede + root gravável + usuário root).
O OpenClaw não substitui silenciosamente por debian:bookworm-slim puro quando openclaw-sandbox:bookworm-slim está ausente. Execuções de sandbox que miram a imagem padrão falham rapidamente com uma instrução de build até que você a crie, porque a imagem empacotada carrega python3 para auxiliares de gravação/edição do sandbox.
Opcional: crie a imagem comum
Para uma imagem de sandbox mais funcional com ferramentas comuns (por exemplo, curl, jq, Node 24, pnpm, python3 e git):
A partir de um checkout de código-fonte:
scripts/sandbox-common-setup.shA partir de uma instalação npm, crie a imagem padrão primeiro (veja acima) e depois crie a imagem comum sobre ela usando o scripts/docker/sandbox/Dockerfile.common do repositório.
Depois defina agents.defaults.sandbox.docker.image como openclaw-sandbox-common:bookworm-slim.
Opcional: crie a imagem do navegador do sandbox
A partir de um checkout de código-fonte:
scripts/sandbox-browser-setup.shA partir de uma instalação npm, crie usando o scripts/docker/sandbox/Dockerfile.browser do repositório.
Por padrão, contêineres de sandbox Docker são executados sem rede. Substitua com agents.defaults.sandbox.docker.network.
Padrões do Chromium do navegador do sandbox
A imagem empacotada do navegador do sandbox também aplica padrões conservadores de inicialização do Chromium para cargas de trabalho conteinerizadas. Os padrões atuais do contêiner incluem:
--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-3d-apis--disable-gpu--disable-dev-shm-usage--disable-background-networking--disable-extensions--disable-features=TranslateUI--disable-breakpad--disable-crash-reporter--disable-software-rasterizer--no-zygote--metrics-recording-only--renderer-process-limit=2--no-sandboxquandonoSandboxestá habilitado.- As três flags de reforço gráfico (
--disable-3d-apis,--disable-software-rasterizer,--disable-gpu) são opcionais e são úteis quando contêineres não têm suporte a GPU. DefinaOPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0se sua carga de trabalho exigir WebGL ou outros recursos 3D/de navegador. --disable-extensionsé habilitado por padrão e pode ser desabilitado comOPENCLAW_BROWSER_DISABLE_EXTENSIONS=0para fluxos que dependem de extensões.--renderer-process-limit=2é controlado porOPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N>, em que0mantém o padrão do Chromium.
Se você precisar de um perfil de runtime diferente, use uma imagem de navegador personalizada e forneça seu próprio entrypoint. Para perfis locais (não contêiner) do Chromium, use browser.extraArgs para anexar flags adicionais de inicialização.
Padrões de segurança de rede
network: "host"é bloqueado.network: "container:<id>"é bloqueado por padrão (risco de bypass por ingresso no namespace).- Substituição de emergência:
agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true.
As instalações com Docker e o Gateway em contêiner ficam aqui: Docker
Para implantações do Gateway com Docker, scripts/docker/setup.sh pode inicializar a configuração do sandbox. Defina OPENCLAW_SANDBOX=1 (ou true/yes/on) para habilitar esse caminho. Você pode substituir o local do socket com OPENCLAW_DOCKER_SOCKET. Configuração completa e referência de env: Docker.
setupCommand (configuração única do contêiner)
setupCommand é executado uma vez depois que o contêiner do sandbox é criado (não em toda execução). Ele é executado dentro do contêiner via sh -lc.
Caminhos:
- Global:
agents.defaults.sandbox.docker.setupCommand - Por agente:
agents.list[].sandbox.docker.setupCommand
Armadilhas comuns
- O
docker.networkpadrão é"none"(sem saída), então instalações de pacotes vão falhar. docker.network: "container:<id>"exigedangerouslyAllowContainerNamespaceJoin: truee deve ser usado apenas como substituição de emergência.readOnlyRoot: trueimpede gravações; definareadOnlyRoot: falseou crie uma imagem personalizada.userdeve ser root para instalações de pacotes (omitauserou definauser: "0:0").- Execução no sandbox não herda o
process.envdo host. Useagents.defaults.sandbox.docker.env(ou uma imagem personalizada) para chaves de API de Skills. - Valores em
agents.defaults.sandbox.docker.envsão passados como variáveis de ambiente explícitas do contêiner Docker. Qualquer pessoa com acesso ao daemon do Docker pode inspecioná-los com comandos de metadados do Docker, comodocker inspect. Use uma imagem personalizada, um arquivo de segredo montado ou outro caminho de entrega de segredos se essa exposição de metadados não for aceitável.
Política de ferramentas e rotas de escape
As políticas de permissão/bloqueio de ferramentas ainda se aplicam antes das regras de sandbox. Se uma ferramenta for negada globalmente ou por agente, o sandbox não a reabilita.
tools.elevated é uma rota de escape explícita que executa exec fora do sandbox (gateway por padrão, ou node quando o alvo de exec é node). Diretivas /exec só se aplicam a remetentes autorizados e persistem por sessão; para desabilitar exec rigidamente, use uma política de negação de ferramenta (veja Sandbox vs Tool Policy vs Elevated).
Depuração:
- Use
openclaw sandbox explainpara inspecionar o modo de sandbox efetivo, a política de ferramentas e as chaves de configuração de correção. - Veja Sandbox vs Tool Policy vs Elevated para o modelo mental de "por que isto está bloqueado?".
Mantenha tudo bloqueado.
Substituições para vários agentes
Cada agente pode substituir sandbox + ferramentas: agents.list[].sandbox e agents.list[].tools (mais agents.list[].tools.sandbox.tools para a política de ferramentas do sandbox). Veja Multi-Agent Sandbox & Tools para a precedência.
Exemplo mínimo de habilitação
{ agents: { defaults: { sandbox: { mode: "non-main", scope: "session", workspaceAccess: "none", }, }, },}Relacionado
- Multi-Agent Sandbox & Tools — substituições por agente e precedência
- OpenShell — configuração de backend de sandbox gerenciado, modos de workspace e referência de configuração
- Configuração de sandbox
- Sandbox vs Tool Policy vs Elevated — depuração de "por que isto está bloqueado?"
- Segurança