1. 为什么本地 AI 也需要沙箱从一次误删说起OpenClaw 是一个可以跑在你自己机器上的本地 AI 助手框架它能读写文件、执行命令、调用工具适合想把 AI 能力接进个人工作流的开发者。但正因为能动手它带来的风险比纯聊天机器人高一个量级——模型一旦被诱导或者工具参数校验不严就可能碰到不该碰的目录。我试过在测试环境里让一个没配沙箱的 Agent 执行清理任务结果它把工作区外的临时目录也扫了一遍。虽然没造成实际损失但那次之后我把 SECURITY.md 从头读了一遍才意识到 OpenClaw 的安全设计不是加个密码这么简单而是从网络层到审计层的纵深防御。这篇就围绕 SECURITY.md 里的核心机制把沙箱、Docker 隔离、DM 策略的配置骨架拆开讲。你会看到可复制的config.toml和settings.json片段以及启动后怎么验证沙箱真的生效、DM 策略真的在拦截。目标很明确让每一层防御都能被你亲手确认而不是停留在文档描述里。2. 前置准备TaoToken 接入与 OpenClaw 环境就绪在配安全策略之前得先让 OpenClaw 能正常调用模型。我用的方式是 TaoToken 提供的统一 API 入口它兼容 OpenAI 风格的请求格式OpenClaw 的 provider 配置里直接填就行。先去控制台创建一个 API Key地址是 https://taotoken.net/api-keys 拿到形如sk-xxxx的密钥后保存好。模型对话调试可以用 https://taotoken.net/model-chat 这个页面快速验证 Key 是否可用不用写代码就能发一条测试消息。OpenClaw 侧的 provider 配置写在config.toml里基础片段如下[provider.taotoken] type openai-compatible base_url https://taotoken.net/api api_key sk-你的密钥 default_model gpt-4o-mini这里base_url只写到/api不要带多余路径。配好之后先跑一次openclaw provider test taotoken确认能拿到模型响应再往下做安全配置。如果这一步就报 401先检查 Key 有没有复制完整别急着怀疑沙箱。3. 可复制配置config.toml 与 settings.json 的沙箱骨架OpenClaw 的配置分两层config.toml管运行时行为settings.json管安全策略细节。SECURITY.md 里强调的非主会话强制隔离就是靠这两层配合实现的。3.1 config.toml沙箱与 DM 策略总开关[security] dm_policy pairing # 陌生人会话走配对验证 pairing_timeout 300 # 配对码有效期 5 分钟 pairing_length 6 # 配对码位数 [security.sandbox] enabled true image openclaw/sandbox-node:latest readonly_rootfs true auto_remove true network_mode none # 默认禁网防数据外泄 memory_limit 256m cpu_quota 0.5 timeout 30 # 秒超时强制销毁 [security.sandbox.mount] workspace /home/你的用户名/.openclaw/workspace mode ro # 只读挂载关键network_mode none是默认值只有明确需要联网的工具才在settings.json里单独放行。mode ro意味着沙箱里的进程只能读工作区写操作会被内核拒绝这是防止模型改坏文件的第一道硬约束。3.2 settings.json工具策略管道细粒度控制{ toolPolicy: { allowlist: [read, write, bash, http], denylist: [browser, canvas, exec], fs: { allowPaths: [ /home/你的用户名/.openclaw/workspace/, /home/你的用户名/documents/notes/ ], denyPaths: [/etc/, /root/, /proc/, /sys/] }, loop: { maxDepth: 5 }, outputFilter: { patterns: [ { regex: ([A-Za-z0-9]{20,}), replace: *** }, { regex: 1[3-9]\\d{9}, replace: 1********** } ] } } }denylist优先级高于allowlist所以即使bash在白名单里只要它出现在黑名单就会被拦。fs.allowPaths建议写绝对路径~在不同运行用户下解析结果可能不一致这是踩过的坑。3.3 DM 策略的三种模式怎么选策略值行为适用场景风险pairing陌生人发消息返回配对码验证后入白名单个人/小团队低allow允许所有陌生人私信公开测试高block拒绝所有陌生人高安全要求极低个人使用直接选pairing配对码超时和位数按需调。白名单文件默认在~/.openclaw/whitelist.json格式必须是 JSON 数组比如[telegram:123456]写成对象会导致匹配失败。4. 验证请求确认沙箱生效与 DM 拦截日志配置写完不代表生效得用实际动作验证。SECURITY.md 里提到的启动后检查沙箱生效状态与 DM 策略拦截日志就是这一步。4.1 检查沙箱是否真的在隔离先确认 Docker 守护进程在跑然后执行 OpenClaw 自带的沙箱测试命令openclaw sandbox test --tool bash --args echo hello正常输出会返回hello同时日志里能看到容器创建和销毁记录。如果报Docker 守护进程未运行先systemctl start docker或启动 Docker Desktop。再验证只读挂载是否生效故意让沙箱写工作区外的文件openclaw sandbox test --tool bash --args touch /etc/test-write预期结果是权限拒绝日志里出现Read-only file system。如果这条命令成功了说明readonly_rootfs或挂载模式没配对回去检查config.toml的[security.sandbox]段。4.2 查看 DM 策略拦截日志用一个未在白名单的账号给 OpenClaw 发消息然后查日志tail -f logs/security/auth.log配对模式下应该看到类似DM blocked, pairing code issued to telegram:xxx的记录。如果陌生人消息直接进了会话说明dm_policy没生效检查拼写是不是写成了pair而不是pairing。工具策略管道的拦截日志在logs/security/tool-policy.log触发一次黑名单工具调用比如让 AI 调browser日志里会出现tool denied by denylist: browser。这条日志能确认策略管道真的在每一步做校验而不是只加载了配置。4.3 用模型对话快速回归安全配置改完后建议用 https://taotoken.net/model-chat 发一条正常请求确认模型调用链路没被安全策略误伤。如果模型对话正常但工具调用被拦问题就在工具策略层不在 provider 层。5. 本篇常见错排查沙箱容器启动即退出auto_remove true时容器执行完就删docker logs可能来不及看。临时把auto_remove设为false拿到容器 ID 后再查日志定位完再改回来。配对码不生效最常见的是dm_policy拼写错误或者对应通道的allowPrivate没开。检查config.toml里通道配置段确认私信入口是打开的。工具名大小写不匹配allowlist里的工具名必须和工具定义完全一致Bash和bash是两个东西。策略管道拦截合法工具时先核对名称。路径配置用~导致解析失败不同运行用户的家目录不同~展开结果可能不是你预期的。统一改成绝对路径省掉这类问题。输出过滤误伤正常内容正则([A-Za-z0-9]{20,})会匹配长字符串如果工具返回的合法数据里有长 ID也会被替换成***。按实际数据特征调整正则别直接照搬。沙箱内网络请求全失败network_mode none是默认禁网需要联网的工具要在settings.json里单独放行或者给该工具配置allowNetwork。别为了省事把全局网络打开。6. 长期编码与 Agent 场景的下一步如果你打算把 OpenClaw 当长期编码助手或 Agent 底座用安全配置只是起点。频繁的工具调用、多轮会话、自定义插件都会让权限边界变复杂这时候建议走 Coding Plan 这类面向持续使用的方案地址是 https://taotoken.net/coding-plan 配合接入文档 https://taotoken.net/doc 把 provider 和策略配置对齐。沙箱和 DM 策略的骨架搭好之后下一步可以研究工具策略管道里的参数校验 Schema用 TypeBox 给每个工具定义严格的入参约束把注入类风险挡在执行之前。这部分配置量不小但一旦跑通你的本地 AI 就从能用变成敢用了。
