SECURITY PATTERN
密钥管理¶
When to Use
- Any agent holding credentials
- Shared or CI-run configurations
When NOT to Use
- Fully offline demos
Skill Contract(本模式的模块声明)
版本 v1.1.0 | 分类 conventions | 相关 control-flow-separation · error-compact-pattern
对应 12-Factor Agents 的隐含原则:Secrets 不与代码共存
核心原则¶
密钥不进 Git、不进上下文、不落日志。
密钥存放层级¶
| 层级 | 位置 | 适用 | 风险 |
|---|---|---|---|
| L1 | .env 文件(~/.hermes/.env) |
个人开发机 | 低(.env 在 gitignore 中) |
| L2 | 系统环境变量 | 服务器部署 | 中(进程可读) |
| L3 | 密钥管理服务(Bitwarden/AWS Secrets) | 生产环境多机部署 | 低(审计+轮换) |
Hermes 中的实践¶
基本做法¶
Hermes 自动加载 .env 到环境变量,Skill 中通过 os.getenv() 读取。
禁止的做法¶
# ❌ 密钥硬编码在 SKILL.md 中
api_key = "sk-xxx"
# ❌ 密钥硬编码在代码中
HEADERS = {"Authorization": "Bearer sk-xxx"}
# ❌ 密钥通过 Prompt 传给 LLM
prompt = f"使用密钥 {api_key} 调用 API"
# ❌ 密钥写入日志
logger.info(f"API Key: {api_key}")
密钥轮换¶
| 类型 | 轮换频率 | 做法 |
|---|---|---|
| 个人 API Key | 每 90 天 | 更换 .env 文件 |
| 生产环境 Key | 每 30 天 | 通过密钥管理服务自动轮换 |
| 泄露后 | 立即 | 立即吊销+更换 |
演练清单¶
[ ] 所有密钥是否在 `.env` 中,不在代码里?
[ ] `.env` 是否在 `.gitignore` 中?
[ ] 是否有密钥被写入日志的历史?
[ ] 是否有密钥通过 Prompt 传给 LLM?
[ ] 是否有密钥出现在错误消息中?
[ ] 上次轮换密钥是什么时候?
与 Hermes 的配合¶
Hermes 的 security.redact_secrets 功能默认开启,会在工具输出中自动扫描并脱敏 API Key 样式的字符串。不要关闭它。
按需加载工具(2026-08)¶
Hermes 的 tool_search / tool_describe / tool_call 支持延迟加载工具(firecrawl、codegraph、flowix 等 MCP 工具非常驻)。对 secret-management 的意义:工具面越窄,凭据暴露面越小——不需要的工具不加载,MCP 工具的 API Key 不随会话常驻。