agents.defaults.sandbox(全局)或 agents.entries.*.sandbox(按代理)控制。网关进程始终运行在主机上;只有在启用沙箱化时,工具执行才会移入沙箱。
这并不是完美的安全边界,但当模型做出一些愚蠢操作时,它确实能显著限制文件系统和进程访问。
什么会被沙箱化
- 工具执行:
exec、read、write、edit、apply_patch、process等。 - 可选的沙箱化浏览器(
agents.defaults.sandbox.browser)。
- Gateway 进程本身。
- 任何通过
tools.elevated明确允许在沙箱外运行的工具。提升权限的exec会绕过沙箱,并在配置的逃逸路径上运行(默认是gateway,或者当 exec 目标是node时为node)。如果沙箱化关闭,tools.elevated不会改变任何内容,因为exec此时本来就运行在主机上。请参阅 Elevated Mode。
模式、作用范围和后端
三个独立设置控制沙箱行为:
模式 控制何时应用沙箱:
off:不使用沙箱。non-main:为除代理主会话之外的每个会话启用沙箱。主会话键始终是agent:<agentId>:main(如果session.scope为"global",则为global);它不可配置。组/频道会话使用各自的键,因此它们始终被视为非主会话并会被沙箱化。all:每个会话都在沙箱中运行。
agent:每个代理一个容器。session:每个会话一个容器。shared:所有被沙箱化的会话共享一个容器(在此作用范围下,按代理的docker/ssh/browser覆盖项会被忽略)。
shared 作用范围则有意与工作区无关。
从旧版本升级后的首次使用,会在包含工作区信息的身份下创建非共享运行时和沙箱工作区。现有的非共享运行时不会被接管;这是一次有意的重置。它们可以通过配置的清理设置自然过期,也可以使用 openclaw sandbox recreate 移除;下次使用时会为当前身份配置运行时。
后端 控制哪个运行时执行沙箱化工具。Docker 和 Podman 共享 agents.defaults.sandbox.docker;SSH 特定配置位于 agents.defaults.sandbox.ssh 下;OpenShell 特定配置位于 plugins.entries.openshell.config 下。
支持的能力矩阵
沙箱后端会隔离工具执行。它们不会将 Gateway、原生插件或控制平面 RPC 移入沙箱。
原生插件与 Gateway 保持进程内运行,并共享其信任边界。
沙箱会话只有在常规工具策略和
tools.sandbox.tools 都允许时,才能使用插件拥有的工具和 MCP 工具。请参阅
MCP 和插件工具在沙箱工具策略中的使用
和插件执行模型。
Docker 后端
Docker 后端通过docker CLI 在本地运行工具。其选择和错误行为保持不变;它不会探测或回退到 Podman。
默认值:network: "none"(无外部网络访问)、readOnlyRoot: true、capDrop: ["ALL"]、镜像 openclaw-sandbox:bookworm-slim。
此显式配置使代理工作区保持只读,并保留默认的受限运行时状态:
no-new-privileges。使用 workspaceAccess: "ro" 时,代理工作区会以只读方式挂载到
/agent;对代理工作区的写入操作会被拒绝,而配置的 tmpfs 路径仍保持可写。
要公开主机 GPU,请将 agents.defaults.sandbox.docker.gpus(或每个代理的覆盖项)设置为类似 "all" 或 "device=GPU-uuid" 的值。该值会传递给所选容器引擎兼容 Docker 的 --gpus 标志,并且需要兼容的主机 GPU 配置。Podman 使用此选项需要 5.0 或更高版本。
沙箱浏览器
- 沙箱浏览器会在浏览器工具需要时自动启动(确保 CDP 可访问)。通过
agents.defaults.sandbox.browser.autoStart(默认值为true)和autoStartTimeoutMs(默认值为 12 秒)进行配置。 - 沙箱浏览器容器使用专用 Docker 网络(
openclaw-sandbox-browser),而不是全局的bridge网络。通过agents.defaults.sandbox.browser.network进行配置。 - 不支持沙箱浏览器网络模式
"none",因为浏览器控制需要主机发布 CDP 端口。请使用专用默认网络、bridge或其他自定义 bridge 网络。openclaw doctor --fix会禁用受影响的持久化 sidecar,并恢复专用网络,不会在不提示的情况下启用出站访问。 agents.defaults.sandbox.browser.cdpSourceRange使用 CIDR 允许列表限制容器边缘的 CDP 入站流量(例如172.21.0.1/32)。- noVNC 观察者访问默认受密码保护;OpenClaw 会生成一个短时有效的令牌 URL,该 URL 提供本地引导页面,并将密码放入 URL 片段中(不会出现在查询字符串或请求头日志中),然后打开 noVNC。
agents.defaults.sandbox.browser.allowHostControl(默认值为false)允许沙箱会话显式指定主机浏览器作为目标。- 可选的允许列表会限制
target: "custom":allowedControlUrls、allowedControlHosts、allowedControlPorts。
Podman 后端
使用sandbox.backend: "podman" 可直接选择原生 podman CLI。这是内置后端,而不是插件。即使已安装 docker 可执行文件,它也不会探测或选择 Docker。
Podman 会复用现有的 sandbox.docker.* 设置和当前原生 podman CLI 上下文;它不会添加单独的连接配置界面。
Rootless Podman 对可写工作区挂载默认使用 --userns=keep-id。长时间运行的沙箱可能会预留从属 ID,并阻塞无关的 --userns=auto 工作负载;在启动这些工作负载之前请将其移除。将 sandbox.docker.user 设置为非零数字 UID 或 UID:GID,以控制容器用户。Rootless Podman 会拒绝 UID 或 GID 0,因为 Podman 4.x 无法在保留工作区绑定所有权的同时重新映射命名空间 root;请将需要 root 权限的设置构建到镜像中,或使用 rootful Podman。除此之外,Rootful Podman 会在可用时使用工作区所有者。
- Podman 不支持浏览器沙箱;请保持
sandbox.browser.enabled关闭,或安装 Docker 并选择backend: "docker"。 - 支持本地 Podman 引擎和 Podman Machine。Podman Machine 的绑定源必须位于主机主目录下,因为该目录是其默认共享卷。拒绝任意远程 Podman 连接;远程执行请使用 SSH 后端。
- 自定义
tmpfs或绑定挂载不得覆盖/run/podman-init;OpenClaw 会拒绝这些配置,以确保沙箱清理继续正常工作。
SSH 后端
使用backend: "ssh" 可将 exec、文件工具和媒体读取沙箱化到任意可通过 SSH 访问的机器上。
command: "ssh"、workspaceRoot: "/tmp/openclaw-sandboxes"、strictHostKeyChecking: true、updateHostKeys: true。
- 生命周期:OpenClaw 会在
sandbox.ssh.workspaceRoot下为每个作用域创建一个远程根目录。首次使用(创建或重新创建后)时,它会从本地工作区向该远程工作区初始化一次内容。之后,exec、read、write、edit、apply_patch、提示中的媒体读取以及入站媒体暂存都会直接通过 SSH 针对远程工作区运行。OpenClaw 不会自动将远程变更同步回本地工作区。 - 认证材料:
identityFile/certificateFile/knownHostsFile引用的是现有的本地文件。identityData/certificateData/knownHostsData接受内联字符串或 SecretRefs,通过正常的 secrets 运行时快照解析,写入权限为0600的临时文件,并在 SSH 会话结束时删除。如果同一项同时设置了*File和*Data变体,则该会话中以*Data为准。 - 远程为准的后果:在初次初始化之后,远程 SSH 工作区将成为真正的沙箱状态。在初始化步骤之后,如果在 OpenClaw 之外对主机本地进行编辑,这些更改在远程不可见,直到你重新创建沙箱。
openclaw sandbox recreate会删除按作用域划分的远程根目录,并在下次使用时再次从本地初始化。此后端不支持浏览器沙箱化,且sandbox.docker.*设置不适用于它。
OpenShell 后端
使用backend: "openshell" 可将工具隔离在由 OpenShell 管理的远程环境中。OpenShell 复用与通用 SSH 后端相同的 SSH 传输和远程文件系统桥接,并额外提供 OpenShell 生命周期(sandbox create/get/delete/ssh-config)以及可选的 mirror 工作区同步模式。
mode: "mirror"(默认)会保持本地工作区为权威来源:OpenClaw 会在 exec 之前将本地内容同步到沙箱中,并在之后同步回来。mode: "remote" 会先从本地向远程工作区初始化一次,然后直接针对远程工作区执行 exec/read/write/edit/apply_patch,而不会再同步回本地;在种子初始化之后对本地所做的编辑在你执行 openclaw sandbox recreate 之前都不可见。在 scope: "agent" 或 scope: "shared" 下,该远程工作区会在相同作用域内共享。当前限制:尚不支持沙箱浏览器,且 sandbox.docker.binds 不适用于此后端。
openclaw sandbox list/recreate/prune 都将 OpenShell 运行时与 Docker 运行时视为相同;清理逻辑会根据后端进行区分。
有关完整的前置条件、配置参考、工作区模式对比以及生命周期细节,请参阅 OpenShell。
工作区访问
agents.defaults.sandbox.workspaceAccess 控制沙箱可见的内容:
使用 OpenShell 后端时,
mirror 模式在各次 exec 之间仍然使用本地工作区作为权威来源,remote 模式在初始种子之后使用远程 OpenShell 工作区作为权威来源,而 workspaceAccess: "ro"/"none" 仍以相同方式限制写入行为。
传入媒体会被复制到活动沙箱工作区(media/inbound/*)。
技能:
read 工具以沙箱为根。对于 workspaceAccess: "none",OpenClaw 会将符合条件的技能镜像到沙箱工作区(.../skills),以便读取。对于 "rw",工作区技能可从 /workspace/skills 读取,而符合条件的受管理、捆绑或插件技能会被实体化到生成的只读路径 /workspace/.openclaw/sandbox-skills/skills。一个代理使用多个文件夹
当一个沙箱代理需要使用主工作区之外的其他目录时,请使用 Docker 绑定挂载。每个条目都会将主机文件夹映射到容器路径,并明确指定访问模式:ro使挂载的文件夹在沙箱内只读。rw允许沙箱中的工具和进程修改主机文件夹。- 容器路径是代理使用的路径。主机路径不会自动暴露。
research 代理提供一个可写的主工作区、挂载到 /reference 的只读参考资料,以及挂载到 /drafts 的单独可写输出文件夹:
workspaceAccess 和绑定模式彼此独立:
更改
workspaceAccess 不会将额外绑定从 ro 改为 rw,反之亦然。全局和每个代理的 docker.binds 会进行合并。对于每个代理的绑定,请保留 scope: "agent" 或 "session";scope: "shared" 会忽略所有每个代理的 Docker 覆盖设置,仅使用全局绑定。
绑定挂载是支持多文件夹边界的方式,因为 Docker 会通过挂载隔离来构建容器的文件系统视图,并且 ro/rw 模式会应用于沙箱中的每个进程。该边界涵盖 exec、文件系统工具、子进程和库,无需在每个 OpenClaw 代码路径中重复路径授权检查。当允许的 shell 或依赖项可以直接访问文件时,主机侧路径允许列表无法提供同样完整的边界。
选择启用的 dangerouslyAllowExternalBindSources 仅允许使用工作区根目录之外的源。它不会禁用 OpenClaw 对系统路径、凭据、Docker socket、符号链接父级或保留目标的阻止检查。请优先选择最小范围的文件夹;除非确实需要写入,否则使用 ro,并在更改挂载后重新创建沙箱:
其他绑定行为
agents.defaults.sandbox.docker.binds 用于配置全局挂载。格式同样是 主机:容器:模式(例如 "/home/user/source:/source:rw")。
agents.defaults.sandbox.browser.binds 仅将额外的主机目录挂载到 sandbox browser 容器中。设置该项时(包括 []),它会替换 browser 容器的 docker.binds;如果未设置,browser 容器会回退到 docker.binds。
镜像与设置
默认 Docker 镜像:openclaw-sandbox:bookworm-slim
源码检出 vs npm install
scripts/sandbox-setup.sh、scripts/sandbox-common-setup.sh 和 scripts/sandbox-browser-setup.sh 辅助脚本仅在从 源码检出 运行时可用。它们不包含在 npm 包中。如果你是通过 npm install -g openclaw 安装的,请改用下面展示的内联 docker build 命令。1
构建默认镜像
从源码检出:从 npm 安装(不需要源码检出):默认镜像不包含 Node。如果某个技能需要 Node(或其他运行时),请构建自定义镜像,或通过
sandbox.docker.setupCommand 安装(需要网络外连 + 可写根目录 + root 用户)。如果 openclaw-sandbox:bookworm-slim 缺失,OpenClaw 不会静默替换为普通的 debian:bookworm-slim。目标为默认镜像的沙箱运行会在你构建它之前直接失败,并给出构建说明,因为内置镜像包含用于沙箱写入/编辑辅助工具的 python3。2
可选:构建常用镜像
为获得一个带有常用工具(例如 从 npm 安装时,请先构建默认镜像(见上文),然后使用仓库中的
curl、jq、Node 24、pnpm、python3 和 git)的功能更完整的沙箱镜像:从源码检出:scripts/docker/sandbox/Dockerfile.common 在其基础上构建常用镜像。然后将 agents.defaults.sandbox.docker.image 设置为 openclaw-sandbox-common:bookworm-slim。3
可选:构建沙箱浏览器镜像
从源码检出:npm 包不包含浏览器 Dockerfile 或入口点。请使用源码检出构建此镜像。
agents.defaults.sandbox.docker.network 覆盖此设置。
软件包安装和证书存储变更属于镜像配置,而不是正常的沙箱轮次行为。默认设置会有意结合无网络、只读根文件系统和非 root 镜像用户,因此在轮次中进行软件包安装应该会失败。建议使用已经包含所需软件包和私有证书根的自定义镜像。如果 Node 进程需要私有 CA,还应配置 Node 的 CA 路径,例如通过自定义镜像或
sandbox.docker.env 设置 NODE_EXTRA_CA_CERTS。沙箱浏览器 Chromium 默认值
沙箱浏览器 Chromium 默认值
内置沙箱浏览器镜像会为容器化工作负载应用保守的 Chromium 启动标志:
--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-dev-shm-usage--disable-background-networking--disable-breakpad--disable-crash-reporter--no-zygote--metrics-recording-only--password-store=basic--use-mock-keychain- 启用
browser.headless时使用--headless=new。 --no-sandbox --disable-setuid-sandbox(在沙箱浏览器容器中始终启用)。- 默认使用
--disable-3d-apis、--disable-gpu、--disable-software-rasterizer;这些图形强化标志有助于在不支持 GPU 的容器中运行。若工作负载需要 WebGL 或其他 3D 功能,请设置OPENCLAW_BROWSER_DISABLE_GRAPHICS_FLAGS=0。 - 默认使用
--disable-extensions;对于依赖扩展的流程,请设置OPENCLAW_BROWSER_DISABLE_EXTENSIONS=0。 - 默认使用
--renderer-process-limit=2;由OPENCLAW_BROWSER_RENDERER_PROCESS_LIMIT=<N>控制,其中0保留 Chromium 的默认值。
browser.extraArgs 追加额外的启动标志。网络安全默认值
网络安全默认值
network: "host"被阻止。network: "container:<id>"默认被阻止(存在命名空间加入绕过风险)。- 紧急放行覆盖:
agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin: true。
scripts/docker/setup.sh 可以引导沙箱配置。设置 OPENCLAW_SANDBOX=1(或 true/yes/on)以启用该路径。可通过 OPENCLAW_DOCKER_SOCKET 覆盖套接字位置。完整的设置和环境变量参考:Docker。
setupCommand(一次性容器设置)
setupCommand 在沙箱容器创建后只运行一次(不是每次运行都执行)。它通过 sh -lc 在容器内执行。
路径:
- 全局:
agents.defaults.sandbox.docker.setupCommand - 单个代理:
agents.entries.*.sandbox.docker.setupCommand
常见问题
常见问题
- 默认的
docker.network是"none"(无外网访问),因此安装软件包会失败。 docker.network: "container:<id>"要求设置dangerouslyAllowContainerNamespaceJoin: true,且仅限在紧急情况下使用。readOnlyRoot: true会阻止写入;请设置readOnlyRoot: false,或构建自定义镜像。- 安装软件包时,
user必须为 root。Docker 可以省略user,或设置为user: "0:0";rootful Podman 必须设置user: "0:0",因为其默认设置会保留工作区所有权。Rootless Podman 会拒绝值为零的用户;请将软件包预先构建到镜像中,或使用 rootful Podman。 - 沙箱执行不会继承主机的
process.env。请使用agents.defaults.sandbox.docker.env(或自定义镜像)来配置技能 API 密钥。 agents.defaults.sandbox.docker.env中的值会作为显式容器环境变量传入。任何有权访问所选容器引擎的人员,都可以通过docker inspect或podman inspect等元数据命令查看这些值。如果无法接受此类元数据暴露,请使用自定义镜像、挂载的密钥文件或其他密钥传递方式。
工具策略与逃生阀
在沙箱规则之前,工具的允许/拒绝策略仍然适用。如果某个工具在全局或按代理层面被拒绝,沙箱化也不会把它恢复。tools.elevated 是一个显式逃生阀,会在沙箱外运行 exec(默认在 gateway,如果 exec 目标是 node,则在 node 中运行)。/exec 指令仅适用于授权发送者,并且按会话持久化;若要彻底禁用 exec,请使用工具策略拒绝(参见 沙箱、工具策略与提权)。
调试:
openclaw sandbox list会显示沙箱容器、状态、镜像匹配、运行时长、空闲时间,以及关联的会话/代理。openclaw sandbox explain [--session <key>] [--agent <id>]会检查有效的沙箱模式、宿主工作区、运行时工作目录、Docker 挂载、工具策略和修复配置键。其workspaceRoot字段仍然是配置的沙箱根目录;effectiveHostWorkspaceRoot显示当前活动工作区实际所在位置。openclaw sandbox recreate [--all | --session <key> | --agent <id>] [--browser] [--force]会移除容器/环境,以便它们在下次使用时按当前配置重新创建。- 参见 Sandbox vs Tool Policy vs Elevated 以了解“为什么会被阻止?”这一思维模型。
多代理覆盖
每个代理都可以覆盖沙箱和工具:agents.entries.*.sandbox 以及 agents.entries.*.tools(此外还有用于沙箱工具策略的 agents.entries.*.tools.sandbox.tools)。有关优先级,请参阅多代理沙箱和工具。
最小启用示例
相关内容
- 多智能体沙箱与工具 — 每个代理的覆盖与优先级
- OpenShell — 托管沙箱后端设置、工作区模式和配置参考
- 沙箱配置
- 沙箱 vs 工具策略 vs 提权 — 调试“为什么这被阻止了?”
- 安全性