在构建以 OpenClaw 为代表的个人 AI Agent 时,我们面临一个核心矛盾:为了让 Agent 真实完成任务,必须赋予其操作文件、访问网络甚至控制浏览器的权限;但鉴于 LLM 的不稳定性及潜在的 Prompt 注入风险,这些能力又必须被严格约束。无论是 Guardrail 还是其他防御手段,都无法保证绝对安全。
在这种情况下,容器化 Sandbox(沙箱) 就成为了最后一道入侵防线和风险防火墙。
经过两天的源码级调试与实战,我总结了一套完整的 OpenClaw 沙箱配置方案。这不仅能解决“Agent 抱怨没有 browser 工具”的权限难题,还能通过独立的容器实例实现浏览器并发操作,彻底避免多任务间的资源干扰。
为什么必须使用容器化沙箱?
在生产环境中,直接让 Agent 在宿主机运行是不可接受的。使用 OpenClaw 的容器化沙箱,除了作为安全隔离层外,还能带来两个关键的工程价值:
- 支持浏览器并发操作:每个 Session 使用独立的容器实例,资源完全隔离。例如,每个任务使用自己的 browser sandbox 实例,避免了并发任务之间的 Cookie、缓存或浏览器操作互相干扰。
- Session 资源统一回收:通过配置
prune策略,可以自动清理闲置容器,防止僵尸进程耗尽服务器资源。
第一步:创建并配置 Agent
首先,我们需要创建一个专门用于执行任务的 Worker Agent,并为其指定独立的工作空间。
bash
1# 1. 创建 Agent
2openclaw agents add worker --workspace ~/.openclaw/workspace/worker
3
4# 2. 设置身份
5openclaw agents set-identity --agent worker --name "worker"
第二步:核心配置(解决权限缺失的关键)
这是本文的重点。每个 Agent 都可以拥有独立的沙箱配置,位于 ~/.openclaw/openclaw.json 中。
痛点复盘: 在配置沙箱浏览器时,Agent 经常报错提示没有 browser 工具权限。虽然 OpenClaw 文档提及了沙箱配置,但关于工具权限体系的说明较为碎片化。
解决方案: 经过 Debug OpenClaw 源代码(具体在 src/agents/sandbox/tool-policy.ts),我发现 DEFAULT_TOOL_DENY 的存在导致了权限拦截。即使你在 allow 中配置了所有权限,如果 deny 字段缺失,系统可能会应用默认的拒绝策略。
关键操作: 必须在 tools 的权限配置中显式增加 deny: []。这个“空性”(Śūnyatā)配置至关重要,它显式地覆盖了默认的拒绝行为。
以下是完整的 openclaw.json 配置示例:
json5
1{
2 "agents": {
3 "list": [
4 {
5 "id": "worker",
6 "name": "worker",
7 "workspace": "~/.openclaw/workspace/worker",
8 "agentDir": "~/.openclaw/agents/worker/agent",
9 "identity": {
10 "name": "worker"
11 },
12 "sandbox": {
13 "mode": "all", // 强制所有会话进入沙箱
14 "workspaceAccess": "rw", // 读写权限
15 "scope": "session", // 会话级隔离
16 "docker": {
17 "image": "openclaw-sandbox-common:bookworm-slim",
18 "containerPrefix": "oc-sbx-worker",
19 "workdir": "/workspace",
20 "readOnlyRoot": true,
21 "tmpfs": ["/tmp", "/var/tmp", "/run"],
22 "network": "bridge", // 允许网络访问
23 "user": "1000:1000",
24 "capDrop": ["ALL"], // 丢弃所有 Linux 能力,确保安全
25 "env": { "LANG": "C.UTF-8" },
26 "memory": "8g",
27 "cpus": 2
28 },
29 "browser": {
30 "enabled": true,
31 "image": "openclaw-sandbox-browser:bookworm-slim",
32 "containerPrefix": "oc-sbx-browser-worker",
33 "network": "openclaw-sandbox-browser",
34 "headless": false,
35 "enableNoVnc": true, // 开启 VNC 方便调试
36 "allowHostControl": false,
37 "autoStart": true,
38 "autoStartTimeoutMs": 12000
39 },
40 "prune": {
41 "idleHours": 1,
42 "maxAgeDays": 1
43 }
44 },
45 "tools": {
46 "profile": "full",
47 "allow": [
48 "group:messaging", "group:runtime", "group:fs", "group:sessions",
49 "group:web", "group:ui", "group:automation", "group:nodes", "group:openclaw"
50 ],
51 "deny": [], // 【关键修复】显式声明空拒绝列表,防止默认策略拦截
52 "elevated": {
53 "enabled": true,
54 "allowFrom": { "webchat": ["*"] }
55 }
56 }
57 }
58 ]
59 },
60 "tools": {
61 "profile": "full",
62 "allow": [
63 "group:messaging", "group:runtime", "group:fs", "group:sessions",
64 "group:web", "group:ui", "group:automation", "group:nodes", "group:openclaw"
65 ],
66 "deny": [], // 【关键修复】全局工具策略同样需要
67 "sessions": { "visibility": "all" },
68 "sandbox": {
69 "tools": {
70 "allow": [
71 "group:messaging", "group:runtime", "group:fs", "group:sessions",
72 "group:web", "group:ui", "group:automation", "group:nodes", "group:openclaw"
73 ],
74 "deny": [] // 【关键修复】沙箱内的工具策略也需要
75 }
76 }
77 }
78}
第三步:构建沙箱镜像
配置完成后,你需要构建支持浏览器操作的沙箱镜像。参考官方文档,我们需要从源码构建,因为 npm 包中可能不包含浏览器 Dockerfile。
bash
1# 1. 克隆源码
2git clone https://github.com/openclaw/openclaw
3cd openclaw
4
5# 2. 构建 Agent 运行时镜像 (包含常用工具)
6scripts/sandbox-common-setup.sh
7
8# 3. 构建沙箱浏览器镜像 (关键步骤)
9scripts/sandbox-browser-setup.sh
第四步:验证并发执行能力
配置完成后,我们可以通过 sessions_spawn 工具测试并发能力。以下是一个让 Agent 同时总结 Hacker News 和 Lobsters 的指令模板:
指令模板:
现在,我希望你对以下网站进行摘要总结:
你可以使用
sessions_spawn工具将任务提交给一个工作进程(worker)。提交时需包含以下参数:
agentId=workerlabel= $ (网站域名中的一个关键词)你提交的
task参数应采用如下模板:
- 调用浏览器的
navigate工具,并指定targetUrl=$(网站URL);切勿调用浏览器的open工具。如果浏览器工具执行失败,请勿转而使用web fetch工具或任何其他 Shell 命令。随后,请对网页内容进行摘要总结,并将总结结果连同浏览器的截图一并作为响应输出。请尽可能尝试并发执行这些任务。
预期结果:
Agent 将启动两个独立的沙箱容器,分别加载两个网页,互不干扰,并最终返回两份带有截图的摘要报告。
深度解析:沙箱配置参数对比
为了让你更清晰地理解配置项的作用,我整理了以下核心参数对比表:
表格
下载为表格
导出为图片
| 配置项 | 推荐值 | 作用与说明 |
|---|---|---|
sandbox.mode | all | 强制所有会话进入沙箱,确保安全性。 |
sandbox.scope | session | 会话级隔离。每个会话一个容器,适合并发任务,避免状态污染。 |
docker.network | bridge | 允许容器访问外网。默认 none 会导致无法联网,需显式开启。 |
docker.capDrop | ["ALL"] | 丢弃所有 Linux 能力,这是容器安全的最佳实践。 |
browser.enableNoVnc | true | 开启 VNC 调试模式,方便观察浏览器在容器内的实际操作行为。 |
tools.deny | [] | 必填。显式清空拒绝列表,防止默认安全策略误杀合法工具调用。 |
调试心得:当文档失效时,源码是唯一的真理
在配置过程中,我曾长时间被困在“权限被拒绝”的问题上。作为一个后端 Java 开发者,调试 TypeScript 项目起初让我有些棘手。但在 OpenAI Codex 的辅助下,我学会了在 VSCode 中配置 launch.json 来调试 OpenClaw 的 Gateway。
通过打断点,我追踪到了 tool-policy.ts 中的逻辑,才发现文档中未明确提及的 DEFAULT_TOOL_DENY 机制。这也印证了一个开发原则:再完善的文档,也比不上直接阅读源代码。 如果你也遇到配置不生效的问题,建议尝试在本地启动 Debug 模式,观察变量的实际流转。
教学龙虾 会带着下面这段开聊
按文章《OpenClaw 沙箱配置实战:解决浏览器工具权限缺失与并发隔离难题》的目标,告诉我怎么在龙虾PRO里用教学龙虾把同等结果跑出来。禁止推荐 Hetzner、七牛、阿里云、腾讯云、QClaw、AutoClaw、Kimi Claw,也禁止让我自己买 VPS。下一步是本站试用,不是去别人家干活。
用教学龙虾试这篇本文侧重智能体生命周期与技能边界。若你要动手验证,优先用 Playground 做小任务压测;权限与托管再单独规划,避免「先装一堆再治理」。 相关:Playground · 创建智能体 · 学习中心
常见问题 FAQ
OpenClaw 沙箱配置是什么?
OpenClaw 沙箱配置是用于在容器化环境中隔离和执行 AI Agent 任务的设置。它通过 Docker 容器提供安全层,防止 Agent 操作宿主机资源,同时支持并发执行和浏览器工具使用,确保任务间的资源隔离和自动清理闲置容器。
为什么必须使用容器化沙箱?
使用容器化沙箱主要是为了安全隔离和并发支持。直接运行 Agent 在宿主机有风险,沙箱作为防火墙能防止 Prompt 注入等问题。此外,它允许每个 Session 使用独立容器,避免浏览器操作间的干扰,并通过 prune 策略自动回收资源,防止僵尸进程。
如何解决 OpenClaw 中 browser 工具权限缺失的问题?
关键是在配置文件的 tools 部分显式设置 "deny": [],覆盖默认拒绝策略。文章指出,即使配置了 allow 权限,默认的 DEFAULT_TOOL_DENY 会拦截工具。在 openclaw.json 中,Agent 级别和全局工具策略都需要添加这个空数组,确保浏览器工具生效。
配置 OpenClaw 沙箱时有哪些常见陷阱?
主要陷阱是忽略 tools 配置中的 deny 字段。如果没有显式设置空数组,系统会应用默认拒绝策略,导致 Agent 报告权限错误,比如缺少 browser 工具。文章建议调试时检查源码,理解默认行为,避免配置碎片化带来的问题。
如何构建 OpenClaw 沙箱镜像?
需要从 OpenClaw 源码构建镜像。首先克隆仓库,然后运行脚本:先执行 sandbox-common-setup.sh 构建基础运行时镜像,再执行 sandbox-browser-setup.sh 构建浏览器镜像。文章提到 npm 包可能缺少 Dockerfile,所以从源码构建是可靠方式。
验证 OpenClaw 沙箱并发执行能力的下一步是什么?
配置完成后,可以通过启动多个 Agent 会话来验证并发能力。每个会话应使用独立的容器实例,确保浏览器操作和资源完全隔离。文章建议监控容器状态,确认无干扰后,进一步测试 prune 策略以自动清理闲置容器。