☰
OpenClaw 还在裸奔?18 步加固清单,别等出事再补
2026/10/9 2:22:18 网站建设 项目流程

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 audit

grep 有输出就说明还有明文密钥。两种替代方式:"${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,比出事之后再补要省事得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询