Janee 安装指南:安全的 API 密钥管理,适用于 OpenClaw、Claude 和其他 AI 代理

发布: (2026年2月11日 GMT+8 15:08)
11 分钟阅读
原文: Dev.to

Source: Dev.to

AI 编码代理正在改变软件开发。Claude DesktopCursorCline 等工具可以编写代码、调试问题,甚至代表你发起 API 调用。

但这存在一个问题:如何在不牺牲安全性的前提下为这些代理提供 API 访问权限?

常见的做法——在配置文件或提示中粘贴 API 密钥——风险很大:

  • 密钥以明文形式存储在磁盘上
  • 代理可以读取 .env 文件
  • 没有访问审计记录
  • 无法在不更换密钥的情况下撤销访问权限
  • 只需一次提示注入,即可获得完整的 API 访问权限

本指南将展示如何使用 Janee——为 AI 代理工作流设计的本地密钥管理器,来解决这些问题。

Janee 是什么?

Janee 是一个 MCP(模型上下文协议)服务器,它在你的机器上加密存储 API 凭证,并充当安全代理。

工作原理

  1. 存储 API 密钥于 ~/.janee/config.yaml(静态加密)。
  2. 运行 janee serve 启动 MCP 服务器。
  3. 你的 AI 代理通过 MCP 连接 到 Janee。
  4. 当代理需要调用 API 时,它会通过 Janee 请求访问
  5. Janee 在服务器端 注入 真正的密钥,发起请求,并 记录 所有操作。
  6. 代理接收 API 响应,从未看到 你的实际密钥。

关键优势

✅ FeatureDescription
加密存储密钥使用 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
  • 认证类型(bearerbasichmac‑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

  1. 打开 Settings → Extensions → MCP
  2. 粘贴上面的相同 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 将会:

  1. 从 Janee 的 MCP 服务器发现 execute 工具。
  2. 调用 execute,使用能力 stripe,方法 GET,路径 /v1/balance
  3. Janee 解密你的 Stripe 密钥,发起请求并记录日志。
  4. 将余额数据返回给 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 的请求

规则评估方式

  1. 拒绝规则 优先检查 —— 明确的拒绝始终获胜。
  2. 允许规则 接着检查 —— 必须匹配才能继续。
  3. 未定义任何规则全部允许(向后兼容)。
  4. 若已定义规则但 没有匹配 → 默认 拒绝 请求。

示例服务与能力配置

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/*]

回顾

  1. 安装 Janee 全局 (npm i -g @true-and-useful/janee)。
  2. 初始化 (janee init) 并添加你的服务 (janee add)。
  3. 定义 具备适当 TTL 和请求规则的能力。
  4. 运行 janee serve 并配置你的 AI 代理使用 MCP 服务器。
  5. 提示 你的代理执行 API 调用 —— Janee 负责处理密钥、日志和策略执行。

现在你拥有一种 安全、可审计且基于策略 的方式,让 AI 编码代理访问你的 API,而无需暴露原始密钥。祝编码愉快!

Janee 快速参考指南

核心命令

操作命令
列出活跃会话janee sessions
撤销会话janee revoke <id>
实时查看审计日志janee logs -f

策略建议

  1. 使用特定能力 – 不要授予宽泛的访问权限。
    示例: stripe_readonly, stripe_billing, stripe_admin

  2. 设置合适的 TTL

    • 探索性工作: 1–2 小时
    • 敏感操作: 5–15 分钟
  3. 启用 requiresReason – 对于敏感服务,代理必须提供理由(记录在审计日志中)。

  4. 使用请求规则 – 默认 拒绝;显式 允许 仅所需的操作。

  5. 监控审计日志 – 定期查看 janee logs 以了解访问情况。

  6. 定期轮换密钥 – Janee 让此过程变得简单;更新一次配置,所有代理都会获取新密钥。

  7. 备份配置 – ~/.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

您已获得的收益

  • 加密凭证存储
  • 零知识代理(它们永不看到您的密钥)
  • 完整审计日志
  • 策略执行
  • 所有代理统一配置

下一步

  1. 添加更多服务(janee add
  2. 试验请求策略
  3. 为所有代理工具设置集成
  4. 监控审计日志(janee logs -f

资源

  • 文档:
  • GitHub:
  • 问题 / 支持:

如果你觉得这有帮助,请在 GitHub 上给 Janee 点个 ⭐!

0 浏览
Back to Blog

相关文章

阅读更多 »