当AI智能体拥有执行命令的能力,"信任但验证"是最后的防线
引言:为什么必须用Docker?
2026年3月,安全研究人员捕获了一个名为@openclaw-ai/openclawai的恶意npm包,它伪装成官方CLI工具,通过postinstall钩子在受害者设备上建立反弹Shell,窃取SSH密钥、云平台凭证和浏览器会话信息-7。这一事件再次敲响警钟:裸机运行OpenClaw=自杀式部署。
OpenClaw的核心风险在于其"自主决策能力"------如果以root权限直接在主机上运行,被恶意指令诱导的AI可能执行rm -rf /、窃取~/.ssh/id_rsa、甚至将整个/etc目录打包外发。Docker沙箱正是为此而生:将高风险操作限制在隔离容器内,即使AI"犯傻",受损的也只是一个随时可销毁的容器环境 -1-7。
一、沙箱模式对比:找到你的安全水位线
OpenClaw通过agents.defaults.sandbox.mode控制沙箱何时启用,提供三种模式-2-3:
| 模式 | 配置值 | 说明 | 适用场景 |
|---|---|---|---|
| 危险 | "off" | 不使用沙箱,所有工具都在主机上运行 | ❌ 强烈不推荐,仅用于调试 |
| 个人单用户 | "non-main" | 只对非主会话启用沙箱(默认选项) | 个人开发者,信任主会话,隔离群组/频道 |
| 生产环境推荐 | "all" | 所有会话都运行在沙箱中 | 企业部署、多用户环境、高安全要求 |
关键理解 :"non-main"模式基于session.mainKey(默认"main")判断,群组/频道会话使用自己的key,因此会被沙箱化 -3。这意味着你的私人聊天可能直接在主机运行,而群组对话则在容器中隔离执行。
最小配置示例:
{
"agents": {
"defaults": {
"sandbox": {
"mode": "non-main", // 非主会话启用沙箱
"scope": "session", // 每个会话一个容器
"workspaceAccess": "none" // 不访问主机工作区
}
}
}
}
二、Docker硬化参数:构建铜墙铁壁
2.1 核心参数配置
OpenClaw在底层调用Docker API时,支持传递一系列安全硬化参数。在~/.openclaw/openclaw.json中配置-1-3:
{
"agents": {
"defaults": {
"sandbox": {
"docker": {
"image": "openclaw-sandbox:bookworm-slim",
"readonlyRootfs": true, // 只读文件系统
"securityOpt": ["no-new-privileges"], // 禁止提权
"capabilities": {
"drop": ["ALL"] // 丢弃所有Linux capabilities
},
"network": "none", // 禁用网络
"memory": 128 * 1024 * 1024, // 128MB 内存限制
"cpuPeriod": 100000,
"cpuQuota": 50000 // 限制50%单核CPU
}
}
}
}
}
2.2 每个参数的安全意义
| 参数 | 作用 | 安全收益 |
|---|---|---|
| --read-only | 容器根文件系统只读 | 防止恶意写入系统文件、安装后门 |
| --security-opt=no-new-privileges | 禁止进程获得比父进程更高权限 | 阻止容器内提权攻击 |
| --cap-drop=ALL | 丢弃所有Linux能力 | 即使容器被攻破,也无法执行特权操作 |
| --network=none | 禁用网络 | 阻止数据外泄、C2通信 |
| --memory限制 | 限制内存使用 | 防DoS攻击 |
| --cpu-quota | 限制CPU使用 | 防资源滥用-1 |
2.3 默认镜像的安全设计
OpenClaw默认使用openclaw-sandbox:bookworm-slim镜像,基于Debian构建,不包含任何网络工具 (curl、wget、nc等)。如需添加常用工具,可构建通用镜像-2:
scripts/sandbox-common-setup.sh
然后在配置中指定:
{
"sandbox": {
"docker": {
"image": "openclaw-sandbox-common:bookworm-slim"
}
}
}
2.4 绑定挂载的安全警告
有时需要让沙箱访问主机目录(如读取源代码),可通过binds配置-3:
{
"sandbox": {
"docker": {
"binds": [
"/home/user/source:/source:ro", // 只读挂载
"/var/data:/data:rw" // 读写挂载
]
}
}
}
⚠️ 安全警告 :绑定挂载会完全穿透沙箱文件系统 ,以你设置的任何模式暴露主机路径。敏感目录必须使用:ro只读模式,绝对不要挂载docker.sock等危险路径-2。
三、三层隔离模型:从沙箱到宿主机的安全阶梯
OpenClaw设计了三层隔离模型 ,按安全强度递增-1:
L1: Docker沙箱(Sandbox)------ 默认且最安全
L2: 网关宿主(Gateway Host)------ 受控的本地执行
L3: 远程节点(Remote Node)------ 企业级扩展
3.1 第一层:Docker沙箱(默认)
- 每条命令在临时、无状态、最小化Docker容器中运行
- 容器启动后立即执行命令,完成后自动销毁
- 无网络、无持久存储、无特权-1
实现原理:
async function runInSandbox(cmd, args) {
const container = await docker.createContainer({
Image: "openclaw/sandbox:latest",
Cmd: [cmd, ...args],
HostConfig: {
NetworkMode: "none", // 禁用网络
AutoRemove: true, // 自动删除
CapDrop: ["ALL"], // 放弃所有能力
SecurityOpt: ["no-new-privileges"]
}
});
// 执行并返回结果
}
3.2 第二层:网关宿主(受控执行)
当命令需要访问本地资源(如项目目录、Docker Daemon),可降级到L2,但必须同时满足-1:
- 智能体配置显式声明host: "gateway"
- 命令在权限提升白名单中
- 用户通过手机端手动审批
权限提升白名单示例:
bashTools:
elevatedWhitelist:
-
"git status"
-
"npm run build"
-
"docker ps"
3.3 第三层:远程节点(企业级)
在多服务器环境中,命令可在特定远程机器执行。每个节点独立权限策略,命令在远程沙箱中执行,所有操作记录审计日志-1。
四、命令审批机制:人类是最后一道防线
OpenClaw的哲学是:AI可以"提议"执行命令,但人类必须保留"否决权" -1。
4.1 敏感操作拦截配置
通过human_in_the_loop配置,将高风险操作标记为"敏感",执行前需人工确认-7:
# ~/.openclaw/config.yaml
human_in_the_loop:
enabled: true
require_approval_for:
-
exec # 所有命令执行
-
file_system.delete # 文件删除
-
email.send # 发送邮件
-
git.commit # Git 提交
-
crypto.transfer # 加密货币转账
approval_timeout_minutes: 5 # 5 分钟不回复自动拦截
4.2 审批流程
- AI生成工具调用:exec(command="rm -rf ./temp")
- 网关检测到需审批:匹配require_approval_for列表
- 通过IM发送确认卡片(WhatsApp/Telegram):
AI请求执行:
命令:rm -rf ./temp
路径:/home/user/projects
危险等级:高风险
请选择:[确认] [拒绝]
- 用户点击"确认"后,命令才执行 -1
4.3 Exec审批的高级配置
OpenClaw的exec工具支持精细的审批策略-4:
| 参数 | 选项 | 说明 |
|---|---|---|
| security | deny / allowlist / full | 执行策略 |
| ask | off / on-miss / always | 审批提示时机 |
| elevated | true / false | 请求提升模式 |
示例:配置节点执行始终需要审批
/exec host=node security=full ask=always node=mac-1
五、工具策略配置:细粒度的权限控制
OpenClaw提供三层安全控制-2:
- 沙箱:决定工具在哪里运行(Docker vs 主机)
- 工具策略:决定哪些工具可用/禁止
- Elevated模式:exec专用的"逃逸舱",在主机上运行
5.1 工具策略层级
过滤顺序(从宽到严)-5:
- 工具配置 (profile)
- 提供商工具配置
- 全局工具策略 (allow/deny)
- 提供商工具策略
- Agent专属工具策略
- 沙箱工具策略
- 子代理工具策略
5.2 工具组快捷方式
使用group:前缀快速配置工具组-5:
| 组名 | 包含工具 |
|---|---|
| group:runtime | exec, bash, process |
| group:fs | read, write, edit, apply_patch |
| group:sessions | sessions_list, sessions_history, sessions_send |
| group:memory | memory_search, memory_get |
| group:web | web_search, web_fetch |
| group:ui | browser, canvas |
| group:messaging | message |
配置示例:仅允许文件工具+浏览器
json
复制
下载
{
"tools": {
"allow": ["group:fs", "browser"]
}
}
5.3 多代理沙箱配置示例
{
"agents": {
"list": [
{
"id": "main",
"default": true,
"name": "Personal Assistant",
"sandbox": { "mode": "off" } // 主机运行,完全信任
},
{
"id": "family",
"name": "Family Bot",
"sandbox": {
"mode": "all",
"scope": "agent"
},
"tools": {
"allow": ["read"],
"deny": ["exec", "write", "edit", "apply_patch", "browser"]
}
}
]
}
}
六、沙箱浏览器:隔离的网页访问
OpenClaw支持在沙箱中运行浏览器,防止恶意网页通过浏览器漏洞攻击主机-2-3。
6.1 浏览器安全加固
沙箱浏览器默认使用以下Chromium启动参数-2:
- --no-sandbox
- --disable-gpu
- --disable-3d-apis
- --disable-extensions
- --renderer-process-limit=2
6.2 浏览器沙箱配置
{
"agents": {
"defaults": {
"sandbox": {
"browser": {
"autoStart": true,
"network": "none", // 禁用网络
"cdpSourceRange": ["127.0.0.1/32"], // CDP 入口白名单
"allowHostControl": false // 禁止控制主机浏览器
}
}
}
}
}
6.3 浏览器工具的安全使用
// 在沙箱中截图,不会污染主机
const screenshot = await browser.screenshot({
url: "https://unknown-site.com",
profile: "sandbox-profile" // 使用独立profile
});
七、调试命令与运维实践
7.1 查看沙箱配置
openclaw sandbox explain
openclaw sandbox explain --session agent:main:main
openclaw sandbox explain --json
7.2 列出沙箱容器
openclaw sandbox list
openclaw sandbox list --browser # 只看浏览器容器
7.3 重建沙箱容器
openclaw sandbox recreate --all # 重建所有
openclaw sandbox recreate --session main # 特定会话
openclaw sandbox recreate --agent mybot # 特定agent
openclaw sandbox recreate --browser # 只重建浏览器
提示 :修改Docker镜像或配置后,必须重建容器才能生效 -2。
7.4 安全日志审查
# 实时查看安全相关日志
tail -f ~/.openclaw/logs/security-audit.log | grep -E "WARN|ERROR|BLOCKED"
八、常见问题解决
Q1: "Tool X blocked by sandbox tool policy"
原因 :工具被沙箱策略拒绝-2。
解决方案:
- 禁用沙箱:agents.defaults.sandbox.mode=off(不推荐)
- 或在沙箱中允许该工具:
- 从tools.sandbox.tools.deny中移除
- 或添加到tools.sandbox.tools.allow
Q2: "I thought this was main, why is it sandboxed?"
原因 :在"non-main"模式下,群组/频道的key不是"main"-2。
解决方案:
- 使用主会话key
- 或切换到"off"模式
- 或接受群组会话在沙箱中运行
Q3: "Elevated exec not working"
原因 :tools.elevated未启用或不在白名单-4。
解决方案:
{
"tools": {
"elevated": true,
"elevatedWhitelist": ["your-command"]
}
}
九、生产环境推荐配置模板
9.1 个人开发者推荐(平衡安全与便利)
{
"agents": {
"defaults": {
"sandbox": {
"mode": "non-main", // 主会话在主机,其他在沙箱
"scope": "session",
"workspaceAccess": "ro", // 工作区只读
"docker": {
"readonlyRootfs": true,
"securityOpt": ["no-new-privileges"],
"capabilities": { "drop": ["ALL"] },
"network": "none",
"memory": 256 * 1024 * 1024
}
}
}
},
"human_in_the_loop": {
"enabled": true,
"require_approval_for": ["exec", "file_system.delete"]
}
}
9.2 企业生产环境推荐(最高安全)
{
"agents": {
"defaults": {
"sandbox": {
"mode": "all", // 所有会话进沙箱
"scope": "session",
"workspaceAccess": "none", // 完全不访问主机工作区
"docker": {
"image": "openclaw-sandbox:hardened",
"readonlyRootfs": true,
"securityOpt": ["no-new-privileges"],
"capabilities": { "drop": ["ALL"] },
"network": "none",
"memory": 128 * 1024 * 1024,
"cpuQuota": 50000
}
}
}
},
"tools": {
"profile": "minimal", // 最小工具集
"deny": ["exec", "process", "browser", "canvas"]
},
"human_in_the_loop": {
"enabled": true,
"require_approval_for": ["*"], // 所有操作需审批
"approval_timeout_minutes": 10
}
}
十、安全基线检查清单
| 检查项 | 命令/验证 | 期望结果 |
|---|---|---|
| 沙箱模式 | openclaw sandbox explain | 显示预期模式(non-main/all) |
| Docker硬化 | docker inspect $(openclaw sandbox list -q) | grep -E "ReadonlyRootfs|CapDrop" | ReadonlyRootfs=true, CapDrop=[ALL] |
| 工具策略 | openclaw config get tools.deny | 包含高风险工具 |
| 审批机制 | openclaw config get human_in_the_loop | enabled=true |
| 安全日志 | tail -5 ~/.openclaw/logs/security-audit.log | 无异常拒绝记录 |
结语:信任但验证
OpenClaw的运行时安全架构,体现了对AI智能体"行动能力"的审慎态度-1:
- 默认最安全(沙箱)
- 可控降级(白名单+审批)
- 可扩展(远程节点)
它不阻止AI做事,而是确保每一步都在人类知情与授权下进行。正如安全专家所言:"沙箱不是完美的安全边界,但当模型做出愚蠢行为时,它能实质性地限制文件系统和进程访问"-3。
在享受AI效率红利的同时,请牢记:
裸机运行OpenClaw,等于把家门钥匙放在门口垫子下 -8。
(系列文章第五篇,待续。下一篇预告:凭证管理与数据加密------守住API密钥生命线)
参考文献:
- 腾讯云开发者社区.exec.ts 上篇 ------ OpenClaw 安全执行 Shell 命令的三层隔离模型.2026-03-13-1
- GitCode开源社区.小学子讲技术 - OpenClaw 沙箱集成详解.2026-03-16-2-6
- UNPKG.@gguf/claw 沙箱隔离文档.2026-02-03-3
- W3Cschool.cn.OpenClaw Exec 工具用法、stdin 模式和 TTY 支持.2026-03-17-4
- W3Cschool.cn.OpenClaw 智能体工具接口文档.2026-03-17-5
- Foresight News.如何安全地使用 OpenClaw.2026-02-24-7
- CSDN博客.OpenClaw(小龙虾)安全使用白皮书.2026-03-17