31.3 多代理沙箱工具

生成模型:Claude Opus 4.6 (anthropic/claude-opus-4-6) Token 消耗:输入 ~310k tokens,输出 ~5k tokens(本节)


在多代理架构中,不同 Agent 的能力和权限应当有所区分。一个负责代码执行的 Agent 需要文件读写和 shell 工具,但不应该有权限操控浏览器或发送消息到通道。OpenClaw 通过沙箱工具策略(Sandbox Tool Policy)实现了这种精细的工具级隔离。

衍生解释:最小权限原则 最小权限原则(Principle of Least Privilege)是计算机安全的基本原则之一。它要求每个模块只拥有完成其任务所必需的最小权限集合。在 AI Agent 场景中,这意味着子代理不应该获得超出其任务所需的工具访问权限——一个只需要读文件的 Agent 不应该拥有执行 shell 命令的能力。

31.3.1 跨代理工具隔离

默认工具策略

sandbox/constants.ts 定义了沙箱环境中的工具白名单和黑名单:

// src/agents/sandbox/constants.ts

export const DEFAULT_TOOL_ALLOW = [
  "exec",              // Shell 命令执行
  "process",           // 进程管理
  "read",              // 文件读取
  "write",             // 文件写入
  "edit",              // 文件编辑
  "apply_patch",       // 补丁应用
  "image",             // 图像处理
  "sessions_list",     // 列出会话
  "sessions_history",  // 查看会话历史
  "sessions_send",     // 向会话发送消息
  "sessions_spawn",    // 派生子代理
  "session_status",    // 查看会话状态
] as const;

export const DEFAULT_TOOL_DENY = [
  "browser",           // 浏览器自动化
  "canvas",            // Canvas/A2UI
  "nodes",             // 设备节点控制
  "cron",              // 定时任务
  "gateway",           // Gateway 管理
  ...CHANNEL_IDS,      // 所有消息通道(telegram, discord, slack...)
] as const;

白名单设计体现了"执行能力开放,通信能力封闭"的安全哲学:

类别
工具
策略
理由

代码执行

exec, process

允许

沙箱已提供进程级隔离

文件操作

read, write, edit, apply_patch

允许

沙箱限制了文件系统范围

多模态

image

允许

图像处理是常见需求

会话管理

sessions_*

允许

子代理需要与其他代理协作

浏览器

browser

禁止

浏览器有独立的沙箱方案

UI 渲染

canvas

禁止

子代理不应直接操作 UI

设备控制

nodes

禁止

设备操作需要显式授权

调度

cron

禁止

子代理是临时的,不应创建持久任务

消息通道

telegram, discord...

禁止

防止子代理擅自发送消息

注意 CHANNEL_IDS 是从通道注册表动态展开的,这意味着每个已注册的消息通道都会自动被加入黑名单——即使未来添加新通道也不需要手动更新。

工具策略解析

tool-policy.ts 实现了三级优先级的策略解析:

策略解析的优先级链:

返回的 SandboxToolPolicyResolved 中包含 sources 字段,记录了每条策略的来源("agent" / "global" / "default"),便于调试和审计。

image 工具享有特殊待遇:除非在黑名单中被显式禁止,否则即使白名单中未列出,也会被自动添加。这是因为多模态交互(如截图分析、图像生成)已经成为 AI Agent 的基础能力。

工具名称匹配

工具名称的匹配支持精确匹配和通配符模式:

匹配算法遵循黑名单优先原则:

  1. 如果工具名命中黑名单 → 拒绝(无论白名单如何)

  2. 白名单为空 → 允许所有未被黑名单拒绝的工具

  3. 白名单非空 → 必须命中白名单才允许

通配符 * 被转换为正则表达式中的 .*。例如,"sessions_*" 会匹配 sessions_listsessions_spawn 等所有以 sessions_ 开头的工具。

31.3.2 沙箱代理配置

沙箱模式与范围

每个 Agent 的沙箱配置通过 resolveSandboxConfigForAgent() 解析:

沙箱配置的关键维度:

维度
可选值
说明

mode

