沙箱机制
OpenClaw 可以在 Docker 容器内运行工具,以减少潜在危险的影响范围。 这是可选的,由配置控制(agents.defaults.sandbox 或
agents.list[].sandbox)。如果关闭沙箱,工具则在宿主机上运行。
网关保持在宿主机上;启用时,工具执行在隔离的沙箱中运行。
这不是一个完美的安全边界,但当模型执行不当时,能显著限制文件系统和进程访问。
什么会被沙箱化
- 工具执行(
exec、read、write、edit、apply_patch、process等)。 - 可选的沙箱浏览器(
agents.defaults.sandbox.browser)。- 默认情况下,当浏览器工具需要时,沙箱浏览器会自动启动(确保 CDP 可访问)。
可通过
agents.defaults.sandbox.browser.autoStart和agents.defaults.sandbox.browser.autoStartTimeoutMs配置。 - 默认情况下,沙箱浏览器容器会使用专用 Docker 网络(
openclaw-sandbox-browser),而非全局bridge网络。 可通过agents.defaults.sandbox.browser.network配置。 - 可选的
agents.defaults.sandbox.browser.cdpSourceRange使用 CIDR 白名单限制容器端的 CDP 入站流量(例如172.21.0.1/32)。 - noVNC 观察者访问默认启用密码保护;OpenClaw 会发出一个短时效令牌 URL,提供本地引导页面,并通过 URL 片段密码(非查询/头部日志)打开 noVNC。
agents.defaults.sandbox.browser.allowHostControl允许沙箱会话显式控制宿主机浏览器。- 可选白名单控制
target: "custom":allowedControlUrls、allowedControlHosts、allowedControlPorts。
- 默认情况下,当浏览器工具需要时,沙箱浏览器会自动启动(确保 CDP 可访问)。
可通过
- 网关进程本身。
- 任何明确允许在宿主机上运行的工具(例如
tools.elevated)。- Elevated 执行在宿主机上,绕过沙箱机制。
- 如果关闭沙箱,
tools.elevated不改变执行位置(已在宿主机上)。详情见 Elevated 模式。
模式
agents.defaults.sandbox.mode 控制何时启用沙箱:
"off":不启用沙箱。"non-main":仅对非主会话启用沙箱(如果您希望普通聊天运行在宿主机上,则默认选项)。"all":所有会话均运行于沙箱中。 注:"non-main"基于session.mainKey(默认"main")判断,而非 agent id。 群组/频道会话有自己的键,因此视为非主,会被沙箱限制。
范围
agents.defaults.sandbox.scope 控制创建多少容器:
"session"(默认):每个会话一个容器。"agent":每个 agent 一个容器。"shared":所有沙箱会话共用一个容器。
工作区访问权限
agents.defaults.sandbox.workspaceAccess 控制沙箱能看到什么:
"none"(默认):工具只能看到位于~/.openclaw/sandboxes下的沙箱工作区。"ro":以只读模式挂载 agent 工作区到/agent(禁用write/edit/apply_patch)。"rw":以读写模式挂载 agent 工作区到/workspace。
media/inbound/*)。
技能说明:read 工具的路径根定在沙箱下。使用 workspaceAccess: "none" 时,OpenClaw 会将符合条件的技能镜像到沙箱工作区(.../skills)以便读取;使用 "rw" 时,可从 /workspace/skills 读取工作区技能。
自定义绑定挂载
agents.defaults.sandbox.docker.binds 可将额外宿主目录挂载到容器中。
格式:host:container:mode(例如 "/home/user/source:/source:rw")。
全局和每个 agent 的绑定是合并的(而非替换)。在 scope: "shared" 模式下,忽略每个 agent 的绑定。
agents.defaults.sandbox.browser.binds 仅将额外宿主目录挂载到沙箱浏览器容器。
- 设置后(包括设置为空数组
[]),会替代浏览器容器的agents.defaults.sandbox.docker.binds。 - 未设置时,浏览器容器回退使用
agents.defaults.sandbox.docker.binds(兼容旧配置)。
- 绑定绕过沙箱文件系统限制:它们会暴露宿主机路径及您设置的访问模式(
:ro或:rw)。 - OpenClaw 会阻止危险的绑定来源(例如:
docker.sock、/etc、/proc、/sys、/dev,及任何父挂载暴露这些路径的绑定)。 - 敏感挂载(秘密、SSH 密钥、服务凭证)应保持
:ro,除非绝对必要。 - 如果只需工作区读取权限,请结合使用
workspaceAccess: "ro";绑定模式独立控制。 - 详见 沙箱 vs 工具策略 vs Elevated 执行,了解绑定如何与工具策略和 Elevated 执行交互。
镜像与设置
默认镜像:openclaw-sandbox:bookworm-slim
构建一次:
sandbox.docker.setupCommand 安装(需网络访问、可写根目录及 root 用户权限)。
如果想要一个包含常用工具的更全面沙箱镜像(例如 curl、jq、nodejs、python3、git),请构建:
agents.defaults.sandbox.docker.image 设置为
openclaw-sandbox-common:bookworm-slim。
沙箱浏览器镜像:
agents.defaults.sandbox.docker.network 覆盖。
捆绑的沙箱浏览器镜像还应用了针对容器化工作负载的保守 Chromium 启动默认参数。目前容器默认配置包括:
--remote-debugging-address=127.0.0.1--remote-debugging-port=<由 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- 启用
noSandbox时,额外加上--no-sandbox和--disable-setuid-sandbox。 - 三个图形防护参数(
--disable-3d-apis、--disable-software-rasterizer、--disable-gpu)是可选的,适用于无 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。
docker-setup.sh 可引导沙箱配置。
设置环境变量 OPENCLAW_SANDBOX=1(或 true/yes/on)以启用此路径。
可通过 OPENCLAW_DOCKER_SOCKET 覆盖 socket 位置。
完整设置和环境变量参考:Docker。
setupCommand(容器首次初始化命令)
setupCommand 在沙箱容器创建后只运行一次(不是每次运行都执行)。
命令在容器内通过 sh -lc 执行。
配置路径:
- 全局:
agents.defaults.sandbox.docker.setupCommand - 每个 agent:
agents.list[].sandbox.docker.setupCommand
- 默认
docker.network是"none"(无出网),导致包安装失败。 docker.network: "container:<id>"需要设置dangerouslyAllowContainerNamespaceJoin: true,且仅作破防使用。readOnlyRoot: true阻止写入;应设置readOnlyRoot: false或自行构建镜像。- 运行用户必须是 root,才能安装软件包(省略
user或设置为user: "0:0")。 - 沙箱执行不会继承宿主机
process.env,请通过agents.defaults.sandbox.docker.env配置环境变量(或自定义镜像)来传递技能 API Key。
工具策略及逃生通道
工具允许/拒绝策略仍在沙箱规则之前执行。如果工具被全局或按 agent 拒绝,启用沙箱也无效。tools.elevated 是一个显式逃生通道,允许在宿主机上运行 exec。
/exec 指令仅对授权发送者生效,且会话期间持续有效;要彻底禁用 exec,请使用工具策略拒绝(详见 沙箱 vs 工具策略 vs Elevated)。
调试方法:
- 使用
openclaw sandbox explain查看生效的沙箱模式、工具策略和修复建议配置键。 - 参见 沙箱 vs 工具策略 vs Elevated 理解“为何被阻止”的思维模型。 请保持策略严格。
多 agent 覆盖设置
每个 agent 可覆盖沙箱及工具设置:agents.list[].sandbox 和 agents.list[].tools(包括 agents.list[].tools.sandbox.tools 用于沙箱工具策略)。
详情见 多 Agent 沙箱与工具 的优先级说明。