1. OpenClaw 默认配置到底有多危险:自托管用户最容易忽略的安全审计盲区
OpenClaw 是一个可自托管的 AI Agent 网关,能接模型、跑技能、开浏览器、执行主机命令,国内开发者习惯叫它“龙虾”。它适合想把 Agent 能力握在自己手里的人:本地跑、接自己的模型、按需装技能。但问题也恰恰出在“自己托管”这四个字上——默认配置是给快速上手用的,不是给长期在线用的。
我见过太多实例装完就跑,网关绑在 0.0.0.0、Token 用 123456、技能装了一堆没审过权限、YOLO 模式开着直接执行主机命令。这不是危言耸听,CNCERT 已经公开警示过 OpenClaw 存在默认配置脆弱、插件投毒、提示词注入、权限过高和漏洞利用等风险。截至 2026 年 4 月,已公开的高危问题包括:CVE-2026-25253 WebSocket 劫持可一步 RCE(影响 < v2026.1.29)、CVE-2026-32922 权限提升 CVSS 9.9(< v2026.3.11)、CVE-2026-34511 Gemini OAuth PKCE 泄露(< v2026.4.2)、CVE-2026-32029 代理信任绕过(< v2026.2.21),以及 ClawHavoc 供应链投毒事件,1200+ 恶意技能不限版本。
9.9 分的 CVSS 在漏洞评分里基本到顶。如果你还跑着 v2026.3.11 之前的版本,现在就该停下来处理。安全审计不是可选项,是基线。下面这份 18 步加固清单,覆盖网关鉴权、密钥轮换、日志审计与漏洞排查,每一步都给出可复制的配置、验证命令和回滚思路。时间不够可以分档走:15 分钟紧急档先堵 RCE 和公网暴露(Step 0、1、2、8、11、17),1 小时基线档再加权限、插件、代理信任(Step 3、4、7、12、14、16),完整加固走全部 18 步。
在开始之前,先确认几件事:备份~/.openclaw/openclaw.json、~/.openclaw/workspace/、~/.openclaw/credentials/,改出问题至少能回滚;确认版本不低于 v2026.3.11,最好升到当前稳定版 v2026.4.9;弄清楚你是原生安装、WSL2 还是 Docker;确认你有改配置、重启 Gateway、调文件权限的权限;先跑一次openclaw security audit --deep,记下当前状态做基线。通用规则是:每一步先看警告,再跑命令,再做验证。每次升级、改配置、加插件或开新通道后都重跑一次审计。
2. TaoToken 前置准备:模型接入与密钥管理怎么配合 OpenClaw 加固
OpenClaw 本身是网关和 Agent 运行时,它需要接模型才能干活。很多自托管用户在这一步图省事,把模型 API Key 直接写进openclaw.json明文里,结果 Step 4 的密钥审计一跑就一堆告警。正确的做法是把模型接入和密钥管理分开:模型侧用统一的 API 入口,密钥侧用环境变量或 SecretRef 注入,配置文件里不落明文。
TaoToken 在这里的角色是模型接入层。它提供 OpenAI 兼容的 API 入口,OpenClaw 的模型配置里把 Base URL 指向https://taotoken.net/api,Key 用你在控制台生成的令牌,Model ID 填你实际要用的模型名。这样 OpenClaw 侧只需要维护一个环境变量,轮换密钥时改一处、重启 Gateway 即可,不用满配置文件找明文。
具体操作路径:先到控制台创建 API Key(地址https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=),拿到 Key 后不要直接写进openclaw.json,而是写进 shell 环境或.env文件,再用${VAR_NAME}引用。模型对话调试可以用https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=先验证模型通不通,再回 OpenClaw 配。如果你跑的是长期编码或 Agent 任务,Coding Plan 的额度模型更适合持续调用(https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=)。
这里要强调一个安全边界:TaoToken 是模型接入层,不是 OpenClaw 的替代品,也不承担你本地网关的鉴权职责。网关鉴权、技能白名单、文件权限这些仍然要在 OpenClaw 侧做。两边配合的逻辑是:模型侧统一入口 + 密钥轮换,网关侧最小暴露 + 审计留痕。接入文档在https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,配置字段和 OpenClaw 的模型段能对上。
如果你用 Claude Code 或 Anthropic 兼容通道,接入点单独走https://taotoken.net/claudecode-anthropic?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。不管走哪条通道,Key 都不应该出现在openclaw.json的明文里。Step 4 的openclaw secrets audit会直接扫出来,到时候再改不如一开始就做对。
3. 可复制配置:18 步加固清单的 JSON 与命令片段
这一节是全文的核心,所有配置都可以直接复制。路径以原生安装为例,Docker 用户把~/.openclaw换成挂载卷路径即可。
Step 0:先看版本号
openclaw --version openclaw update最低要求 v2026.3.11,当前稳定版 v2026.4.9。版本不对,后面全白做。Docker 用户不要自己发明镜像更新流程,用官方 Docker 安装/设置流程。
Step 1:网关只绑 loopback
{ "gateway": { "bind": "loopback" } }验证:
ss -tlnp | grep 18789看到127.0.0.1:18789才算对,看到0.0.0.0:18789说明还在对公网敞着。注意配置文件里写 bind mode,不是127.0.0.1/0.0.0.0这种别名。
Step 2:开网关认证
export OPENCLAW_GATEWAY_TOKEN="$(openssl rand -hex 32)"{ "gateway": { "auth": { "mode": "token" } } }Token 别用 123456。凡是 bind 不在 loopback 的场景(lan/tailnet/custom/auto),认证是必须的。
Step 3:锁状态目录和凭证
chmod 700 ~/.openclaw chmod 600 ~/.openclaw/openclaw.json chmod -R 600 ~/.openclaw/credentials/别忘了~/.openclaw/agents/<agentId>/agent/auth-profiles.json也在保护范围内。配置文件权限松了,等于把密钥亮给同机其他进程。
Step 4:清明文密钥,换 SecretRef
grep -i -E "(token|secret|key|password)" ~/.openclaw/openclaw.json openclaw secrets auditgrep 有输出就说明还有明文密钥。两种替代方式:"${VAR_NAME}"字符串替换,或 SecretRef 对象{ source: "env", provider: "default", id: "VAR_NAME" }。能迁的全迁掉。
Step 5:隔离私信会话
{ "session": { "dmScope": "per-channel-peer" } }dmPolicy控制陌生人能不能触发机器人,session.dmScope控制不同发送方是否共用上下文。不隔离的话,不同会话之间可能互相看到内容。
Step 6:加防火墙
sudo ufw default deny incoming sudo ufw allow 22/tcp sudo ufw enable跑在云上的用户,还要在安全组里同时封锁网关端口。双栈主机注意确认 IPv6 没有暴露同一个服务。
Step 7:审查已装技能
openclaw skills list openclaw skills check三种高风险权限组合:filesystem:write + child_process→ RCE 风险;filesystem:write + network:outbound→ 数据外传;credentials:read + network:outbound→ 密钥泄露。看到这些组合就该删或者收权限。
Step 8:关掉 YOLO 模式
{ "tools": { "exec": { "security": "allowlist", "ask": "always" } } }v2026.4.2 开始tools.exec默认变成 YOLO 模式:exec.security = "full"不做命令过滤,exec.ask = "off"不弹审批。很多人升级后根本没意识到 host exec 从“先问再跑”变成了“直接跑”。完全不需要 host exec 的话,最严格做法是直接 deny。
Step 9:日志脱敏
{ "logging": { "level": "info", "redactSensitive": "tools" } }Step 10:保护记忆文件
chmod 444 ~/.openclaw/SOUL.md chmod 444 ~/.openclaw/MEMORY.md检查有没有你不认识的系统规则、外链、下载地址,或者“忽略安全规则”“自动批准执行”之类的指令。
Step 11:关浏览器高危执行面
{ "browser": { "evaluateEnabled": false } }sandbox browser 用户还应限制 CDP 来源。
Step 12:插件白名单
{ "plugins": { "allow": ["browser"] } }只留你真正用的,不在白名单里的自动拒绝。
Step 13:关 mDNS 发现
{ "discovery": { "mdns": { "mode": "off" } } }需要最小发现能力可以用minimal。
Step 14:远程 UI 别直接暴露
非 loopback 的 Control UI 没设allowedOrigins、allowedOrigins: ["*"]全放开、Funnel 当远程访问用,都会被官方审计标记为高风险。安全默认值是 loopback + SSH 隧道或 Tailscale Serve。必须非 loopback 暴露的,至少配合 token/password/identity-aware proxy。
Step 15:Cron 任务最小权限
除非任务确实需要 exec 或 browser,否则不给。
Step 16:只信任显式代理来源
{ "gateway": { "allowRealIpFallback": false } }相关漏洞 CVE-2026-32029 影响 v2026.2.21 之前版本。正确做法是用trustedProxies明确信任代理 IP。
Step 17:SSRF 防护
{ "browser": { "ssrfPolicy": { "dangerouslyAllowPrivateNetwork": false } } }字段名里都写着 dangerously,别打开。
Step 18:最终验证
openclaw security audit --deep目标:0 个 CRITICAL 发现。这个命令会检查入站访问策略、工具爆炸半径、执行审批漂移、网络暴露、浏览器控制暴露、本地磁盘卫生和插件策略漂移。
4. 验证请求与成功结果:怎么确认加固真的生效
配置改完不等于生效,必须逐项验证。这一节给出每类加固的验证方法和预期输出。
网关绑定验证:ss -tlnp | grep 18789输出里监听地址必须是127.0.0.1:18789。如果看到0.0.0.0或[::],说明 bind 没生效,检查配置文件路径是不是被环境变量覆盖了。
认证验证:不带 Token 请求网关应该被拒。用 curl 测:
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:18789/health预期 401 或 403。带上正确 Token 再测一次,预期 200。如果无 Token 也返回 200,说明gateway.auth.mode没生效。
密钥审计验证:openclaw secrets audit输出里不应该有明文密钥条目。如果还有,回到 Step 4 把对应字段换成${VAR_NAME}或 SecretRef。改完重启 Gateway 再跑一次。
技能权限验证:openclaw skills check会列出每个技能的权限组合。高风险组合应该为 0。如果有,用openclaw skills remove <name>删掉,或者改技能配置收权限。
YOLO 模式验证:改完tools.exec后,触发一次需要 exec 的操作,应该弹出审批而不是直接执行。如果直接跑了,检查配置有没有被 agent 级配置覆盖。
日志脱敏验证:触发一次带敏感参数的调用,然后看日志文件里对应字段是不是被替换成[REDACTED]。没脱敏说明redactSensitive没生效。
最终审计验证:openclaw security audit --deep输出末尾会汇总发现数量。目标是 CRITICAL 为 0。HIGH 和 MEDIUM 也要看,能修就修。这个命令建议每次改配置、升级版本、增加插件或启用新通道后都重跑。
模型接入验证:如果你用 TaoToken 接模型,先在模型对话页确认模型能正常返回(https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=),再回 OpenClaw 触发一次对话。如果 OpenClaw 报模型不可用,检查 Base URL 是不是https://taotoken.net/api,Key 环境变量有没有被 Gateway 进程读到。Gateway 是独立进程的话,export的变量要在启动 Gateway 的 shell 里生效,或者写进 systemd unit 的Environment=。
回滚思路:每一步改之前备份对应文件。改坏了用备份覆盖,重启 Gateway,再跑一次审计确认回到基线。不要在没有备份的情况下批量改配置。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth 报错怎么处理
加固过程中最容易撞的几类报错,这里逐个拆。
401 Unauthorized:网关认证开了但请求没带 Token,或者 Token 不匹配。先确认OPENCLAW_GATEWAY_TOKEN在启动 Gateway 的进程环境里可见。systemd 用户检查 unit 文件有没有Environment=,Docker 用户检查-e或 compose 的environment。然后确认请求头带的是Authorization: Bearer <token>。如果 Token 对但还是 401,检查gateway.auth.mode是不是token,有没有被其他配置文件覆盖。
local proxy failed:通常是 Gateway 绑了 loopback,但客户端从外部访问,中间没有隧道。这不是 bug,是 Step 1 的预期行为。正确做法是走 SSH 隧道ssh -L 18789:127.0.0.1:18789 user@host,或者用 Tailscale Serve。不要为了图方便把 bind 改回 0.0.0.0。
reading choices 报错:模型返回格式不符合预期,常见于 Base URL 或 Model ID 配错。检查 OpenClaw 模型配置里的 Base URL 是不是https://taotoken.net/api,Model ID 是不是控制台里实际可用的模型名。如果用的是 Anthropic 兼容通道,接入点走https://taotoken.net/claudecode-anthropic?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,不要和 OpenAI 兼容通道混用。改完重启 Gateway 再试。
OAuth 报错(PKCE 相关):CVE-2026-34511 影响 v2026.4.2 之前版本,Gemini OAuth PKCE 泄露。先升级到 v2026.4.9 或更高。升级后如果还报 OAuth 错,检查凭证文件权限是不是 600,以及~/.openclaw/credentials/下有没有旧版本残留的 token 文件需要清理。
secrets audit 一直报明文:grep 能扫到但你没找到位置,可能是嵌套在数组或深层对象里。用openclaw secrets audit --verbose看具体路径,或者用jq递归找:jq 'paths(scalars) as $p | select(getpath($p) | tostring | test("token|secret|key|password"; "i")) | $p' ~/.openclaw/openclaw.json。
security audit 报 CRITICAL 但不知道改哪:openclaw security audit --deep --json输出结构化结果,每条发现带rule和path字段,按 path 回对应配置段改。改完重跑,直到 CRITICAL 为 0。
CC Switch / Cline MCP / Codex auth.json 相关:如果你在这些工具里配 OpenClaw 或模型接入,三件套必须写全:Base URL、Key、Model ID。缺一个就会报连接失败或模型不可用。Base URL 统一用https://taotoken.net/api,Key 用控制台生成的令牌,Model ID 填实际模型名。Codex 的auth.json里不要写明文 Key,用环境变量引用。
6. 长期编码与 Agent 场景的接入建议
加固做完只是基线,长期跑 Agent 任务还要考虑密钥轮换和额度管理。模型侧建议用 Coding Plan 的额度模型,适合持续调用场景(https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=)。密钥轮换的节奏看你的暴露面:公网有入口的实例建议 30 天轮换一次,纯内网可以放宽到 90 天。轮换时先在控制台生成新 Key,更新环境变量,重启 Gateway,确认模型调用正常后再吊销旧 Key。
API Key 管理入口在https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,接入文档在https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。模型对话调试用https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。Claude Code 和 Anthropic 兼容通道走https://taotoken.net/claudecode-anthropic?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。
最后提醒一句:这份清单没覆盖 Hook ingress token 设计问题、全量 trusted-proxy 部署细节、多租户共享 Gateway 隔离架构、全部 plugin migration 边界条件、企业级日志和取证流程。手动走完 18 步大概 60-90 分钟,每次升级完还得重新过一遍。把openclaw security audit --deep加进你的升级 checklist,比出事之后再补要省事得多。