"off" / "auto" / "always"

沙箱启用模式

scope

"agent" / "session" / "shared"

容器共享粒度

workspaceAccess

"none" / "readonly" / "readwrite"

宿主工作空间挂载权限

scope 决定了 Docker 容器的生命周期:

  • "agent":每个 Agent 共享一个容器。容器随 Agent 的首次使用创建,空闲后回收。

  • "session":每个会话创建独立容器。最高隔离度,但资源消耗最大。

  • "shared":所有 Agent 共享一个全局容器。资源消耗最低,但无隔离。

Docker 容器配置

resolveSandboxDockerConfig() 解析 Docker 容器的安全参数:

默认的安全配置非常严格:

参数
默认值
安全含义

readOnlyRoot

true

容器根文件系统只读,防止恶意修改系统文件

network

"none"

无网络访问,防止数据泄露

capDrop

["ALL"]

丢弃所有 Linux 内核能力,以最低权限运行

tmpfs

/tmp, /var/tmp, /run

只有临时目录可写,重启后自动清除

衍生解释:Linux Capabilities Linux Capabilities 是将传统的 root 超级权限拆分成多个细粒度权限的机制。例如,CAP_NET_ADMIN 允许配置网络,CAP_SYS_PTRACE 允许调试进程。capDrop: ["ALL"] 表示丢弃所有这些能力,容器内的进程即使以 root 身份运行,也几乎没有特权操作的能力。

浏览器沙箱

对于需要浏览器能力的 Agent,OpenClaw 提供了独立的浏览器沙箱:

浏览器沙箱使用专门的 Docker 镜像(openclaw-sandbox-browser:bookworm-slim),内置 Chromium 浏览器和 VNC 服务器。Agent 通过 CDP(Chrome DevTools Protocol)远程控制容器内的浏览器,而管理员可以通过 noVNC 的 Web 界面实时观察 Agent 的浏览器操作。

容器生命周期管理

沙箱容器的清理通过 resolveSandboxPruneConfig() 配置:

参数
默认值
含义

idleHours

24

容器空闲超过 24 小时后自动停止

maxAgeDays

7

容器存活超过 7 天后强制清除

这两个参数共同确保沙箱容器不会无限占用系统资源。

沙箱状态目录

沙箱的运行状态持久化在 ~/.openclaw/sandbox/ 目录下:

containers.json 记录所有活跃的沙箱容器信息(容器 ID、创建时间、关联的 Agent 等),browsers.json 记录浏览器沙箱的对应关系。

完整的配置示例

以下展示一个多代理沙箱配置的完整示例:

在这个配置中:

  • main Agent 直接在宿主运行,拥有完整权限

  • coder Agent 在 Docker 沙箱中运行,每个会话一个容器,有网络访问和 2GB 内存限制,但不能派生子代理

  • browser-agent 在浏览器沙箱中运行,只能使用浏览器和文件读取工具,不能执行命令或写入文件

这种配置实现了纵深防御——即使 AI Agent 被恶意指令诱导,它能造成的损害也被严格限制在其沙箱边界内。


本节小结

  1. 默认工具策略 遵循"执行能力开放、通信能力封闭"原则:允许文件和进程操作,禁止浏览器、通道、定时任务等。

  2. 三级优先级 策略解析:Agent 级 > 全局 > 默认常量,每级都记录来源便于审计。

  3. 黑名单优先 的匹配算法:deny 优先于 allow,支持 * 通配符匹配。

  4. image 工具特殊保护:除非显式禁止,否则自动加入白名单,保障多模态基础能力。

  5. 沙箱容器安全默认值 极为严格:只读根文件系统、无网络、丢弃所有 Linux 能力。

  6. 三种容器范围agent(Agent 共享)、session(会话隔离)、shared(全局共享),平衡隔离度与资源消耗。

  7. 浏览器沙箱 使用独立镜像,通过 CDP 控制 + VNC 观察,实现浏览器操作的安全隔离。

  8. 容器生命周期管理:24 小时空闲停止 + 7 天强制清除,防止资源泄漏。

Last updated