Sandboxing
O 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 sandboxing estiver desativado, as ferramentas serão executadas no host.
O Gateway permanece no host; a execução das ferramentas roda em um sandbox isolado
quando ativada.
Isso não é um limite de segurança perfeito, mas limita de forma material o acesso ao sistema de arquivos
e a processos quando o modelo faz algo imprudente.
O que é colocado em sandbox
- Execução de ferramentas (
exec,read,write,edit,apply_patch,processetc.). - Navegador opcional em sandbox (
agents.defaults.sandbox.browser).- Por padrão, o navegador em 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, contêineres de navegador em sandbox usam uma rede Docker dedicada (
openclaw-sandbox-browser) em vez da rede globalbridge. Configure comagents.defaults.sandbox.browser.network. agents.defaults.sandbox.browser.cdpSourceRangeopcional restringe o ingresso CDP na borda do contêiner com uma allowlist CIDR (por exemplo172.21.0.1/32).- O acesso de observação via noVNC é protegido por senha por padrão; o OpenClaw emite uma URL com 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 query/header).
agents.defaults.sandbox.browser.allowHostControlpermite que sessões em sandbox direcionem explicitamente o navegador do host.- Allowlists opcionais controlam
target: "custom":allowedControlUrls,allowedControlHosts,allowedControlPorts.
- Por padrão, o navegador em sandbox inicia automaticamente (garante que o CDP esteja acessível) quando a ferramenta de navegador precisa dele.
Configure via
- O próprio processo do Gateway.
- Qualquer ferramenta explicitamente permitida para rodar fora do sandbox (por exemplo
tools.elevated).- Exec elevado ignora o sandboxing e usa o caminho de escape configurado (
gatewaypor padrão, ounodequando o destino de exec énode). - Se o sandboxing estiver desativado,
tools.elevatednão altera a execução (já está no host). Consulte Elevated Mode.
- Exec elevado ignora o sandboxing e usa o caminho de escape configurado (
Modos
agents.defaults.sandbox.mode controla quando o sandboxing é usado:
"off": sem sandboxing."non-main": sandbox apenas para sessões não principais (padrão se você quiser chats normais no host)."all": toda sessão roda em um sandbox. Observação:"non-main"se baseia emsession.mainKey(padrão"main"), não no id do agente. Sessões de grupo/canal usam suas próprias chaves, então contam como não principais e entrarão em 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): runtime de sandbox local baseado em Docker."ssh": runtime de sandbox remoto genérico baseado em SSH."openshell": runtime de sandbox baseado em OpenShell.
agents.defaults.sandbox.ssh.
A configuração específica de 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 ativado |
| Modelo de workspace | Bind-mount ou cópia | Remoto-canônico (inicializa uma vez) | mirror ou remote |
| Controle de rede | docker.network (padrão: none) | Depende do host remoto | Depende do OpenShell |
| Navegador em sandbox | Compatível | Não compatível | Ainda não compatível |
| Bind mounts | docker.binds | N/A | N/A |
| Ideal para | Desenvolvimento local, isolamento total | Descarregar para uma máquina remota | Sandboxes remotos gerenciados com sincronização bidirecional opcional |
Backend SSH
Usebackend: "ssh" quando 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.
- O OpenClaw cria uma raiz remota por escopo em
sandbox.ssh.workspaceRoot. - No primeiro uso após create ou recreate, o OpenClaw inicializa esse workspace remoto a partir do workspace local uma única vez.
- Depois disso,
exec,read,write,edit,apply_patch, leituras de mídia no prompt e preparação de mídia de entrada são executados diretamente no workspace remoto por SSH. - O OpenClaw não sincroniza automaticamente alterações remotas de volta para o workspace local.
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 pelo snapshot normal de segredos em runtime, grava em arquivos temporários com0600e os exclui quando a sessão SSH termina.- Se
*Filee*Dataestiverem definidos para o mesmo item,*Datatem prioridade nessa sessão SSH.
- Edições locais no host feitas fora do OpenClaw após a etapa de inicialização não ficam visíveis remotamente até que você recrie o sandbox.
openclaw sandbox recreateexclui a raiz remota por escopo e inicializa novamente a partir do local no próximo uso.- O navegador em sandbox não é compatível com o backend SSH.
- Configurações
sandbox.docker.*não se aplicam ao backend SSH.
Backend OpenShell
Usebackend: "openshell" quando quiser que o OpenClaw coloque ferramentas em sandbox em um
ambiente remoto gerenciado pelo OpenShell. Para o guia completo de configuração,
referência de configuração e comparação entre modos de workspace, consulte a página dedicada de
OpenShell.
O OpenShell reutiliza o mesmo transporte SSH principal 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) além do modo opcional de workspace mirror.
mirror(padrão): o workspace local continua sendo o canônico. O OpenClaw sincroniza arquivos locais com o OpenShell antes de exec e sincroniza o workspace remoto de volta após exec.remote: o workspace OpenShell se torna o canônico após a criação do sandbox. O OpenClaw inicializa o workspace remoto uma vez a partir do workspace local, então ferramentas de arquivo e exec rodam diretamente no sandbox remoto sem sincronizar alterações de volta.
- O OpenClaw solicita ao OpenShell a configuração SSH específica do sandbox por meio de
openshell sandbox ssh-config <name>. - O núcleo 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 de local para remoto antes de exec e depois sincroniza de volta após exec.
- navegador em sandbox ainda não é compatível
sandbox.docker.bindsnão é compatível com o backend OpenShell- parâmetros de runtime específicos do Docker em
sandbox.docker.*continuam se aplicando apenas ao backend Docker
Modos de workspace
O OpenShell tem dois modelos de workspace. Esta é a parte que mais importa na prática.mirror
Use plugins.entries.openshell.config.mode: "mirror" quando quiser que o workspace local continue sendo o canônico.
Comportamento:
- Antes de
exec, o OpenClaw sincroniza o workspace local com o sandbox OpenShell. - Depois de
exec, o OpenClaw sincroniza o workspace remoto de volta para o workspace local. - As ferramentas de arquivo ainda operam por meio da ponte do sandbox, mas o workspace local permanece como fonte da verdade entre turnos.
- você edita arquivos localmente fora do OpenClaw e quer que essas alterações apareçam no sandbox automaticamente
- você quer que o sandbox OpenShell se comporte o máximo possível como o backend Docker
- você quer que o workspace do host reflita gravações do sandbox após cada turno de exec
- custo extra de sincronização antes e depois de exec
remote
Use plugins.entries.openshell.config.mode: "remote" quando quiser que o workspace OpenShell se torne o 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 sobre o workspace remoto do OpenShell. - O OpenClaw não sincroniza alterações remotas de volta para o workspace local após exec.
- Leituras de mídia no momento do prompt continuam funcionando porque ferramentas de arquivo e mídia leem por meio da ponte do sandbox em vez de assumir um caminho local do host.
- O transporte é SSH para dentro do sandbox OpenShell retornado por
openshell sandbox ssh-config.
- 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 novamente a partir do workspace local.
- Com
scope: "agent"ouscope: "shared", esse workspace remoto será compartilhado nesse mesmo escopo.
- 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 no host sobrescrevam silenciosamente o estado remoto do sandbox
mirror se você pensa no sandbox como um ambiente temporário de execução.
Escolha remote se você pensa no sandbox como o workspace real.
Ciclo de vida do OpenShell
Sandboxes OpenShell ainda são gerenciados pelo ciclo de vida normal de sandbox:openclaw sandbox listmostra runtimes OpenShell além de 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 reconhece o backend
remote, recreate é especialmente importante:
- recreate exclui o workspace remoto canônico desse escopo
- o próximo uso inicializa um novo workspace remoto a partir do workspace local
mirror, recreate redefine principalmente o ambiente remoto de execução
porque o workspace local continua sendo 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(desativawrite/edit/apply_patch)."rw": monta o workspace do agente como leitura/gravação em/workspace.
- o modo
mirrorainda usa o workspace local como fonte canônica entre turnos de exec - o modo
remoteusa o workspace remoto do OpenShell como fonte canônica após a inicialização inicial workspaceAccess: "ro"e"none"ainda restringem o comportamento de gravação da mesma forma
media/inbound/*).
Observação sobre Skills: a ferramenta read é enraizada no sandbox. Com workspaceAccess: "none",
o OpenClaw espelha Skills elegíveis no workspace do sandbox (.../skills) para
que possam ser lidos. Com "rw", Skills do workspace são legíveis em
/workspace/skills.
Bind mounts personalizados
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 em sandbox.
- Quando definido (inclusive
[]), ele substituiagents.defaults.sandbox.docker.bindspara o contêiner do navegador. - Quando omitido, o contêiner do navegador usa
agents.defaults.sandbox.docker.bindscomo fallback (compatibilidade retroativa).
- Binds ignoram o sistema de arquivos do sandbox: eles expõem caminhos do host com o modo que você definir (
:roou:rw). - O OpenClaw bloqueia origens de bind perigosas (por exemplo:
docker.sock,/etc,/proc,/sys,/deve montagens pai que os exporiam). - O OpenClaw também bloqueia raízes comuns de credenciais no diretório home, como
~/.aws,~/.cargo,~/.config,~/.docker,~/.gnupg,~/.netrc,~/.npme~/.ssh. - A validação de bind não é apenas correspondência de string. O OpenClaw normaliza o caminho de origem e depois o resolve novamente pelo ancestral existente mais profundo antes de verificar novamente caminhos bloqueados e raízes permitidas.
- Isso significa que escapes por pai de symlink ainda falham de forma segura, mesmo quando a folha final ainda não existe. Exemplo:
/workspace/run-link/new-fileainda é resolvido como/var/run/...serun-linkapontar para lá. - As raízes de origem permitidas são canonizadas da mesma forma, então um caminho que apenas parece estar dentro da allowlist antes da resolução de symlink ainda é rejeitado como
outside allowed roots. - Montagens sensíveis (segredos, chaves SSH, credenciais de serviço) devem ser
:ro, a menos que seja absolutamente necessário. - Combine com
workspaceAccess: "ro"se você precisar apenas de acesso de leitura ao workspace; os modos de bind continuam independentes. - Consulte Sandbox vs Tool Policy vs Elevated para entender como binds interagem com a política de ferramentas e exec elevado.
Imagens + configuração
Imagem Docker padrão:openclaw-sandbox:bookworm-slim
Construa-a uma vez:
sandbox.docker.setupCommand (requer saída de rede + raiz gravável +
usuário root).
Se você quiser uma imagem de sandbox mais funcional com ferramentas comuns (por exemplo
curl, jq, nodejs, python3, git), construa:
agents.defaults.sandbox.docker.image como
openclaw-sandbox-common:bookworm-slim.
Imagem do navegador em sandbox:
agents.defaults.sandbox.docker.network.
A imagem de navegador em sandbox empacotada também aplica padrões conservadores de inicialização do Chromium
para cargas de trabalho em contêiner. Os padrões atuais de 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-sandboxe--disable-setuid-sandboxquandonoSandboxestiver ativado.- As três flags de hardening gráfico (
--disable-3d-apis,--disable-software-rasterizer,--disable-gpu) são opcionais e são úteis quando os 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/do navegador. --disable-extensionsfica ativado por padrão e pode ser desativado comOPENCLAW_BROWSER_DISABLE_EXTENSIONS=0para fluxos que dependem de extensões.--renderer-process-limit=2é controlado porOPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N>, onde0mantém o padrão do Chromium.
browser.extraArgs para acrescentar flags adicionais de inicialização.
Padrões de segurança:
network: "host"é bloqueado.network: "container:<id>"é bloqueado por padrão (risco de ignorar namespace join).- Substituição break-glass:
agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true.
scripts/docker/setup.sh pode inicializar a configuração de sandbox.
Defina OPENCLAW_SANDBOX=1 (ou true/yes/on) para ativar esse caminho. Você pode
substituir a localização do socket com OPENCLAW_DOCKER_SOCKET. Configuração completa e referência de env:
Docker.
setupCommand (configuração única do contêiner)
setupCommand roda uma vez após a criação do contêiner do sandbox (não a cada 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
- O padrão de
docker.networké"none"(sem saída), então instalações de pacotes falharão. docker.network: "container:<id>"exigedangerouslyAllowContainerNamespaceJoin: truee é apenas break-glass.readOnlyRoot: trueimpede gravações; definareadOnlyRoot: falseou crie uma imagem personalizada.userdeve ser root para instalações de pacotes (omitauserou definauser: "0:0").- O exec em sandbox não herda
process.envdo host. Useagents.defaults.sandbox.docker.env(ou uma imagem personalizada) para chaves de API de Skills.
Política de ferramentas + caminhos de escape
Políticas de allow/deny de ferramentas ainda se aplicam antes das regras de sandbox. Se uma ferramenta estiver negada globalmente ou por agente, o sandboxing não a traz de volta.tools.elevated é um caminho de escape explícito que executa exec fora do sandbox (gateway por padrão, ou node quando o destino de exec é node).
Diretivas /exec só se aplicam a remetentes autorizados e persistem por sessão; para desativar
exec de forma rígida, use deny na política de ferramentas (consulte Sandbox vs Tool Policy vs Elevated).
Depuração:
- Use
openclaw sandbox explainpara inspecionar modo efetivo de sandbox, política de ferramentas e chaves de configuração para correção. - Consulte Sandbox vs Tool Policy vs Elevated para o modelo mental de “por que isso está bloqueado?”. Mantenha tudo bloqueado.
Substituições para vários agentes
Cada agente pode substituir sandbox + ferramentas:agents.list[].sandbox e agents.list[].tools (além de agents.list[].tools.sandbox.tools para política de ferramentas do sandbox).
Consulte Multi-Agent Sandbox & Tools para precedência.
Exemplo mínimo de ativação
Documentação relacionada
- OpenShell — configuração do backend de sandbox gerenciado, modos de workspace e referência de configuração
- Sandbox Configuration
- Sandbox vs Tool Policy vs Elevated — depuração de “por que isso está bloqueado?”
- Multi-Agent Sandbox & Tools — substituições por agente e precedência
- Security