openclaw/docs/zh-CN/gateway/sandboxing.md

197 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
read_when: 你想深入了解沙箱机制,或需要调整 agents.defaults.sandbox 配置。
status: active
summary: OpenClaw 沙箱的工作原理:模式、作用域、工作区访问和镜像
title: 沙箱
x-i18n:
generated_at: "2026-02-01T20:38:47Z"
model: claude-opus-4-5
provider: pi
source_hash: 184fc53001fc6b2847bbb1963cc9c54475d62f74555a581a262a448a0333a209
source_path: gateway/sandboxing.md
workflow: 14
---
# 沙箱
OpenClaw 可以**在 Docker 容器内运行工具**以缩小影响范围。
此功能是**可选的**,通过配置控制(`agents.defaults.sandbox` 或
`agents.list[].sandbox`)。如果沙箱未启用,工具将在宿主机上运行。
Gateway网关始终在宿主机上运行启用沙箱后工具执行将在隔离的沙箱中进行。
这并非完美的安全边界,但在模型执行了错误操作时,能有效限制文件系统和进程访问。
## 哪些内容会被沙箱隔离
- 工具执行(`exec`、`read`、`write`、`edit`、`apply_patch`、`process` 等)。
- 可选的沙箱浏览器(`agents.defaults.sandbox.browser`)。
- 默认情况下,沙箱浏览器会在浏览器工具需要时自动启动(确保 CDP 可达)。
通过 `agents.defaults.sandbox.browser.autoStart``agents.defaults.sandbox.browser.autoStartTimeoutMs` 进行配置。
- `agents.defaults.sandbox.browser.allowHostControl` 允许沙箱会话显式访问宿主机浏览器。
- 可选的允许列表控制 `target: "custom"``allowedControlUrls`、`allowedControlHosts`、`allowedControlPorts`。
未被沙箱隔离的内容:
- Gateway网关进程本身。
- 任何被显式允许在宿主机上运行的工具(例如 `tools.elevated`)。
- **提权 exec 在宿主机上运行,会绕过沙箱。**
- 如果沙箱未启用,`tools.elevated` 不会改变执行方式(本身已在宿主机上)。参见[提权模式](/tools/elevated)。
## 模式
`agents.defaults.sandbox.mode` 控制**何时**使用沙箱:
- `"off"`:不使用沙箱。
- `"non-main"`:仅对**非主**会话启用沙箱(如果你希望普通聊天在宿主机上运行,这是默认值)。
- `"all"`:所有会话都在沙箱中运行。
注意:`"non-main"` 基于 `session.mainKey`(默认为 `"main"`),而非智能体 ID。
群组/渠道会话使用各自的键,因此它们被视为非主会话,会被沙箱隔离。
## 作用域
`agents.defaults.sandbox.scope` 控制**创建多少个容器**
- `"session"`(默认):每个会话一个容器。
- `"agent"`:每个智能体一个容器。
- `"shared"`:所有沙箱会话共享一个容器。
## 工作区访问
`agents.defaults.sandbox.workspaceAccess` 控制**沙箱能看到什么**
- `"none"`(默认):工具在 `~/.openclaw/sandboxes` 下的沙箱工作区中运行。
- `"ro"`:以只读方式将智能体工作区挂载到 `/agent`(禁用 `write`/`edit`/`apply_patch`)。
- `"rw"`:以读写方式将智能体工作区挂载到 `/workspace`
入站媒体会被复制到活动沙箱工作区中(`media/inbound/*`)。
Skills 说明:`read` 工具以沙箱为根目录。当 `workspaceAccess: "none"` 时,
OpenClaw 会将符合条件的 Skills 镜像到沙箱工作区(`.../skills`)中以便读取。当设为 `"rw"` 时,工作区 Skills 可从
`/workspace/skills` 读取。
## 自定义绑定挂载
`agents.defaults.sandbox.docker.binds` 将额外的宿主机目录挂载到容器中。
格式:`host:container:mode`(例如 `"/home/user/source:/source:rw"`)。
全局和每个智能体的绑定挂载会被**合并**(而非替换)。在 `scope: "shared"` 下,每个智能体的绑定挂载会被忽略。
示例(只读源码 + Docker 套接字):
```json5
{
agents: {
defaults: {
sandbox: {
docker: {
binds: ["/home/user/source:/source:ro", "/var/run/docker.sock:/var/run/docker.sock"],
},
},
},
list: [
{
id: "build",
sandbox: {
docker: {
binds: ["/mnt/cache:/cache:rw"],
},
},
},
],
},
}
```
安全注意事项:
- 绑定挂载会绕过沙箱文件系统:它们以你设置的模式(`:ro` 或 `:rw`)暴露宿主机路径。
- 敏感挂载(例如 `docker.sock`、密钥、SSH 密钥)应使用 `:ro`,除非确实需要写入。
- 如果你只需要对工作区的读取权限,可与 `workspaceAccess: "ro"` 配合使用;绑定模式保持独立。
- 参见[沙箱 vs 工具策略 vs 提权](/gateway/sandbox-vs-tool-policy-vs-elevated)了解绑定挂载如何与工具策略和提权 exec 交互。
## 镜像 + 设置
默认镜像:`openclaw-sandbox:bookworm-slim`
构建一次即可:
```bash
scripts/sandbox-setup.sh
```
注意:默认镜像**不包含** Node。如果 Skills 需要 Node
其他运行时),请构建自定义镜像或通过
`sandbox.docker.setupCommand` 安装(需要网络出口 + 可写根文件系统 +
root 用户)。
沙箱浏览器镜像:
```bash
scripts/sandbox-browser-setup.sh
```
默认情况下,沙箱容器以**无网络**方式运行。
可通过 `agents.defaults.sandbox.docker.network` 覆盖。
Docker 安装和容器化 Gateway网关的说明在这里
[Docker](/install/docker)
## setupCommand一次性容器设置
`setupCommand` 在沙箱容器创建后**仅运行一次**(不会每次运行时都执行)。
它通过 `sh -lc` 在容器内执行。
路径:
- 全局:`agents.defaults.sandbox.docker.setupCommand`
- 每个智能体:`agents.list[].sandbox.docker.setupCommand`
常见问题:
- 默认 `docker.network``"none"`(无出口),因此包安装会失败。
- `readOnlyRoot: true` 会阻止写入;请设置 `readOnlyRoot: false` 或构建自定义镜像。
- 包安装需要 root 用户(省略 `user` 或设置 `user: "0:0"`)。
- 沙箱 exec **不会**继承宿主机的 `process.env`。请使用
`agents.defaults.sandbox.docker.env`(或自定义镜像)来设置 Skills API 密钥。
## 工具策略 + 逃逸机制
工具的允许/拒绝策略仍在沙箱规则之前生效。如果某个工具在全局或智能体级别被拒绝,沙箱不会将其恢复。
`tools.elevated` 是一个显式的逃逸机制,在宿主机上运行 `exec`
`/exec` 指令仅对授权发送者生效,且在每个会话中持续有效;要彻底禁用
`exec`,请使用工具策略拒绝(参见[沙箱 vs 工具策略 vs 提权](/gateway/sandbox-vs-tool-policy-vs-elevated))。
调试:
- 使用 `openclaw sandbox explain` 检查当前生效的沙箱模式、工具策略和修复配置项。
- 参见[沙箱 vs 工具策略 vs 提权](/gateway/sandbox-vs-tool-policy-vs-elevated)了解"为什么被阻止了?"的思维模型。
保持锁定状态。
## 多智能体覆盖
每个智能体可以覆盖沙箱和工具配置:
`agents.list[].sandbox``agents.list[].tools`(以及 `agents.list[].tools.sandbox.tools` 用于沙箱工具策略)。
参见[多智能体沙箱与工具](/multi-agent-sandbox-tools)了解优先级。
## 最小启用示例
```json5
{
agents: {
defaults: {
sandbox: {
mode: "non-main",
scope: "session",
workspaceAccess: "none",
},
},
},
}
```
## 相关文档
- [沙箱配置](/gateway/configuration#agentsdefaults-sandbox)
- [多智能体沙箱与工具](/multi-agent-sandbox-tools)
- [安全](/gateway/security)