## 沙箱是什么
沙箱(Sandbox)是 OpenClaw 的安全隔离机制。它使用 Docker 容器为智能体创建一个独立的执行环境——智能体在容器内运行命令、读写文件,即使出了问题也不会影响宿主机。
你可以把沙箱想象成一个"安全房间":
- 智能体在房间里可以自由操作
- 房间外的系统文件、网络资源受到保护
- 即使智能体执行了危险命令,影响范围也被限制在容器内
- 容器销毁后,所有改动都会消失(除非配置了持久化)
## 沙箱 vs 工具策略 vs 提权
OpenClaw 有三种安全控制机制,它们解决不同层面的问题:
| 机制 | 控制什么 | 类比 |
|------|----------|------|
| 沙箱(Sandbox) | 执行环境在哪里运行 | 把人关在安全屋里 |
| 工具策略(Tools Allow/Deny) | 能使用哪些工具 | 决定给不给人工具 |
| 提权(Elevated) | 工具的权限级别 | 给的工具是普通版还是高级版 |
### 沙箱(Sandbox)
沙箱限制的是**执行环境**。开启沙箱后,智能体的 `exec`(命令执行)和文件操作都在 Docker 容器内进行,与宿主机隔离。
```json
{
"sandbox": {
"mode": "all"
}
}
```
效果:
- ✅ 智能体可以执行命令,但在容器内
- ✅ 智能体可以读写文件,但在容器的文件系统内
- ✅ 宿主机的文件和系统不受影响
### 工具策略(Tools Allow/Deny)
工具策略限制的是**可用工具**。通过 `allow` 和 `deny` 列表控制智能体能使用哪些工具。
```json
{
"tools": {
"allow": ["read", "write", "web_search"],
"deny": ["exec", "browser"]
}
}
```
效果:
- ✅ 智能体可以读写文件、搜索网页
- ❌ 智能体不能执行命令、不能使用浏览器
### 提权(Elevated)
提权控制的是**工具的权限级别**。某些工具有普通模式和提权模式,提权后可以执行更多操作。
```json
{
"tools": {
"elevated": true
}
}
```
效果:
- 普通模式:`exec` 工具只能执行白名单内的命令
- 提权模式:`exec` 工具可以执行任意命令
### 三者如何配合
最安全的配置是三者组合使用:
```json
{
"sandbox": {
"mode": "all"
},
"tools": {
"allow": ["exec", "read", "write"],
"deny": ["browser"]
}
}
```
这个配置的含义:
1. 智能体可以使用 exec、read、write 工具(工具策略)
2. 但所有操作都在 Docker 容器内执行(沙箱)
3. 不能使用浏览器工具(工具策略)
## 启用沙箱配置
### 前提条件
沙箱依赖 Docker,确保你的系统已安装 Docker:
```bash
# 检查 Docker 是否安装
docker --version
# 检查 Docker 是否在运行
docker info
```
如果未安装 Docker:
```bash
# Ubuntu/Debian
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# macOS
brew install --cask docker
```
### sandbox.mode 配置
编辑 `~/.openclaw/openclaw.json`,添加沙箱配置:
```json
{
"sandbox": {
"mode": "off"
}
}
```
`mode` 有三个可选值:
| 模式 | 说明 | 适用场景 |
|------|------|----------|
| `off` | 关闭沙箱(默认) | 个人使用,信任所有技能 |
| `all` | 所有操作都在沙箱内 | 生产环境,最高安全级别 |
| `untrusted` | 仅不受信任的技能在沙箱内 | 平衡安全和便利 |
### 模式详解
#### off — 关闭沙箱
```json
{
"sandbox": {
"mode": "off"
}
}
```
所有操作直接在宿主机上执行。适合个人开发环境,你完全信任所有安装的技能。
#### all — 全部沙箱化
```json
{
"sandbox": {
"mode": "all"
}
}
```
所有命令执行和文件操作都在 Docker 容器内进行。这是最安全的模式,推荐在以下场景使用:
- 生产环境
- 多用户共享的 Gateway
- 运行来源不明的技能
#### untrusted — 仅隔离不受信任的技能
```json
{
"sandbox": {
"mode": "untrusted"
}
}
```
只有标记为"不受信任"的技能会在沙箱内运行,其他操作直接在宿主机上执行。这是安全和便利的折中方案。
## 按智能体配置沙箱
如果你运行多个智能体,可以为每个智能体设置不同的沙箱策略:
```json
{
"agents": {
"list": [
{
"id": "trusted-coder",
"sandbox": {
"mode": "off"
}
},
{
"id": "public-assistant",
"sandbox": {
"mode": "all"
}
},
{
"id": "skill-tester",
"sandbox": {
"mode": "untrusted"
}
}
]
}
}
```
这个配置的含义:
- `trusted-coder`:你自己使用的编程助手,关闭沙箱以获得最大灵活性
- `public-assistant`:对外提供服务的助手,全部沙箱化保证安全
- `skill-tester`:用于测试新技能的智能体,仅隔离不受信任的技能
## 沙箱内安装依赖
沙箱容器是一个干净的环境,可能缺少你需要的工具和依赖。使用 `setupCommand` 可以在容器创建后自动安装依赖。
### setupCommand 配置
```json
{
"sandbox": {
"mode": "all",
"setupCommand": "apt-get update && apt-get install -y python3 pip git && pip install requests"
}
}
```
`setupCommand` 的特点:
- 在容器**创建后**运行一次
- 安装的依赖在容器生命周期内持续有效
- 容器销毁后需要重新安装
### 常见 setupCommand 示例
安装 Python 环境:
```json
{
"sandbox": {
"setupCommand": "apt-get update && apt-get install -y python3 python3-pip && pip3 install requests beautifulsoup4"
}
}
```
安装 Node.js 工具:
```json
{
"sandbox": {
"setupCommand": "apt-get update && apt-get install -y nodejs npm && npm install -g tsx typescript"
}
}
```
安装多种工具:
```json
{
"sandbox": {
"setupCommand": "apt-get update && apt-get install -y curl wget jq git python3 python3-pip && pip3 install pyyaml"
}
}
```
### 按智能体配置 setupCommand
不同智能体可能需要不同的依赖:
```json
{
"agents": {
"list": [
{
"id": "python-agent",
"sandbox": {
"mode": "all",
"setupCommand": "pip3 install pandas numpy matplotlib"
}
},
{
"id": "web-agent",
"sandbox": {
"mode": "all",
"setupCommand": "apt-get update && apt-get install -y chromium-browser"
}
}
]
}
}
```
## 网络和文件系统限制
沙箱不仅隔离了执行环境,还可以限制网络访问和文件系统权限。
### 网络限制
默认情况下,沙箱容器可以访问外部网络。如果你想限制网络访问:
```json
{
"sandbox": {
"mode": "all",
"network": "none"
}
}
```
网络模式选项:
| 模式 | 说明 |
|------|------|
| `bridge`(默认) | 容器可以访问外部网络 |
| `none` | 完全禁止网络访问 |
| `host` | 使用宿主机网络(不推荐,降低隔离性) |
### 文件系统限制
沙箱容器有自己独立的文件系统。默认情况下,容器内的文件改动在容器销毁后会丢失。
如果需要持久化某些目录,可以配置挂载:
```json
{
"sandbox": {
"mode": "all",
"mounts": [
{
"source": "/home/user/data",
"target": "/data",
"readonly": false
},
{
"source": "/home/user/config",
"target": "/config",
"readonly": true
}
]
}
}
```
⚠️ 挂载目录会打破沙箱的隔离性。只挂载必要的目录,并尽量使用 `readonly: true`。
### 资源限制
可以限制容器使用的系统资源:
```json
{
"sandbox": {
"mode": "all",
"resources": {
"memory": "512m",
"cpus": "1.0"
}
}
}
```
这可以防止智能体执行的命令消耗过多系统资源。
## 何时该用沙箱
### 推荐使用沙箱的场景
**运行不受信任的技能**
从 ClawHub 安装的第三方技能可能包含未知的命令执行逻辑。沙箱可以限制这些技能的影响范围:
```json
{
"sandbox": {
"mode": "untrusted"
}
}
```
**多用户共享 Gateway**
当多个用户共享同一个 Gateway 时,沙箱可以防止一个用户的操作影响其他用户:
```json
{
"sandbox": {
"mode": "all"
}
}
```
**生产环境**
在生产服务器上运行 OpenClaw 时,沙箱是必要的安全措施:
```json
{
"sandbox": {
"mode": "all",
"network": "none",
"resources": {
"memory": "1g",
"cpus": "2.0"
}
}
}
```
**测试新技能**
在安装和测试新技能时,使用沙箱可以安全地评估技能的行为:
```json
{
"agents": {
"list": [
{
"id": "skill-tester",
"sandbox": {
"mode": "all"
}
}
]
}
}
```
### 不需要沙箱的场景
- **个人开发环境**:你完全信任所有安装的技能,且只有你自己使用
- **只使用内置工具**:不运行第三方技能,只使用 OpenClaw 内置的工具
- **Docker 不可用**:某些环境(如某些 VPS、CI/CD)可能无法运行 Docker
## 沙箱排查
### 检查 Docker 状态
```bash
# Docker 是否在运行
docker info
# 查看沙箱容器
docker ps | grep openclaw
# 查看容器日志
docker logs
```
### 常见问题
**问题:沙箱启动失败**
```bash
# 检查 Docker 权限
docker run hello-world
# 如果权限不足
sudo usermod -aG docker $USER
# 重新登录后生效
```
**问题:setupCommand 执行失败**
```bash
# 手动进入容器测试
docker exec -it /bin/bash
# 在容器内手动执行 setupCommand
apt-get update && apt-get install -y python3
```
**问题:容器内无法访问网络**
检查网络配置是否设置为 `none`:
```json
{
"sandbox": {
"network": "bridge"
}
}
```
**问题:文件在容器重启后丢失**
这是正常行为。如果需要持久化,配置挂载目录:
```json
{
"sandbox": {
"mounts": [
{
"source": "/home/user/persistent-data",
"target": "/data",
"readonly": false
}
]
}
}
```
## 安全最佳实践
1. **生产环境必须开启沙箱**:`mode: "all"` 是生产环境的最低要求
2. **限制网络访问**:如果智能体不需要访问外部网络,设置 `network: "none"`
3. **最小化挂载**:只挂载必要的目录,尽量使用只读模式
4. **限制资源**:设置内存和 CPU 限制,防止资源耗尽
5. **配合工具策略**:沙箱 + 工具策略组合使用,双重保护
6. **定期清理容器**:清理不再使用的沙箱容器,释放资源
```bash
# 清理已停止的容器
docker container prune
# 清理未使用的镜像
docker image prune
```
## 小结
沙箱是 OpenClaw 安全体系的重要组成部分:
- 使用 Docker 容器隔离智能体的执行环境
- 三种模式:`off`(关闭)、`all`(全部隔离)、`untrusted`(仅隔离不受信任的技能)
- 与工具策略(allow/deny)和提权(elevated)配合使用,形成多层安全防护
- 通过 `setupCommand` 在容器内安装依赖
- 可以限制网络访问、文件系统和系统资源
- 生产环境和多用户场景强烈推荐开启沙箱
安全不是可选项——当你的 Gateway 面向外部用户或运行第三方技能时,沙箱是保护系统的第一道防线。
#沙箱隔离 #安全运行 #Docker隔离 #工具策略 #龙虾技能库