Janee 安装指南:安全的 API 密钥管理,适用于 OpenClaw、Claude 和其他 AI 代理
Source: Dev.to
AI 编码代理正在改变软件开发。Claude Desktop、Cursor 和 Cline 等工具可以编写代码、调试问题,甚至代表你发起 API 调用。
但这存在一个问题:如何在不牺牲安全性的前提下为这些代理提供 API 访问权限?
常见的做法——在配置文件或提示中粘贴 API 密钥——风险很大:
- 密钥以明文形式存储在磁盘上
- 代理可以读取
.env文件 - 没有访问审计记录
- 无法在不更换密钥的情况下撤销访问权限
- 只需一次提示注入,即可获得完整的 API 访问权限
本指南将展示如何使用 Janee——为 AI 代理工作流设计的本地密钥管理器,来解决这些问题。
Janee 是什么?
Janee 是一个 MCP(模型上下文协议)服务器,它在你的机器上加密存储 API 凭证,并充当安全代理。
工作原理
- 存储 API 密钥于
~/.janee/config.yaml(静态加密)。 - 运行
janee serve启动 MCP 服务器。 - 你的 AI 代理通过 MCP 连接 到 Janee。
- 当代理需要调用 API 时,它会通过 Janee 请求访问。
- Janee 在服务器端 注入 真正的密钥,发起请求,并 记录 所有操作。
- 代理接收 API 响应,从未看到 你的实际密钥。
关键优势
| ✅ Feature | Description |
|---|---|
| 加密存储 | 密钥使用 AES‑256‑GCM 加密 |
| 零知识代理 | 代理永不看到实际凭证 |
| 完整审计日志 | 每个请求都会记录时间戳、服务、方法和路径 |
| 策略强制 | 控制代理可以访问的 HTTP 方法/路径 |
| 一次配置,随处使用 | 一个配置,所有 MCP 代理均可使用 |
| 开源(MIT) | 完全透明 |
前置条件
- 已安装 Node.js 18+
- 支持 MCP 的 AI 代理(Claude Desktop、Cursor、OpenClaw、Cline 等)
- 您想要管理的 API 密钥(Stripe、GitHub、OpenAI,…)
安装
npm install -g @true-and-useful/janee
验证安装:
janee --version
运行 init 命令来设置你的 Janee 配置:
janee init
这会在 ~/.janee/config.yaml 中创建示例服务。你可以 交互式 添加服务,或通过 命令行参数 添加。
选项 A – 交互式(推荐给初学者)
janee add
Janee 将提示你输入:
- 服务名称(例如
stripe) - 基础 URL(例如
https://api.stripe.com) - 认证类型(
bearer、basic、hmac‑bybit等) - API 密钥 / 凭证
选项 B – 命令行参数
janee add stripe \
-u https://api.stripe.com \
--auth-type bearer \
-k sk_live_xxx
定义能力
能力定义了代理可以对每项服务执行的操作。它们包括 TTL、自动批准和请求规则等策略。
示例:只读 Stripe 访问
capabilities:
stripe_readonly:
service: stripe
ttl: 1h
autoApprove: true
rules:
allow:
- GET *
deny:
- POST *
- DELETE *
- PUT *
示例:Stripe 计费(受限写入访问)
capabilities:
stripe_billing:
service: stripe
ttl: 15m
requiresReason: true
rules:
allow:
- GET *
- POST /v1/refunds/*
- POST /v1/invoices/*
deny:
- POST /v1/charges/* # Can't charge cards
- DELETE *
注意: 策略在服务器端强制执行。即使代理尝试绕过它们,Janee 也会阻止未授权的请求。
启动服务器
janee serve
您应该会看到类似如下内容:
Janee MCP server running on stdio
Config: /Users/yourname/.janee/config.yaml
Logs: /Users/yourname/.janee/logs/
保持此进程运行——Janee 现在已准备好接受来自 MCP 客户端的请求。
与 AI 代理集成
Claude Desktop(macOS 示例)
编辑 ~/Library/Application Support/Claude/claude_desktop_config.json(或您操作系统上的等效路径):
{
"mcpServers": {
"janee": {
"command": "janee",
"args": ["serve"]
}
}
}
重新启动 Claude Desktop。
Cursor
- 打开 Settings → Extensions → MCP。
- 粘贴上面的相同 JSON 代码片段。
OpenClaw(原生插件)
npm install -g @true-and-useful/janee-openclaw
openclaw plugins install @true-and-useful/janee-openclaw
在您的代理配置中启用它:
{
"agents": {
"list": [
{
"id": "main",
"tools": { "allow": ["janee"] }
}
]
}
}
在 Prompt 中使用 Janee
Claude Desktop 示例 Prompt
“你能使用 Janee 检查我的 Stripe 账户余额吗?”
Claude 将会:
- 从 Janee 的 MCP 服务器发现
execute工具。 - 调用
execute,使用能力stripe,方法GET,路径/v1/balance。 - Janee 解密你的 Stripe 密钥,发起请求并记录日志。
- 将余额数据返回给 Claude。
查看审计日志
janee logs
示例输出:
2025-02-11 14:32:15 | stripe | GET /v1/balance | 200 | User asked for account balance
请求‑规则 语法
规则的表达形式为 METHOD PATH。以下是快速参考。
| 规则 | 含义 |
|---|---|
GET * | 允许 所有 GET 请求 |
POST /v1/charges/* | 允许对 /v1/charges/ 及其子路径的 POST 请求 |
DELETE * | 拒绝 所有 DELETE 请求 |
* /v1/customers | 任何方法对 /v1/customers 的请求 |
规则评估方式
- 拒绝规则 优先检查 —— 明确的拒绝始终获胜。
- 允许规则 接着检查 —— 必须匹配才能继续。
- 若 未定义任何规则 → 全部允许(向后兼容)。
- 若已定义规则但 没有匹配 → 默认 拒绝 请求。
示例服务与能力配置
GitHub(只读)
services:
github:
baseUrl: https://api.github.com
auth:
type: bearer
key: ghp_xxx
capabilities:
github_readonly:
service: github
ttl: 2h
rules:
allow: [GET *]
deny: [POST *, DELETE *, PUT *, PATCH *]
您的代理可以读取仓库、问题、拉取请求,但不能创建、更新或删除任何内容。
OpenAI
services:
openai:
baseUrl: https://api.openai.com
auth:
type: bearer
key: sk-xxx
capabilities:
openai:
service: openai
ttl: 30m
requiresReason: true
短 TTL + 需要理由 让您能够监控使用情况并快速撤销访问。
Internal API(非常短的 TTL,手动批准)
services:
internal_api:
baseUrl: https://api.yourcompany.com
auth:
type: bearer
key: internal_xxx
capabilities:
internal_readonly:
service: internal_api
ttl: 10m
autoApprove: false # Manual approval required
rules:
allow: [GET /v1/users/*, GET /v1/analytics/*]
回顾
- 安装 Janee 全局 (
npm i -g @true-and-useful/janee)。 - 初始化 (
janee init) 并添加你的服务 (janee add)。 - 定义 具备适当 TTL 和请求规则的能力。
- 运行
janee serve并配置你的 AI 代理使用 MCP 服务器。 - 提示 你的代理执行 API 调用 —— Janee 负责处理密钥、日志和策略执行。
现在你拥有一种 安全、可审计且基于策略 的方式,让 AI 编码代理访问你的 API,而无需暴露原始密钥。祝编码愉快!
Janee 快速参考指南
核心命令
| 操作 | 命令 |
|---|---|
| 列出活跃会话 | janee sessions |
| 撤销会话 | janee revoke <id> |
| 实时查看审计日志 | janee logs -f |
策略建议
-
使用特定能力 – 不要授予宽泛的访问权限。
示例:stripe_readonly,stripe_billing,stripe_admin。 -
设置合适的 TTL
- 探索性工作: 1–2 小时
- 敏感操作: 5–15 分钟
-
启用
requiresReason– 对于敏感服务,代理必须提供理由(记录在审计日志中)。 -
使用请求规则 – 默认 拒绝;显式 允许 仅所需的操作。
-
监控审计日志 – 定期查看
janee logs以了解访问情况。 -
定期轮换密钥 – Janee 让此过程变得简单;更新一次配置,所有代理都会获取新密钥。
-
备份配置 –
~/.janee/config.yaml已加密,请安全备份。
故障排除
| 问题 | 解决方案 |
|---|---|
| 代理看不到 Janee 工具 | 确保 janee serve 正在运行,并且代理的 MCP 配置指向它。重新启动代理。 |
| “Permission denied” 或 “Capability not found” | 验证配置中的能力名称与代理请求的名称匹配。 |
| 请求被规则拦截 | 检查 janee logs 以查看是哪条规则拦截了请求。调整配置中的允许/拒绝模式。 |
| 密钥未加密 | 当 Janee 读取/写入配置时,密钥会被加密。如果手动编辑 config.yaml,请运行 janee serve 以触发加密。 |
在 Docker / Kubernetes 中运行 Janee
如果您正在为代理容器化,请使用 HTTP 传输:
janee serve --transport http --port 9100
示例 docker‑compose.yml
services:
janee:
build: .
ports:
- "9100:9100"
command: janee serve --transport http --port 9100
agent:
depends_on:
- janee
environment:
- JANEE_HTTP_URL=http://janee:9100
您已获得的收益
- 加密凭证存储
- 零知识代理(它们永不看到您的密钥)
- 完整审计日志
- 策略执行
- 所有代理统一配置
下一步
- 添加更多服务(
janee add) - 试验请求策略
- 为所有代理工具设置集成
- 监控审计日志(
janee logs -f)
资源
- 文档:
- GitHub:
- 问题 / 支持:
如果你觉得这有帮助,请在 GitHub 上给 Janee 点个 ⭐!