Sandbox no OpenClaw: isolando o agente com Docker

Sandbox no OpenClaw: isolando o agente com Docker

Resposta rápida

O sandbox do OpenClaw é opt-in: por padrão as ferramentas rodam no host. Ligue agents.defaults.sandbox (Docker default) com scope: agent e workspaceAccess: none; evite shared; feche o alçapão tools.elevated (executa FORA do container) e gere sub-agentes com sandbox: require. Em VPS: portas do Docker furam o UFW — regras em DOCKER-USER. Sandbox contém prompt injection, não a resolve: camadas = sandbox + aprovação humana + allowlists + modelo forte.

  • Sandbox desligado é o padrão de fábrica — para operador único confiável; skills de terceiros pedem isolamento.
  • 3 decisões: scope (agent/session, evitar shared), workspaceAccess (none/ro/rw) e binds (symlink malicioso falha fechado).
  • tools.elevated executa FORA do sandbox — o alçapão que anula tudo; padrão: desligado.
  • Sub-agentes com sandbox: require falham rápido em vez de herdar o host.
  • Docker fura UFW: firewall de VPS vai na chain DOCKER-USER + scan externo de validação.
  • Exec approval não entende semanticamente todo interpretador — a fronteira forte é o container.
Padrão de fábricasandbox OFF (opt-in)
BackendDocker (default)
Escoposagent (padrão) · session · shared (evitar)
Workspacenone (padrão) · ro · rw
Alçapãotools.elevated roda fora do sandbox
VPSregras de firewall na chain DOCKER-USER

Tem um detalhe da arquitetura de segurança do OpenClaw que surpreende todo mundo: o sandbox vem DESLIGADO por padrão. No modelo de fábrica — pensado pra um único operador confiável — as ferramentas do agente rodam direto no host. Funciona, até o dia em que uma skill de terceiro, uma página maliciosa ou um e-mail com instruções escondidas convence o agente a rodar o comando errado. A doc oficial é honesta: prompt injection “não está resolvido”, e a fronteira dura não é o prompt — é o isolamento. Este guia liga essa fronteira.

O que o sandbox faz (e o que não faz)

Com agents.defaults.sandbox ativo, as ferramentas que executam código passam a rodar dentro de um container (Docker é o backend padrão) em vez do host. O agente continua igual — quem muda de casa é o shell, o filesystem e o estrago possível. Duas abordagens se complementam: rodar o Gateway inteiro em Docker (fronteira de container pra tudo) ou manter o Gateway no host e isolar só as ferramentas — o caminho mais comum.

As 3 decisões de configuração

  • Escoposcope: "agent" (padrão): um container por agente. "session": um por sessão, isolamento máximo. "shared": um container pra todos — a doc manda evitar, porque permite acesso cruzado entre agentes.
  • Acesso ao workspaceworkspaceAccess: "none" (padrão): as ferramentas trabalham num workspace descartável em ~/.openclaw/sandboxes, sem ver seus arquivos. "ro": monta o workspace só-leitura (edição/patch desabilitados). "rw": monta com escrita — só quando o fluxo realmente edita arquivos seus.
  • Binds extras — montagens adicionais são validadas contra caminhos canônicos: truque de symlink apontando pra /etc ou diretório de credenciais falha fechado. Segurança pensada por quem já viu container escapar.

⚠️ O alçapão que anula tudo: tools.elevated

Existe uma saída de emergência deliberada: tools.elevated executa comandos FORA do sandbox, direto no host. É útil pra manutenção — e é exatamente o que um ataque quer alcançar. Regra prática: enabled: false por padrão; se precisar, allowFrom cirúrgico (só você, só no canal admin). E sub-agentes: se o fluxo deve permanecer isolado, gere-os com sandbox: "require" — falha na hora se o filho tentar nascer fora do container, em vez de herdar silenciosamente o host.

Ligando na prática

O desenho recomendado pra quem opera um agente com skills de terceiros: Gateway no host, sandbox ativo com scope: "agent" e workspaceAccess: "none", elevated desligado, e — do runbook de hardening da série — exec.ask: "always" pra ações sensíveis. Perfis prontos da doc: agente público sem filesystem/shell (workspaceAccess: "none" + denies), agente leitor ("ro") e agente de confiança total (mode: "off" — o padrão de fábrica, agora uma escolha consciente e não um acidente).

Rodando em VPS com Docker, um lembrete que a doc oficial faz questão de dar: portas publicadas pelo Docker furam o UFW (passam pela chain própria do Docker) — as regras de firewall precisam ir em DOCKER-USER, e depois valide de fora com um scan de portas. Detalhe que separa tutorial de operação real.

Os limites (honestidade oficial)

A própria doc reconhece: as aprovações de exec “não modelam semanticamente todo caminho de interpretador” — um python -c criativo pode dizer uma coisa e fazer outra. Por isso a recomendação final é em camadas: sandbox para a fronteira forte, aprovação humana pro que é irreversível, allowlists pra identidade, e modelo forte e recente no volante. Isolamento não substitui critério; multiplica o valor dele.

Fontes: docs.openclaw.ai — security & sandboxing · prática da nossa operação self-hosted

Perguntas frequentes

O sandbox do OpenClaw vem ativado por padrão?

Não — é opt-in. O modelo de fábrica assume um único operador confiável e roda as ferramentas direto no host. Quem instala skills de terceiros ou expõe o bot a mensagens de fora deve ligar o sandbox (agents.defaults.sandbox, Docker por padrão).

Sandbox resolve prompt injection?

Não resolve — contém. A doc oficial é explícita: injection não está resolvido e o prompt não é fronteira de segurança. O sandbox limita o que um agente manipulado consegue alcançar: o estrago fica confinado ao container e ao workspace descartável.

O que é o tools.elevated e por que é perigoso?

É a saída de emergência que executa comandos fora do sandbox, direto no host. Útil pra manutenção, mas anula o isolamento — mantenha desligado ou com allowFrom restrito a você mesmo, e gere sub-agentes com sandbox: require.

Docker no VPS: por que meu firewall não bloqueia as portas do container?

Porque portas publicadas pelo Docker passam pela chain de forwarding do próprio Docker, ignorando o UFW. As regras precisam ir na chain DOCKER-USER — e valide de fora com um scan de portas depois.