名称: credential-manager
描述: OpenClaw 的强制安全基础。将分散的 API 密钥和凭据整合到具有适当权限的安全 .env 文件中。适用于设置 OpenClaw、迁移凭据、审计安全或强制执行 .env 标准时。此步骤非可选——集中式凭据管理是 OpenClaw 安全部署的核心要求。扫描常见位置的凭据文件,备份现有文件,创建权限为 600 的统一 .env 文件,验证安全性并强制执行最佳实践。
状态:强制安全基础
将分散的 API 密钥和凭据整合到一个安全、集中的 .env 文件中。
集中式 .env 凭据管理是 OpenClaw 安全的核心要求。如果你的凭据分散在多个文件中,请立即停止并整合它们。
规则: 所有凭据必须且仅能位于 ~/.openclaw/.env 中。不允许在工作区、技能或脚本目录中存放。
参见:
- CORE-PRINCIPLE.md - 为何此规则不可协商
- CONSOLIDATION-RULE.md - 单一来源原则
每个 OpenClaw 部署都必须具备:
~/.openclaw/.env (权限 600)
这是你所有凭据的唯一真实来源。没有例外。
为什么?
- 单一位置 = 更易于保护
- 文件权限 600 = 仅所有者可读
- Git 忽略 = 不会意外提交
- 格式验证 = 捕获错误
- 审计追踪 = 知晓变更内容
分散的凭据 = 分散的攻击面。此技能旨在解决此问题。
~/.openclaw/.env此技能通过扫描以下内容自动检测凭据:
文件模式:
- 配置目录中的 credentials.json 文件
- .env 文件
- 名称中包含 -creds 或 credentials 的记忆文件
敏感密钥模式:
- API 密钥、访问令牌、承载令牌
- 密钥、密码、口令
- OAuth 消费者密钥
- 私钥、签名密钥、钱包密钥
- 助记词和种子短语
安全检查:
- 文件权限(必须为 600)
- Git 忽略保护
- 格式验证
# 扫描凭据
./scripts/scan.py
# 审查并整合
./scripts/consolidate.py
# 验证安全性
./scripts/validate.py
# 仅扫描
./scripts/scan.py
# 整合特定服务
./scripts/consolidate.py --service x
# 仅备份,不删除
./scripts/consolidate.py --backup-only
# 清理旧文件
./scripts/cleanup.py --confirm
此技能扫描以下位置:
~/.config/*/credentials.json
~/.openclaw/workspace/memory/*-creds.json
~/.openclaw/workspace/memory/*credentials*.json
~/.env (如果存在,则合并)
✅ 文件权限: 将 .env 设置为权限 600(仅所有者)
✅ Git 保护: 创建/更新 .gitignore
✅ 备份: 在更改前创建带时间戳的备份
✅ 验证: 检查格式、权限和重复项
✅ 模板: 创建 .env.example(可安全共享)
迁移后:
~/.openclaw/
├── .env # 所有凭据(安全)
├── .env.example # 模板(安全)
├── .gitignore # 保护 .env
├── CREDENTIALS.md # 文档
└── backups/
└── credentials-old-YYYYMMDD/ # 旧文件备份
自动检测的常见服务:
API_KEY、*_TOKEN、*_SECRET 模式完整列表请参见 references/supported-services.md。
详细安全指南请参见 references/security.md。
快速检查清单:
- ✅ .env 具有 600 权限
- ✅ .env 被 Git 忽略
- ✅ 代码或日志中没有凭据
- ✅ 定期轮换密钥
- ✅ 为不同环境使用不同的密钥
所有脚本都支持 --help 查看详细用法。
# 扫描并报告
./scripts/scan.py
# 包含自定义路径
./scripts/scan.py --paths ~/.myapp/config ~/.local/share/creds
# JSON 输出
./scripts/scan.py --format json
# 交互模式(更改前提示)
./scripts/consolidate.py
# 自动确认(无提示)
./scripts/consolidate.py --yes
# 仅备份
./scripts/consolidate.py --backup-only
# 特定服务
./scripts/consolidate.py --service molten
# 完整验证
./scripts/validate.py
# 仅检查权限
./scripts/validate.py --check permissions
# 自动修复问题
./scripts/validate.py --fix
# 试运行(显示将被删除的内容)
./scripts/cleanup.py
# 实际删除旧文件
./scripts/cleanup.py --confirm
# 保留备份
./scripts/cleanup.py --confirm --keep-backups
步骤 1:发现
./scripts/scan.py
审查输出以了解将迁移的内容。
步骤 2:备份与整合
./scripts/consolidate.py
创建备份,构建 .env,设置权限。
步骤 3:验证
./scripts/validate.py
确保所有内容安全且正确。
步骤 4:测试
使用新的 .env 文件测试你的应用程序/技能。
步骤 5:清理
./scripts/cleanup.py --confirm
删除旧的凭据文件(备份保留)。
其他 OpenClaw 技能在使用凭据前必须验证其安全性:
#!/usr/bin/env python3
import sys
from pathlib import Path
# 将凭据管理器脚本添加到路径
sys.path.insert(0, str(Path.home() / '.openclaw/skills/credential-manager/scripts'))
# 强制执行安全的 .env(如果不合规则退出)
from enforce import require_secure_env, get_credential
require_secure_env()
# 现在可以安全地加载凭据
api_key = get_credential('SERVICE_API_KEY')
#!/usr/bin/env bash
set -euo pipefail
# 验证 .env 存在且安全
if ! python3 ~/.openclaw/skills/credential-manager/scripts/enforce.py; then
exit 1
fi
# 现在可以安全地加载
source ~/.openclaw/.env
这创建了一个快速失败系统: 如果凭据未得到妥善保护,技能将拒绝运行。用户被迫修复问题。
迁移后,从 .env 加载:
import os
from pathlib import Path
# 加载 .env
env_file = Path.home() / '.openclaw' / '.env'
with open(env_file) as f:
for line in f:
if '=' in line and not line.strip().startswith('#'):
key, val = line.strip().split('=', 1)
os.environ[key] = val
# 使用凭据
api_key = os.getenv('SERVICE_API_KEY')
# 加载 .env
set -a
source ~/.openclaw/.env
set +a
# 使用凭据
echo "$SERVICE_API_KEY"
如果你使用 OpenClaw 脚本迁移:
from load_credentials import get_credentials
creds = get_credentials('x')
编辑 ~/.openclaw/.env:
# 添加新服务
NEW_SERVICE_API_KEY=your_key_here
NEW_SERVICE_SECRET=your_secret_here
同时更新模板:
# 编辑 .env.example
NEW_SERVICE_API_KEY=your_key_here
NEW_SERVICE_SECRET=your_secret_here
如果出现问题:
# 查找你的备份
ls -la ~/.openclaw/backups/
# 恢复特定文件
cp ~/.openclaw/backups/credentials-old-YYYYMMDD/x-credentials.json.bak \
~/.config/x/credentials.json