OpenClaw Docker 沙箱安全架构
OpenClaw Docker 沙箱安全架构:代码执行的容器级隔离与七层纵深防护
摘要:AI Agent 执行代码的安全边界在哪里?OpenClaw 没有选 VM(太重),也没有选 seccomp 裸调(太底层),而是在 Docker 容器层面构建了七层纵深防御体系。本文详解其 Bind Mount 防路径穿越、Capabilities 白名单裁剪、Config Hash 热容器保留,以及文件系统桥接的符号链接硬化校验。
一、安全模型的根本选择:为什么是 Docker?
在让 AI 执行任意代码这件事上,业界有三种隔离方案:
| 方案 | 隔离强度 | 启动速度 | 文件共享 | OpenClaw 的选择 |
|---|---|---|---|---|
| VM(虚拟机) | ★★★★★ | 慢(分钟级) | 需网络挂载 | ❌ |
| seccomp 裸调 | ★★★ | 快 | 困难 | ❌ |
| Docker 容器 | ★★★★ | 快(秒级) | Bind Mount | ✅ |
关键在于:AI Agent 需要读写用户的真实工作目录(workspace),但又不应该访问 /etc/passwd、/proc、Docker socket 等敏感路径。Docker 的 Bind Mount 恰好能精确控制"哪几个目录可以共享"——问题变成了"如何验证这些 mount 是安全的"。
二、容器生命周期:从创建到自动清理
2.1 核心流程
核心原理① — Config Hash 热容器保留:当用户修改了沙箱配置(如新增 bind mount),不是粗暴 rm 旧容器,而是将其 rename 保留。新容器就绪后,二者并存几秒过渡期,然后在下次 prune 周期清理旧容器。这确保了配置变更时正在执行的任务不会因容器突然消失而中断。
2.2 自动清理策略
| 参数 | 默认值 | 说明 |
|---|---|---|
idleHours | 24 | 空闲超过 24h 自动删除 |
maxAgeDays | 7 | 最长存活 7 天,无论是否活跃 |
| 巡检间隔 | 5 分钟 | 每 5 分钟检查一次 |
三、Bind Mount 安全:七层纵深防御
这是整个沙箱安全的精髓。每次构建 Docker 容器参数时,validateSandboxSecurity() 都会强制执行以下验证链:
核心原理② — 符号链接硬化是最后防线:即使 source 路径
/workspace/projects/secret通过了前五层检查,也必须在 Docker 容器内通过realpath(解析所有 symlink)重新验证。如果/workspace/projects实际上是一个指向/root的软链接,第六层会在容器内执行 shell 命令解析真实路径后触发第七层重新检查——此时/root命中黑名单,拒绝。
关键的是,即使配置了 dangerouslyAllowExternalBindSources(允许挂载外部路径),仍然有三层不可绕过:
/etc,/proc,/sys的黑名单始终生效- Docker socket 永远不可挂载
- 根目录
/永远不可挂载
四、Capabilities 与资源配额
4.1 Capabilities 白名单
OpenClaw 默认 cap-drop: ALL——先全部剥夺,再按需添加:
这比 --privileged 或默认 cap 集合要安全得多。即使 AI 生成的代码包含恶意系统调用,缺少对应 capability 的容器也无力执行。
4.2 资源配额三重限制
| 限制项 | 默认值 | 防护目标 |
|---|---|---|
--cpus | 1 | 防止挖矿 / CPU 洪水 |
--memory | 512m | 防止内存炸弹 |
--pids-limit | 64 | 防止 fork 炸弹 |
就算 Agent 生成了一段 while(true) { fork(); } 的代码,PID 限制 64 会让第 65 次 fork 直接失败——进程数封顶,保住了宿主机。
五、文件系统桥接的安全设计
当 AI Agent 执行 read_file /etc/passwd 时,路径解析发生在容器内。但如果用户配置了"允许 Agent 访问整个主机文件系统",那 assertPathSafety 就需要在每次文件操作前做一次额外的安全检查:
核心原理③ — 逐段检查防止中间路径劫持:即使是
/workspace/safe/../../etc/passwd这样的路径,通过逐段解析每一个路径组件,..穿越会在第一关就被捕获。而符号链接劫持——比如/workspace/link指向/etc——则在第二关的逐段 symlink 检测中被拦截。
六、总结
OpenClaw 的 Docker 沙箱不依赖任何"假设 AI 不会写恶意代码"的安全模型。它假设最坏情况:AI 生成了 fork 炸弹、路径穿越、符号链接逃逸——然后逐层拦截。这种纵深防御策略意味着单点防线被突破并不会导致整个沙箱沦陷。
下篇预告:《高可用与进程生命周期:Gateway 信号重启、进程锁与优雅关闭》
参考资料:
- OpenClaw CN 官网:https://open-claw.org.cn
- Gitee 仓库:https://gitee.com/OpenClaw-CN/openclaw-cn
更多推荐
所有评论(0)