Cerberus密钥路由器
AI代理的安全登录路由器——你的LLM永远不会看到你的密码。
Cerberus KeyRouter是一个MCP(模型上下文协议)服务器,使AI代理能够安全地登录网站。密码存储在Vaultwarden(自托管Bitwarden)中,代理仅使用 {{placeholder}} 令牌——真正的凭据通过Chrome DevTools协议(CDP)在本地注入,从不进入LLM上下文。
问题
当AI代理自动化浏览器时,它们通常需要在上下文窗口中提供登录凭据。这意味着您的密码是:
- 发送给云LLM提供商(OpenAI、Anthropic等)
- 存储在对话日志中
- 可能通过快速注射攻击暴露
Cerberus KeyRouter通过将凭据保存在本地保险库中并在浏览器级别注入它们来解决这个问题——LLM只能看到 {{email}} 和 {{password}} 占位符。
建筑
┌─ Your Machine ─────────────────────────────────┐
│ │
│ AI Agent (OpenClaw, etc.) │
│ │ │
│ │ MCP call: secure_login("GitHub", │
│ │ steps: [ │
│ │ {fill, "#email", "{{email}}"}, │
│ │ {fill, "#password", "{{password}}"}, │
│ │ {click, "#submit"} │
│ │ ]) │
│ │ + Authorization: Bearer │
│ │ │
│ ▼ │
│ Login Router (localhost:8899) │
│ ├─ Route by bearer token → account │
│ ├─ Fetch credentials from account's vault │
│ ├─ Replace {{placeholders}} with real values │
│ ├─ Execute via Chrome CDP │
│ ├─ Clear credentials from memory │
│ └─ Return { status: "ok" } (no passwords) │
│ │
│ Admin Panel (localhost:8899/admin) │
│ └─ Manage accounts, settings, bearer tokens │
│ │
│ Vaultwarden (Docker, localhost:8443) │
│ └─ E2E encrypted password storage │
│ │
│ Chrome (CDP on localhost:18800) │
│ └─ Receives fill/click/type commands │
│ │
└──────────────────────────────────────────────────┘- LLM永远看不到明文密码
- 凭据仅在登录路由器内存中短暂存在
- 所有通信仅限于本地主机
- 多个Vaultwarder账户由独立的保险库支持
特性
- 法学硕士零知识 --密码永远不会进入AI上下文
- Vaultwarder集成 --自托管、E2E加密密码存储
- 多账户支持 --管理多个Vaultwarden帐户,每个帐户都有自己的不记名令牌
- 管理面板 --web用户界面位于
/admin用于帐户管理,具有基于会话的身份验证和密码保护 - API密钥自动检索 -只需提供电子邮件+主密码,API密钥将自动提取
- MCP协议 --可与任何兼容MCP的AI代理配合使用
- 占位符图案 —
{{email}},{{password}},{{totp}} - 填充和键入操作 —
fill对于标准形式,type(逐个键)用于React/SPA网站 - 智能标签匹配 --通过URL和CSS选择器检测找到正确的浏览器选项卡
- 双层保护 --标准模式(自动解锁)或高级模式(手动解锁+电报批准)
- 电报集成 --解锁事件、带有确认码的批准请求和登录执行结果的实时通知
- 移动友好审批页面 —
/approve用于在移动中解锁保管库和批准登录请求的页面 - 加强安保 --速率限制、URL验证、审计日志记录、承载令牌身份验证
- 审计日志 --web用户界面位于
/audit查看所有登录尝试(不记录密码)
快速开始
先决条件
- Docker&Docker编写
- 启用远程调试的Chrome/Chromium(
--remote-debugging-port=18800) - MCP兼容的AI代理(例如。, 开爪)
1.克隆和配置
git clone https://github.com/DemoJacob/cerberus-keyrouter.git
cd cerberus-keyrouter
cp .env.example .env编辑 .env --只需要一个变量:
VW_ADMIN_TOKEN=your-secret-token-here此令牌用于初始管理员登录和密码重置的回退。
2.启动服务
docker compose up --build -d这将开始:
- 保管员 上
https://localhost:8443--密码保管库 - 登录路由器 上
http://localhost:8899--MCP服务器+管理面板
验证: curl http://localhost:8899/health 应返回 {"status":"ok"}
3.创建一个Vaultwarder帐户
打开 https://localhost:8443 在浏览器中(接受自签名证书)。
- 点击 创建账户
- 设置您的电子邮件和主密码
- 登录并为您的网站添加登录项(名称、用户名、密码、URI)
4.设置管理面板
打开 http://localhost:8899/admin:
- 首次登录 --输入您的
VW_ADMIN_TOKEN从.env - 设置管理员密码 --一个对话框将提示您创建个人密码(最少8个字符)。在此之后,
VW_ADMIN_TOKEN不能再用于管理员登录 - 未来的登录将使用您的新密码
忘记密码? 点击登录页面上的“忘记密码?”链接,输入您的 VW_ADMIN_TOKEN 重置。5.添加您的Vaultwarder帐户
在管理面板中:
- (可选)更新 保管员URL 如果使用自定义域
- 点击 +添加帐户
- 输入您的保管员 电子邮件 和 主密码
- 系统将自动:
- 连接到Vaultwarden并获取您的API密钥 - 启动一个专用 bw serve 过程 - 生成唯一 持有者令牌 用于MCP呼叫
- 复制承载令牌(单击令牌单元格或使用 主控程序 复制即用型MCP配置的按钮)
6.连接您的AI代理
添加到MCP配置中:
{
"mcpServers": {
"cerberus": {
"url": "http://localhost:8899/mcp",
"headers": {
"Authorization": "Bearer "
}
}
}
}7.测试
# Check health
curl http://localhost:8899/health
# List available logins (no passwords shown)
curl http://localhost:8899/mcp \
-H "Authorization: Bearer " \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'管理面板
访问地址: http://localhost:8899/admin.
身份验证:
- 首次登录使用
VW_ADMIN_TOKEN,然后设置个人密码(PBKDF2-SHA256哈希) - 会话持续8小时
- 密码可以随时从设置中更改
- 忘记密码?重置为
VW_ADMIN_TOKEN在登录页面上
特征:
- 设置 --配置默认的Vaultwarden URL、电报通知
- 账户 --添加、测试、重新启动、禁用或删除Vaultwarden帐户
- 持有者代币 --每个帐户都有一个唯一的令牌;单击以复制
- MCP配置 --一键复制即用型MCP JSON配置
- 保护模式 --标准(自动解锁)或高级(手动解锁+电报批准)
- 解锁/锁定 --直接从帐户列表中解锁或锁定高级模式帐户
- bw服务状态 --查看正在运行的帐户
其他页面:
/approve--用于解锁高级模式帐户和批准登录请求的移动友好页面/audit--所有登录尝试的可搜索审计日志
保护模式
每个Vaultwarder帐户都可以配置两个保护级别之一:
标准模式(默认)
- 保险库是 自动解锁 服务器启动时
- 登录请求立即执行
- 最适合低风险客户或开发用途
高级模式
- 保险库保持 锁定 直到通过手动解锁
/approve页面或管理面板 - 每个
secure_login呼叫需要 实时审批 带有4位确认码 - 批准必须在以下时间内完成 50秒 或者请求被自动拒绝
- 最适合敏感账户(银行、金融服务等)
电报通知
配置Telegram(设置中的机器人令牌+聊天ID)后,高级模式帐户将收到:
- 解锁通知 --当保险库成功解锁时
- 申请批复 --当代理人来电时
secure_login,包括保管库项目名称和4位确认码 - 执行结果 --批准后登录是成功还是失败
这创建了一个人在循环中的流程:AI代理请求登录,您在手机上验证请求,在 /approve 页面,然后登录继续。
MCP工具
list_vault_items
返回可用的登录项——仅限于站点名称和用户名, 无密码.
secure_login
执行带有占位符替换的登录序列。
参数:
| 参数 | 类型 | 说明 |
|---|---|---|
vaultItem | string | 要使用的vault项目的名称 |
steps | array | 浏览器操作的有序列表 |
步骤类型:
| 操作 | 描述 | 用例 |
|---|---|---|
fill | 设置值+调度输入/更改事件 | 大多数站点的标准表单 |
type | 按键输入(50ms延迟) | 反应控制组件,SPA |
click | 单击元素 | 提交按钮 |
wait | 等待导航或选择器 | 页面转换,多步流程 |
select | 选择下拉选项 | 选择元素 |
占位符: {{email}}, {{username}}, {{password}}, {{totp}}
多步登录(SPA)
一些网站有多步登录流程。通过拆分为单独的呼叫来处理这些问题:
// Step 1: Enter username, proceed to password screen
{
"vaultItem": "MyBank",
"steps": [
{"action": "type", "selector": "#username", "value": "{{username}}"},
{"action": "click", "selector": "#next-btn"},
{"action": "wait", "selector": "input[type=password]"}
]
}
// Step 2: Enter password, submit
{
"vaultItem": "MyBank",
"steps": [
{"action": "type", "selector": "#password", "value": "{{password}}"},
{"action": "click", "selector": "#login-btn"},
{"action": "wait", "navigation": true}
]
}安全
设计原则
- 密码永远不会到达LLM --只有
{{placeholder}}令牌存在于AI上下文中 - 使用后清除凭据 --注入后立即将内存清零
- 仅限本地主机 --MCP服务器绑定到
0.0.0.0:8899在Docker内部,仅在本地主机上公开 - Vaultwarder E2E加密 --静止的数据被加密;如果没有主密码,则无法读取
- AES-256-GCM加密 --存储的主密码使用自动生成的密钥进行加密(独立于管理员令牌)
- PBKDF2-SHA256管理员密码 --管理面板密码经过310k次迭代,从不以明文形式存储
- 基于会话的身份验证 -管理员API使用服务器端会话(8小时TTL),而不是原始令牌
- 指令序列,而非脚本 --只有预定义的操作(填充/键入/单击/等待/选择),没有任意的JS执行
- 预防占位符注射 —
{{password}}仅允许填写/键入value领域;在选择器中被拒绝
威胁模型
| 威胁 | 缓解 |
|---|---|
| 立即注入以登录钓鱼网站 | Vaultwarden充当隐式满网者;通过CDP进行URL验证 |
| 未经授权的MCP访问 | 每个帐户持有人令牌身份验证 |
| 凭证滥用/重复尝试 | 速率限制(3/min,20/hr)+故障后的冷却 |
| 未经授权登录敏感帐户 | 高级模式:手动解锁+确认码批准,超时50秒 |
| URL欺骗 | 登录路由器通过CDP读取实际浏览器URL,并与vault URI进行匹配 |
| 缺少审计跟踪 | 结构化审计日志记录在 /audit (日志中没有密码) |
| 存储密码泄漏 | 使用AES-256-GCM(自动生成密钥)加密的主密码 |
| 管理面板暴力破解 | PBKDF2-SHA256哈希密码,基于会话的身份验证 |
| 未注意到的凭据使用 | 解锁、批准请求和执行结果的电报通知 |
环境变量
| 变量 | 必填 | 描述 |
|---|---|---|
VW_ADMIN_TOKEN | 是 | 初始管理员登录令牌和密码重置回退 |
所有其他配置(Vaultwarden URL、帐户、承载令牌、电报、速率限制)均通过管理面板进行管理,或在中具有合理的默认值 docker-compose.yml.
路线图
- \[\]Cookie缓存(登录一次,重用会话)
- \[\]支持OpenClaw快照引用ID(以及CSS选择器)
- \[\]多代理框架支持
许可证
该项目根据 GNU Affero通用公共许可证v3.0(AGPL-3.0)。参见 许可证 全文。
- 免费供个人使用、测试和自托管
- 在同一许可证下可以自由修改和分发
- 如果将修改后的版本作为网络服务运行,则必须发布源代码
- 如需商业许可,请联系作者
