OpenClaw API Key管理揭秘:SecretRef机制详解
你的 openclaw.json 配置文件里,很可能直接躺着几个未加密的 API Key——Slack Token 或第三方服务的密钥。任何一个泄露出去,都足够引发严重事故。Git 误提交、服务器被入侵、备份文件意外流出,这些安全事件的源头往往就是一行不起眼的明文配置。
如何解决?OpenClaw 提供了一套优雅的方案:通过 SecretRef 机制,将明文密钥替换成一个引用对象,运行时自动从指定来源拉取真实值,避免敏感信息硬编码。
问题
OpenClaw 的 openclaw.json 配置文件中可能包含 Slack Token、第三方 API Key 等敏感凭据。明文存储会带来三类主要风险:提交到 Git 仓库、服务器被攻破后配置被窃取、备份文件泄露至不安全的存储。
解决方案:SecretRef
OpenClaw 支持将明文密钥替换为引用对象,在应用启动时从指定源读取真实凭据,全程不暴露原始值。
三种支持的数据源:
- env:操作系统环境变量
- file:JSON 格式的本地文件(可用 JSON Pointer 定位嵌套字段)
- exec:外部命令(例如 1Password CLI、HashiCorp Vault、sops)
配置示例
环境变量
{
"botToken": { "source": "env", "provider": "default", "id": "SLACK_BOT_TOKEN" }
}
文件
先定义 provider:
{
"secrets": {
"providers": {
"filemain": { "source": "file", "path": "~/.openclaw/secrets.json", "mode": "json" }
}
}
}
引用时:{ "source": "file", "provider": "filemain", "id": "/channels/slack/botToken" }
外部命令(Vault)
{
"secrets": {
"providers": {
"vault": {
"source": "exec",
"command": "/opt/homebrew/bin/vault",
"allowSymlinkCommand": true,
"trustedDirs": ["/opt/homebrew"],
"args": ["kv", "get", "-field=API_KEY", "secret/openclaw"],
"passEnv": ["VAULT_ADDR", "VAULT_TOKEN"]
}
}
}
}
运行时特性
- 启动时一次性解析所有 SecretRef 并缓存为内存快照,不在请求处理路径上调用外部服务
- 热重载采用原子交换:新配置成功则替换,失败则保留旧版
- 非活跃面的 SecretRef 解析失败不会阻断应用启动
简单来说,启动阶段将所有引用解析一次,生成一份完整的内存快照。后续请求直接读取快照,完全绕开外部调用。热重载时,如果新配置能成功解析,就原子切换;如果失败,旧版本照常运行,避免线上中断。另外,某个 SecretRef 如果指向当前未启用的配置表面,即便解析失败也不会阻止应用启动——这个设计很务实,不会因为一条未使用的配置导致整个服务无法运行。
操作流程
# 1. 审计:扫描所有明文密钥
openclaw secrets audit --check
# 2. 配置:交互式向导逐步迁移
openclaw secrets configure
# 3. 验证:再次审计确认无残留明文
openclaw secrets audit --check
操作步骤很直观。先跑审计命令找出所有明文凭据,然后使用交互式助手完成迁移,最后再审计一遍确认没有遗漏——三步走完,你就能对密钥的安全性心中有底了。
踩坑
实际部署时有几个容易忽略的细节:
- 通过 Homebrew 安装的命令本质是符号链接,因此必须设置
allowSymlinkCommand: true并配置trustedDirs,否则会触发安全报错。 - 环境变量名称必须由大写字母开头,例如
MY_KEY合法,my_key会被拒绝——这个边界经常被忽略。 - 同一配置项如果同时存在明文值和 SecretRef,后者会覆盖前者。但为避免混淆,建议彻底删除所有明文,确保配置干净可审计。
这套方案已在实际生产环境(亚马逊云科技 EC2)中得到验证,运行稳定可靠。现在,不妨检查一下你自己的 openclaw.json 里是否还藏着明文 Key?
