Sandboxing
OpenClaw puede ejecutar herramientas dentro de backends de sandbox para reducir el radio de impacto. Esto es opcional y se controla mediante la configuración (agents.defaults.sandbox o
agents.list[].sandbox). Si el sandboxing está desactivado, las herramientas se ejecutan en el host.
El Gateway permanece en el host; la ejecución de herramientas se realiza en un sandbox aislado
cuando está habilitado.
Esto no es un límite de seguridad perfecto, pero limita materialmente el acceso al
sistema de archivos y a procesos cuando el modelo hace algo poco sensato.
Qué entra en el sandbox
- Ejecución de herramientas (
exec,read,write,edit,apply_patch,process, etc.). - Navegador opcional en sandbox (
agents.defaults.sandbox.browser).- De forma predeterminada, el navegador del sandbox se inicia automáticamente (garantiza que CDP sea accesible) cuando la herramienta del navegador lo necesita.
Configúralo con
agents.defaults.sandbox.browser.autoStartyagents.defaults.sandbox.browser.autoStartTimeoutMs. - De forma predeterminada, los contenedores del navegador del sandbox usan una red Docker dedicada (
openclaw-sandbox-browser) en lugar de la red globalbridge. Configúralo conagents.defaults.sandbox.browser.network. agents.defaults.sandbox.browser.cdpSourceRangeopcional restringe el ingreso de CDP en el borde del contenedor con una lista de permitidos CIDR (por ejemplo172.21.0.1/32).- El acceso del observador noVNC está protegido por contraseña de forma predeterminada; OpenClaw emite una URL con token de corta duración que sirve una página local de arranque y abre noVNC con la contraseña en el fragmento de URL (no en logs de consulta/cabecera).
agents.defaults.sandbox.browser.allowHostControlpermite que las sesiones en sandbox apunten explícitamente al navegador del host.- Las listas de permitidos opcionales controlan
target: "custom":allowedControlUrls,allowedControlHosts,allowedControlPorts.
- De forma predeterminada, el navegador del sandbox se inicia automáticamente (garantiza que CDP sea accesible) cuando la herramienta del navegador lo necesita.
Configúralo con
- El propio proceso Gateway.
- Cualquier herramienta autorizada explícitamente para ejecutarse fuera del sandbox (por ejemplo
tools.elevated).- Elevated exec omite el sandboxing y usa la ruta de escape configurada (
gatewayde forma predeterminada, onodecuando el destino de exec esnode). - Si el sandboxing está desactivado,
tools.elevatedno cambia la ejecución (ya está en el host). Consulta Elevated Mode.
- Elevated exec omite el sandboxing y usa la ruta de escape configurada (
Modos
agents.defaults.sandbox.mode controla cuándo se usa el sandboxing:
"off": sin sandboxing."non-main": sandbox solo para sesiones no principales (predeterminado si quieres chats normales en el host)."all": todas las sesiones se ejecutan en un sandbox. Nota:"non-main"se basa ensession.mainKey(predeterminado"main"), no en el id del agente. Las sesiones de grupo/canal usan sus propias claves, por lo que cuentan como no principales y se ejecutarán en sandbox.
Alcance
agents.defaults.sandbox.scope controla cuántos contenedores se crean:
"agent"(predeterminado): un contenedor por agente."session": un contenedor por sesión."shared": un contenedor compartido por todas las sesiones en sandbox.
Backend
agents.defaults.sandbox.backend controla qué entorno de ejecución proporciona el sandbox:
"docker"(predeterminado): entorno de ejecución de sandbox local respaldado por Docker."ssh": entorno de ejecución remoto genérico respaldado por SSH."openshell": entorno de ejecución de sandbox respaldado por OpenShell.
agents.defaults.sandbox.ssh.
La configuración específica de OpenShell se encuentra en plugins.entries.openshell.config.
Elegir un backend
| Docker | SSH | OpenShell | |
|---|---|---|---|
| Dónde se ejecuta | Contenedor local | Cualquier host accesible por SSH | Sandbox gestionado por OpenShell |
| Configuración | scripts/sandbox-setup.sh | Clave SSH + host de destino | Plugin de OpenShell habilitado |
| Modelo de espacio de trabajo | Montaje bind o copia | Remoto-canónico (inicialización única) | mirror o remote |
| Control de red | docker.network (predeterminado: none) | Depende del host remoto | Depende de OpenShell |
| Navegador en sandbox | Compatible | No compatible | Aún no compatible |
| Montajes bind | docker.binds | N/A | N/A |
| Ideal para | Desarrollo local, aislamiento completo | Delegar a una máquina remota | Sandboxes remotos gestionados con sincronización bidireccional opcional |
Backend SSH
Usabackend: "ssh" cuando quieras que OpenClaw ejecute en sandbox exec, herramientas de archivos y lecturas de medios en
una máquina arbitraria accesible por SSH.
- OpenClaw crea una raíz remota por alcance bajo
sandbox.ssh.workspaceRoot. - En el primer uso tras crear o recrear, OpenClaw inicializa ese espacio de trabajo remoto a partir del espacio de trabajo local una sola vez.
- Después de eso,
exec,read,write,edit,apply_patch, lecturas de medios en tiempo de prompt y preparación de medios entrantes se ejecutan directamente sobre el espacio de trabajo remoto por SSH. - OpenClaw no sincroniza automáticamente los cambios remotos de vuelta al espacio de trabajo local.
identityFile,certificateFile,knownHostsFile: usan archivos locales existentes y los pasan mediante configuración OpenSSH.identityData,certificateData,knownHostsData: usan cadenas en línea o SecretRefs. OpenClaw los resuelve mediante la instantánea normal de secretos del entorno de ejecución, los escribe en archivos temporales con0600y los elimina cuando termina la sesión SSH.- Si se configuran tanto
*Filecomo*Datapara el mismo elemento,*Datatiene prioridad para esa sesión SSH.
- Las ediciones locales del host realizadas fuera de OpenClaw después del paso de inicialización no son visibles en remoto hasta que recrees el sandbox.
openclaw sandbox recreateelimina la raíz remota por alcance y vuelve a inicializar desde local en el siguiente uso.- El navegador en sandbox no es compatible con el backend SSH.
- La configuración
sandbox.docker.*no se aplica al backend SSH.
Backend OpenShell
Usabackend: "openshell" cuando quieras que OpenClaw ejecute herramientas en sandbox dentro de un
entorno remoto gestionado por OpenShell. Para ver la guía completa de configuración, la
referencia de configuración y la comparación de modos de espacio de trabajo, consulta la
página de OpenShell.
OpenShell reutiliza el mismo transporte SSH central y el puente de sistema de archivos remoto que el
backend SSH genérico, y añade el ciclo de vida específico de OpenShell
(sandbox create/get/delete, sandbox ssh-config) además del modo opcional de espacio de trabajo mirror.
mirror(predeterminado): el espacio de trabajo local sigue siendo canónico. OpenClaw sincroniza los archivos locales con OpenShell antes de exec y sincroniza el espacio de trabajo remoto de vuelta después de exec.remote: el espacio de trabajo de OpenShell es canónico una vez creado el sandbox. OpenClaw inicializa el espacio de trabajo remoto una vez a partir del espacio de trabajo local, y luego las herramientas de archivos y exec se ejecutan directamente sobre el sandbox remoto sin volver a sincronizar cambios.
- OpenClaw solicita a OpenShell la configuración SSH específica del sandbox mediante
openshell sandbox ssh-config <name>. - El núcleo escribe esa configuración SSH en un archivo temporal, abre la sesión SSH y reutiliza el mismo puente de sistema de archivos remoto usado por
backend: "ssh". - Solo en modo
mirrorcambia el ciclo de vida: sincroniza de local a remoto antes de exec y vuelve a sincronizar después de exec.
- el navegador del sandbox aún no es compatible
sandbox.docker.bindsno es compatible con el backend OpenShell- los controles de tiempo de ejecución específicos de Docker en
sandbox.docker.*siguen aplicándose solo al backend Docker
Modos de espacio de trabajo
OpenShell tiene dos modelos de espacio de trabajo. Esta es la parte que más importa en la práctica.mirror
Usa plugins.entries.openshell.config.mode: "mirror" cuando quieras que el espacio de trabajo local siga siendo canónico.
Comportamiento:
- Antes de
exec, OpenClaw sincroniza el espacio de trabajo local con el sandbox de OpenShell. - Después de
exec, OpenClaw sincroniza el espacio de trabajo remoto de vuelta al espacio de trabajo local. - Las herramientas de archivos siguen operando a través del puente del sandbox, pero el espacio de trabajo local sigue siendo la fuente de verdad entre turnos.
- editas archivos localmente fuera de OpenClaw y quieres que esos cambios aparezcan automáticamente en el sandbox
- quieres que el sandbox de OpenShell se comporte lo más parecido posible al backend Docker
- quieres que el espacio de trabajo del host refleje las escrituras del sandbox después de cada turno de exec
- coste adicional de sincronización antes y después de exec
remote
Usa plugins.entries.openshell.config.mode: "remote" cuando quieras que el espacio de trabajo de OpenShell pase a ser canónico.
Comportamiento:
- Cuando se crea el sandbox por primera vez, OpenClaw inicializa el espacio de trabajo remoto a partir del espacio de trabajo local una sola vez.
- Después de eso,
exec,read,write,edityapply_patchoperan directamente sobre el espacio de trabajo remoto de OpenShell. - OpenClaw no sincroniza los cambios remotos de vuelta al espacio de trabajo local después de exec.
- Las lecturas de medios en tiempo de prompt siguen funcionando porque las herramientas de archivos y medios leen a través del puente del sandbox en lugar de asumir una ruta local del host.
- El transporte es SSH hacia el sandbox de OpenShell devuelto por
openshell sandbox ssh-config.
- Si editas archivos en el host fuera de OpenClaw después del paso de inicialización, el sandbox remoto no verá esos cambios automáticamente.
- Si el sandbox se recrea, el espacio de trabajo remoto se vuelve a inicializar a partir del espacio de trabajo local.
- Con
scope: "agent"oscope: "shared", ese espacio de trabajo remoto se comparte en ese mismo alcance.
- el sandbox deba vivir principalmente en el lado remoto de OpenShell
- quieras una menor sobrecarga de sincronización por turno
- no quieras que las ediciones locales del host sobrescriban silenciosamente el estado remoto del sandbox
mirror si piensas en el sandbox como un entorno de ejecución temporal.
Elige remote si piensas en el sandbox como el espacio de trabajo real.
Ciclo de vida de OpenShell
Los sandboxes de OpenShell siguen gestionándose mediante el ciclo de vida normal del sandbox:openclaw sandbox listmuestra entornos de ejecución de OpenShell además de los de Dockeropenclaw sandbox recreateelimina el entorno de ejecución actual y permite que OpenClaw lo recree en el siguiente uso- la lógica de limpieza también tiene en cuenta el backend
remote, recreate es especialmente importante:
- recreate elimina el espacio de trabajo remoto canónico para ese alcance
- el siguiente uso inicializa un espacio de trabajo remoto nuevo a partir del espacio de trabajo local
mirror, recreate principalmente restablece el entorno de ejecución remoto
porque el espacio de trabajo local sigue siendo canónico de todos modos.
Acceso al espacio de trabajo
agents.defaults.sandbox.workspaceAccess controla qué puede ver el sandbox:
"none"(predeterminado): las herramientas ven un espacio de trabajo de sandbox bajo~/.openclaw/sandboxes."ro": monta el espacio de trabajo del agente en solo lectura en/agent(deshabilitawrite/edit/apply_patch)."rw": monta el espacio de trabajo del agente en lectura/escritura en/workspace.
- el modo
mirrorsigue usando el espacio de trabajo local como fuente canónica entre turnos de exec - el modo
remoteusa el espacio de trabajo remoto de OpenShell como fuente canónica después de la inicialización inicial workspaceAccess: "ro"y"none"siguen restringiendo el comportamiento de escritura de la misma manera
media/inbound/*).
Nota sobre Skills: la herramienta read tiene como raíz el sandbox. Con workspaceAccess: "none",
OpenClaw refleja los Skills aptos en el espacio de trabajo del sandbox (.../skills) para
que puedan leerse. Con "rw", los Skills del espacio de trabajo se pueden leer desde
/workspace/skills.
Montajes bind personalizados
agents.defaults.sandbox.docker.binds monta directorios adicionales del host en el contenedor.
Formato: host:container:mode (por ejemplo, "/home/user/source:/source:rw").
Los montajes globales y por agente se fusionan (no se reemplazan). En scope: "shared", los montajes por agente se ignoran.
agents.defaults.sandbox.browser.binds monta directorios adicionales del host solo en el contenedor del navegador del sandbox.
- Cuando se configura (incluido
[]), reemplazaagents.defaults.sandbox.docker.bindspara el contenedor del navegador. - Cuando se omite, el contenedor del navegador recurre a
agents.defaults.sandbox.docker.binds(compatibilidad hacia atrás).
- Los montajes bind eluden el sistema de archivos del sandbox: exponen rutas del host con el modo que configures (
:roo:rw). - OpenClaw bloquea orígenes de montaje peligrosos (por ejemplo:
docker.sock,/etc,/proc,/sys,/devy montajes padre que los expondrían). - OpenClaw también bloquea raíces comunes de credenciales en directorios personales como
~/.aws,~/.cargo,~/.config,~/.docker,~/.gnupg,~/.netrc,~/.npmy~/.ssh. - La validación de montajes bind no se basa solo en coincidencias de cadenas. OpenClaw normaliza la ruta de origen y luego la resuelve de nuevo a través del ancestro existente más profundo antes de volver a comprobar rutas bloqueadas y raíces permitidas.
- Eso significa que los escapes mediante padres simbólicos siguen fallando de forma segura aunque la hoja final aún no exista. Ejemplo:
/workspace/run-link/new-filesigue resolviéndose como/var/run/...sirun-linkapunta allí. - Las raíces de origen permitidas se canonizan del mismo modo, por lo que una ruta que solo parece estar dentro de la lista de permitidos antes de la resolución de enlaces simbólicos sigue siendo rechazada como
outside allowed roots. - Los montajes sensibles (secretos, claves SSH, credenciales de servicio) deben ser
:rosalvo que sea absolutamente necesario. - Combínalo con
workspaceAccess: "ro"si solo necesitas acceso de lectura al espacio de trabajo; los modos de bind siguen siendo independientes. - Consulta Sandbox vs Tool Policy vs Elevated para ver cómo interactúan los montajes bind con la política de herramientas y elevated exec.
Imágenes y configuración
Imagen Docker predeterminada:openclaw-sandbox:bookworm-slim
Constrúyela una vez:
sandbox.docker.setupCommand (requiere salida de red + raíz con escritura +
usuario root).
Si quieres una imagen de sandbox más funcional con herramientas comunes (por ejemplo
curl, jq, nodejs, python3, git), crea:
agents.defaults.sandbox.docker.image en
openclaw-sandbox-common:bookworm-slim.
Imagen del navegador en sandbox:
agents.defaults.sandbox.docker.network.
La imagen incluida del navegador en sandbox también aplica valores predeterminados conservadores para el inicio de Chromium
en cargas de trabajo en contenedores. Los valores predeterminados actuales del contenedor incluyen:
--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-sandboxy--disable-setuid-sandboxcuandonoSandboxestá habilitado.- Los tres indicadores de refuerzo gráfico (
--disable-3d-apis,--disable-software-rasterizer,--disable-gpu) son opcionales y resultan útiles cuando los contenedores no tienen soporte GPU. ConfiguraOPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0si tu carga de trabajo requiere WebGL u otras funciones 3D/del navegador. --disable-extensionsestá habilitado de forma predeterminada y puede deshabilitarse conOPENCLAW_BROWSER_DISABLE_EXTENSIONS=0para flujos que dependen de extensiones.--renderer-process-limit=2se controla medianteOPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N>, donde0mantiene el valor predeterminado de Chromium.
browser.extraArgs para añadir indicadores de inicio adicionales.
Valores predeterminados de seguridad:
network: "host"está bloqueado.network: "container:<id>"está bloqueado de forma predeterminada (riesgo de omisión por unión de namespace).- Anulación de emergencia:
agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true.
scripts/docker/setup.sh puede inicializar la configuración del sandbox.
Configura OPENCLAW_SANDBOX=1 (o true/yes/on) para habilitar esa ruta. Puedes
anular la ubicación del socket con OPENCLAW_DOCKER_SOCKET. Referencia completa de
configuración y variables de entorno: Docker.
setupCommand (configuración única del contenedor)
setupCommand se ejecuta una vez después de crear el contenedor del sandbox (no en cada ejecución).
Se ejecuta dentro del contenedor mediante sh -lc.
Rutas:
- Global:
agents.defaults.sandbox.docker.setupCommand - Por agente:
agents.list[].sandbox.docker.setupCommand
docker.networkpredeterminado es"none"(sin salida), por lo que las instalaciones de paquetes fallarán.docker.network: "container:<id>"requieredangerouslyAllowContainerNamespaceJoin: truey es solo de emergencia.readOnlyRoot: trueimpide escrituras; configurareadOnlyRoot: falseo crea una imagen personalizada.userdebe ser root para instalaciones de paquetes (omiteusero configurauser: "0:0").- El sandbox exec no hereda
process.envdel host. Usaagents.defaults.sandbox.docker.env(o una imagen personalizada) para las claves de API de Skills.
Política de herramientas y rutas de escape
Las políticas de permitir/denegar herramientas siguen aplicándose antes de las reglas del sandbox. Si una herramienta está denegada globalmente o por agente, el sandboxing no la restablece.tools.elevated es una ruta de escape explícita que ejecuta exec fuera del sandbox (gateway de forma predeterminada, o node cuando el destino de exec es node).
Las directivas /exec solo se aplican a remitentes autorizados y persisten por sesión; para deshabilitar de forma rígida
exec, usa la política de herramientas deny (consulta Sandbox vs Tool Policy vs Elevated).
Depuración:
- Usa
openclaw sandbox explainpara inspeccionar el modo de sandbox efectivo, la política de herramientas y claves de configuración sugeridas para corregir. - Consulta Sandbox vs Tool Policy vs Elevated para el modelo mental de “¿por qué está bloqueado esto?”. Mantenlo restringido.
Anulaciones para varios agentes
Cada agente puede anular sandbox y herramientas:agents.list[].sandbox y agents.list[].tools (además de agents.list[].tools.sandbox.tools para política de herramientas del sandbox).
Consulta Multi-Agent Sandbox & Tools para ver la precedencia.
Ejemplo mínimo de habilitación
Documentación relacionada
- OpenShell — configuración del backend de sandbox gestionado, modos de espacio de trabajo y referencia de configuración
- Sandbox Configuration
- Sandbox vs Tool Policy vs Elevated — depurar “¿por qué está bloqueado esto?”
- Multi-Agent Sandbox & Tools — anulaciones por agente y precedencia
- Security