Sandboxing
OpenClaw puede ejecutar herramientas dentro de contenedores Docker para reducir el radio de impacto.
Esto es opcional y se controla mediante 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 ejecuta en un sandbox
aislado cuando está habilitado.
Esta no es una frontera de seguridad perfecta, pero limita materialmente el acceso al sistema de archivos y a los procesos cuando el modelo hace algo imprudente.
Qué se ejecuta en sandbox
- Ejecución de herramientas (
exec,read,write,edit,apply_patch,process, etc.). - Navegador en sandbox opcional (
agents.defaults.sandbox.browser).- Por defecto, el navegador del sandbox se inicia automáticamente (asegura que CDP sea alcanzable) cuando la herramienta de navegador lo necesita.
Configúralo vía
agents.defaults.sandbox.browser.autoStartyagents.defaults.sandbox.browser.autoStartTimeoutMs. - Por defecto, los contenedores del navegador en sandbox usan una red Docker dedicada (
openclaw-sandbox-browser) en lugar de la redbridgeglobal. Configúralo conagents.defaults.sandbox.browser.network. - El opcional
agents.defaults.sandbox.browser.cdpSourceRangerestringe el ingreso CDP en el borde del contenedor con una lista CIDR de permitidos (por ejemplo172.21.0.1/32). - El acceso de observador noVNC está protegido por contraseña por defecto; OpenClaw emite una URL de token de corta duración que sirve una página bootstrap local y abre noVNC con la contraseña en el fragmento de URL (no en query/header de logs).
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.
- Por defecto, el navegador del sandbox se inicia automáticamente (asegura que CDP sea alcanzable) cuando la herramienta de navegador lo necesita.
Configúralo vía
No se ejecuta en sandbox:
- El proceso del Gateway en sí.
- Cualquier herramienta explícitamente permitida para ejecutarse en el host (ej.
tools.elevated).- La ejecución elevada se ejecuta en el host y omite el sandboxing.
- Si el sandboxing está desactivado,
tools.elevatedno cambia la ejecución (ya está en el host). Consulta Modo elevado.
Modos
agents.defaults.sandbox.mode controla cuándo se usa el sandboxing:
"off": sin sandboxing."non-main": sandbox solo para sesiones no-main (por defecto si quieres chats normales en el host)."all": cada sesión se ejecuta en un sandbox. Nota:"non-main"se basa ensession.mainKey(por defecto"main"), no en el id del agente. Las sesiones de grupo/canal usan sus propias claves, así que cuentan como no-main y serán ejecutadas en sandbox.
Alcance
agents.defaults.sandbox.scope controla cuántos contenedores se crean:
"session"(por defecto): un contenedor por sesión."agent": un contenedor por agente."shared": un contenedor compartido por todas las sesiones en sandbox.
Acceso al workspace
agents.defaults.sandbox.workspaceAccess controla qué puede ver el sandbox:
"none"(por defecto): las herramientas ven un workspace de sandbox bajo~/.openclaw/sandboxes."ro": monta el workspace del agente como solo lectura en/agent(deshabilitawrite/edit/apply_patch)."rw": monta el workspace del agente con lectura/escritura en/workspace.
Los medios entrantes se copian al workspace activo del sandbox (media/inbound/*).
Nota sobre skills: la herramienta read tiene raíz en el sandbox. Con workspaceAccess: "none",
OpenClaw replica las skills elegibles en el workspace del sandbox (.../skills) para
que puedan ser leídas. Con "rw", las skills del workspace son legibles desde
/workspace/skills.
Montajes bind personalizados
agents.defaults.sandbox.docker.binds monta directorios adicionales del host en el contenedor.
Formato: host:container:mode (ej., "/home/user/source:/source:rw").
Los binds globales y por agente se fusionan (no se reemplazan). Con scope: "shared", los binds por agente se ignoran.
agents.defaults.sandbox.browser.binds monta directorios adicionales del host en el contenedor del navegador en sandbox solamente.
- Cuando se establece (incluyendo
[]), reemplazaagents.defaults.sandbox.docker.bindspara el contenedor del navegador. - Cuando se omite, el contenedor del navegador recurre a
agents.defaults.sandbox.docker.binds(compatible con versiones anteriores).
Ejemplo (código fuente solo lectura + un directorio de datos adicional):
{
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"],
},
},
},
],
},
}
Notas de seguridad:
- Los binds omiten el sistema de archivos del sandbox: exponen rutas del host con el modo que configures (
:roo:rw). - OpenClaw bloquea fuentes de bind peligrosas (por ejemplo:
docker.sock,/etc,/proc,/sys,/dev, y montajes padre que los expondrían). - Los montajes sensibles (secretos, claves SSH, credenciales de servicio) deberían ser
:roa menos que sea absolutamente necesario. - Combina con
workspaceAccess: "ro"si solo necesitas acceso de lectura al workspace; los modos de bind se mantienen independientes. - Consulta Sandbox vs Política de herramientas vs Elevado para entender cómo interactúan los binds con la política de herramientas y la ejecución elevada.
Imágenes + configuración
Imagen por defecto: openclaw-sandbox:bookworm-slim
Constrúyela una vez:
scripts/sandbox-setup.sh
Nota: la imagen por defecto no incluye Node. Si una skill necesita Node (u
otros runtimes), construye una imagen personalizada o instálalos vía
sandbox.docker.setupCommand (requiere egreso de red + root escribible +
usuario root).
Si quieres una imagen de sandbox más funcional con herramientas comunes (por ejemplo
curl, jq, nodejs, python3, git), construye:
scripts/sandbox-common-setup.sh
Luego establece agents.defaults.sandbox.docker.image a
openclaw-sandbox-common:bookworm-slim.
Imagen del navegador en sandbox:
scripts/sandbox-browser-setup.sh
Por defecto, los contenedores sandbox se ejecutan sin red.
Sobrescríbelo con agents.defaults.sandbox.docker.network.
La imagen del navegador en sandbox incluida también aplica valores por defecto conservadores de inicio de Chromium para cargas de trabajo en contenedores. Los valores por defecto actuales del contenedor incluyen:
--remote-debugging-address=127.0.0.1--remote-debugging-port=<derivado de 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 flags de endurecimiento gráfico (
--disable-3d-apis,--disable-software-rasterizer,--disable-gpu) son opcionales y son útiles cuando los contenedores carecen de soporte GPU. EstableceOPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0si tu carga de trabajo requiere WebGL u otras funciones 3D/navegador. --disable-extensionsestá habilitado por defecto 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 por defecto de Chromium.
Si necesitas un perfil de runtime diferente, usa una imagen de navegador personalizada y proporciona
tu propio punto de entrada. Para perfiles de Chromium locales (no en contenedor), usa
browser.extraArgs para agregar flags de inicio adicionales.
Valores de seguridad por defecto:
network: "host"está bloqueado.network: "container:<id>"está bloqueado por defecto (riesgo de bypass por unión de namespace).- Solución de emergencia:
agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true.
Las instalaciones de Docker y el gateway en contenedor se encuentran aquí: Docker
Para despliegues de gateway Docker, docker-setup.sh puede configurar automáticamente el sandbox.
Establece OPENCLAW_SANDBOX=1 (o true/yes/on) para habilitar esa ruta. Puedes
sobrescribir la ubicación del socket con OPENCLAW_DOCKER_SOCKET. Configuración completa y
referencia de env: Docker.
setupCommand (configuración única del contenedor)
setupCommand se ejecuta una vez después de crear el contenedor sandbox (no en cada ejecución).
Se ejecuta dentro del contenedor vía sh -lc.
Rutas:
- Global:
agents.defaults.sandbox.docker.setupCommand - Por agente:
agents.list[].sandbox.docker.setupCommand
Problemas comunes:
- El
docker.networkpor defecto es"none"(sin egreso), así que las instalaciones de paquetes fallarán. docker.network: "container:<id>"requieredangerouslyAllowContainerNamespaceJoin: truey es solo para emergencias.readOnlyRoot: trueimpide escrituras; establecereadOnlyRoot: falseo construye una imagen personalizada.userdebe ser root para instalaciones de paquetes (omiteusero estableceuser: "0:0").- La ejecución en sandbox no hereda
process.envdel host. Usaagents.defaults.sandbox.docker.env(o una imagen personalizada) para claves API de skills.
Política de herramientas + válvulas de escape
Las políticas allow/deny de herramientas siguen aplicándose antes que las reglas del sandbox. Si una herramienta está denegada globalmente o por agente, el sandboxing no la recupera.
tools.elevated es una válvula de escape explícita que ejecuta exec en el host.
Las directivas /exec solo aplican para remitentes autorizados y persisten por sesión; para deshabilitar
exec de forma permanente, usa la política deny de herramientas (consulta Sandbox vs Política de herramientas vs Elevado).
Depuración:
- Usa
openclaw sandbox explainpara inspeccionar el modo de sandbox efectivo, política de herramientas y claves de configuración para solucionar. - Consulta Sandbox vs Política de herramientas vs Elevado para el modelo mental de “¿por qué está bloqueado esto?”. Mantenlo bloqueado.
Sobrescrituras multi-agente
Cada agente puede sobrescribir sandbox + herramientas:
agents.list[].sandbox y agents.list[].tools (más agents.list[].tools.sandbox.tools para la política de herramientas del sandbox).
Consulta Sandbox y herramientas multi-agente para la precedencia.
Ejemplo mínimo de habilitación
{
agents: {
defaults: {
sandbox: {
mode: "non-main",
scope: "session",
workspaceAccess: "none",
},
},
},
}