关于 brokre
brokre 是供 AI Agent 和用户调用需密码命令行工具的本地凭据代理。它在终端提示处注入已保存的凭据,避免明文密码进入 AI 上下文或可观察的进程状态。
主要功能
- 01在终端提示处注入密码
- 02包装 PATH 中的任意 CLI
- 03加密凭据保险库
- 04可验证的审计日志
- 05SSH 主机堡垒路由
适用场景
- 01通过 AI 客户端运行已保存的 SSH 或数据库别名
- 02无需复制内网主机密码即可操作堡垒后的主机
- 03查看命令历史并验证审计日志完整性
MCP 相关
本地 MCP 服务提供别名元数据、命令执行、设置和只读审计工具;不会暴露密码、会话令牌或 reveal 操作。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
brokre — AI 安全的凭据代理
English | 简体中文
brokre 是一款面向 AI Agent 和人类的本地凭据代理。将它与 Cursor、Claude Code、Kimi Code、Trae、OpenClaw、Hermes Agent、ChatClaw 及其他支持 MCP 的客户端搭配使用,可运行 ssh、mysql、psql 等命令——密码绝不会进入 AI 上下文、环境变量或 ps 输出。它可以包装**PATH 中的任意 CLI**,而不仅限于 SSH 或 MySQL,并在提示输入密码时注入已保存的密码,不会向 AI 进程、Shell 历史记录或进程环境暴露明文。
由 Techinone(成都同创合一科技有限公司)开发。
0.2.17 新增内容
0.2.17 是当前版本:默认通过 SessionRelay 路由 SSH、支持多跳堡垒机路由、默认仅列出本地项目,并保留现有的一条命令完成 npm 安装 / 自动注册 MCP / 自动升级二进制文件流程。
npm — 安装、自动更新、自动设置 MCP
npm install -g brokre # or: npx -y brokre@latest
| 功能 | 实际效果 |
|---|---|
| 自动注册 MCP | postinstall 会运行 brokre-setup-mcp——仅检测已安装的 IDE,并将 npx -y brokre@latest 合并到每个 IDE 的全局 MCP 配置中。重新运行:brokre mcp setup 或 npx brokre-setup-mcp。跳过:BROKRE_MCP_SKIP_SETUP=1。 |
| 自动升级二进制文件 | 每次启动 MCP 时,将 npm 包版本与 PATH / ~/.brokre/bin/brokre 中的版本进行比较;缺失或版本较旧时,下载对应的 GitHub Release。 |
| 无需 npm 的 CLI | 对于 install.sh 用户,可使用 brokre version / brokre upgrade;安装 IDE 后,使用 brokre mcp setup 注册 MCP。 |
| 支持的 IDE | Cursor、VS Code、VS Code Insiders、Claude Code、Claude Desktop、Trae、Kimi Code、Windsurf、OpenClaw、Codex CLI、Gemini CLI、Hermes Agent、Continue、Zed——详见 packages/brokre-mcp/README.md。 |
推荐的 MCP 配置(自动设置也会应用此配置):
{ "command": "npx", "args": ["-y", "brokre@latest"] }
堡垒机代理 — 集群管理
堡垒机层让 AI Agent 无需将保险库密码复制到上下文中,也无需在笔记本电脑上散落机密,即可操作一台跳板机后面的多台主机。
| 优势 | 实际意义 |
|---|---|
| 单一控制平面 | 注册堡垒机 SSH 别名(b150),从远程 brokre 同步内部别名,并通过 brokre list / MCP brokre_list 管理整个集群 |
| 智能路由 | b150::db、b150::app-01、多跳路由 b1::b2::inner——路由分隔符为 ::;默认通过 SessionRelay 路由 SSH |
| 机密留在堡垒机上 | 路由执行会在跳板机上运行 ~/.brokre/bin/brokre;笔记本电脑只保存元数据和会话门控信息,不保存内部主机密码 |
| 人工门控,适合 Agent 使用 | 堡垒机出站连接需要解锁(TTY、/bastion-auth 或 MCP URL 询问);门控认证不会因管理界面空闲超时而失效,因此长时间运行的 MCP 仍可正常工作 |
| 保障集群安全的默认设置 | 默认仅列出本地项目;明确请求堡垒机发现;使用毫秒级超时和并发上限进行可达性探测;进行循环检测,并在审计中记录 route / bastion 字段 |
| 通过路由执行特权操作 | brokre_exec_elevated 和 sudo / sudo -i 路径可通过堡垒机工作,并支持会话复用和 PTY 加固 |
通过一个入口主机访问 K8s / DB / 批处理集群的典型流程:
brokre bastion enable b150
brokre bastion sync b150 --json # pull inner alias catalog
brokre bastion unlock
brokre list --include-bastions --json # b150::db, b150::worker-01, …
brokre ssh b150::db systemctl status # MCP: brokre_exec with routed alias
对应的 MCP 流程:
{ "binary": "ssh", "args": ["b150::db", "uname", "-a"] }
门控策略(默认与严格)——详见下文的堡垒机门控策略。在执行 brokre bastion set-key 之前,门控处于非激活状态;之后,默认仅对堡垒机出站路径要求解锁;严格模式要求每次执行操作前都解锁,同时仍仅列出本地项目,除非明确请求发现堡垒机。
CLI 安全(核心)
brokre 围绕一条规则构建:密钥不会落入 AI 触及范围,也不会出现在可观测的进程状态中。
| 层级 | brokre 的处理方式 |
|---|---|
不泄漏到环境变量 / ps | 通过 PTY 提示词注入——密码绝不会通过 -p、SSHPASS、MYSQL_PWD 或导出的环境变量传递 |
| 父进程绝不持有明文(Unix) | 保存的密码会在短生命周期的 brokre --internal-injector 子进程中解密,写入 PTY 一次后,子进程随即退出 |
AI 无法执行 reveal | brokre reveal 需要真实的 TTY 和主密码;网页 UI 中不可用,且不会通过 MCP 暴露 |
| 静态加密的保险库 | 每个字段均使用 AES-256-GCM;DEK 使用 OS 密钥环(Linux)或 ~/.brokre/.master_kek(macOS)进行封装,并可选用 Argon2id 揭示密码 |
| 审计 | 位于 ~/.brokre/audit/audit.log 的 HMAC 链式 JSONL;brokre audit list 查询历史记录(仅元数据);brokre audit verify 检测篡改 |
| MCP 边界 | MCP 暴露元数据(brokre_list)、执行功能(brokre_exec、brokre_exec_elevated)、brokre_setup 和只读审计(brokre_audit_list、brokre_audit_verify)——不暴露密码、会话令牌或 reveal |
| 管理 UI | 仅绑定到 127.0.0.1;密码为只写;提供用于查看历史记录的审计日志标签页;会话令牌会显示在你的终端中,绝不会返回给 AI |
| OS 加固 | 禁用核心转储、进行 ptrace 检查(Linux),并可选启用 mlockall——请参阅 docs/HARDENING.md |
完整威胁模型:SECURITY.md、THREAT_MODEL.md。
支持 PATH 中的任意 CLI(通用设计)
brokre 不是一组固定的数据库 / SSH 封装工具。其核心模型是:
brokre <any-cli-on-PATH> [args...]
首次连接:原样运行,在你于提示符处输入密码时捕获密码,并询问是否将其保存为别名。
下次使用时:brokre <cli> <alias> … 会自动注入密码——AI 和脚本只能看到别名。
预设提示词模式适用于常见工具(ssh、mysql、psql、redis-cli、ftp、clickhouse、git、docker、kubectl、sudo 等)。其他所有工具使用通用的 password: / passphrase: 匹配器——无需更改代码。
brokre gsql prod-cluster -c "SELECT 1" # any proprietary CLI on PATH
brokre kubectl get pods # if your cluster CLI prompts for a password
brokre my-internal-tool --host db.internal
按需自定义:
~/.brokre/prompts.toml— 按二进制文件设置提示词正则表达式覆盖项~/.brokre/manage.toml— 在管理 UI 中添加自定义分区(例如 GaussDB、内部工具)
内置管理 UI 标签页(安装了对应二进制文件时可用)包括 SSH、FTP、MySQL、PostgreSQL、Redis、ClickHouse、MinIO——仅为方便使用;PTY 封装器适用于任意 CLI。
安装(优先使用 MCP — 推荐用于 AI)
npm 包 brokre 会通过 stdio 启动本地 brokre mcp 服务,供 Cursor、Claude Code、Kimi Code、Trae、OpenClaw、Windsurf、VS Code 和其他 MCP 客户端使用。
选择安装方式
| 方式 | 最适合 | 安装 | IDE 中的 MCP | CLI 升级 |
|---|---|---|---|---|
| npm(推荐) | AI 用户;希望使用一条命令 | npm install -g brokre | 安装时自动配置(postinstall) | npm + 每次启动 MCP 时自动下载 |
| install.sh / Homebrew | 生产环境;日常使用无需 Node | curl … | bash 或 brew install brokre | 安装 IDE 后运行 brokre mcp setup | brokre version / brokre upgrade |
| 手动配置 MCP JSON | 仅适用于自定义布局 | 已安装 CLI 或 npm | 手动编辑 IDE 配置 | 取决于 CLI 的安装方式 |
推荐的 MCP 配置项(自动配置也会写入此项):
{ "command": "npx", "args": ["-y", "brokre@latest"] }
不使用 Node — 将 MCP 指向原生二进制文件:{ "command": "brokre", "args": ["mcp"] }。
路径 A — npm 一行命令(0.2.8+)
npm install -g brokre
# or without global install:
npx -y brokre@latest
Windows: npm install -g brokre,打开新的终端,然后运行 brokre --version(首次运行时,如有需要会下载原生 CLI)。本地执行 npm i brokre(不带 -g)不会将其加入 PATH。
执行 npm install 时,会自动完成以下三件事:
- MCP 启动器 —
brokre-mcp/npx -y brokre@latest会启动brokre mcp。 - IDE 自动注册 —
postinstall会运行brokre-setup-mcp:仅检测已安装的 IDE(应用、CLI 或实际使用痕迹,不包括空文件夹),并将上述 MCP 条目合并到各 IDE 的全局配置中。此操作可重复执行,不会覆盖其他 MCP 服务。 - 二进制文件自动升级 — 每次启动 MCP 时,如果
PATH或~/.brokre/bin/brokre中的版本早于 npm 软件包版本,就会下载对应的 GitHub Release。
自动设置支持的 IDE
| IDE | 全局配置 |
|---|---|
| Cursor | ~/.cursor/mcp.json |
| VS Code / Insiders | …/Code/User/mcp.json |
| Claude Code | ~/.claude.json |
| Claude Desktop | …/Claude/claude_desktop_config.json |
| Trae | …/Trae/User/mcp.json |
| Kimi Code | ~/.kimi-code/mcp.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| OpenClaw | ~/.openclaw/openclaw.json(mcp.servers) |
| Codex CLI | ~/.codex/config.toml(mcp_servers.brokre) |
| Gemini CLI | ~/.gemini/settings.json |
| Hermes Agent | ~/.hermes/config.yaml(mcp_servers) |
| Continue | ~/.continue/config.yaml 或 ~/.continue/mcpServers/brokre.yaml |
| Zed | ~/.config/zed/settings.json(context_servers) |
| ChatGPT Desktop | (不支持 — 仅支持远程 Connectors UI) |
| Grok Bot | (信息提示 — connectors/plugins;没有 mcp.json) |
重新运行注册(例如,先安装 brokre,之后才安装 Cursor):
brokre mcp setup # via CLI — same logic as postinstall
npx brokre-setup-mcp # via npm
brokre mcp setup --dry-run # preview only
brokre mcp setup --force # overwrite existing brokre entry
跳过 npm install 时的自动注册:BROKRE_MCP_SKIP_SETUP=1。禁用二进制文件自动下载:BROKRE_SKIP_AUTO_INSTALL=1。指定二进制文件:BROKRE_BIN=/path/to/brokre。
使用 npm 方式需要 Node.js 18+。
路径 B — 原生 CLI(install.sh / Homebrew,无需 npm)
curl -fsSL https://raw.githubusercontent.com/Furowu/brokre/main/install.sh | bash
brew tap Furowu/brokre
brew install brokre
版本与升级(CLI 内置功能 — 无需 npm):
brokre version # version, binary path, install type
brokre version --check # compare with latest GitHub release
brokre version --check --json
brokre upgrade # download latest release (curl + tar)
brokre upgrade --check # exit 1 if an update is available
brokre upgrade 0.2.10 # install a specific version
brokre upgrade --force # reinstall even when up to date
如果有更新版本,重新运行 install.sh 也会执行升级。
安装 CLI 后注册 MCP(设置脚本需要 Node,或使用 npx 后备方案):
brokre mcp setup
按 IDE 手动设置(可选)
仅在跳过自动设置或需要项目级配置时使用。
Cursor — 一键安装,或编辑 ~/.cursor/mcp.json:
{
"mcpServers": {
"brokre": { "command": "npx", "args": ["-y", "brokre@latest"] }
}
}
Claude Code — 在 ~/.claude.json 中设置用户级配置,或运行 claude mcp add --scope user brokre -- npx -y brokre@latest。项目级配置:在 .mcp.json 中设置 "type": "stdio"。
更多客户端和环境变量:packages/brokre-mcp/README.md。MCP Registry ID:io.github.Furowu/brokre。
MCP 工具与用法
| MCP 工具 | 用途 |
|---|---|
brokre_list | 默认列出已保存的本地别名;设置 include_bastions=true 可发现路由别名(b150::db),可能需要解锁堡垒机;包含 access/availability/bastion_gate |
brokre_exec | 运行已保存的任意 CLI 别名(binary + args);ssh 支持使用 shell_command 执行远程脚本;ssh + sudo/su 会自动复用提升权限的会话 |
brokre_exec_elevated | 执行远程特权命令(alias、command、mode);默认 session=reuse(空闲超时 10 min) |
brokre_setup | 在浏览器中打开管理界面,供用户添加凭据 |
brokre_audit_list | 查询审计历史记录(仅元数据 — 参数已隐藏) |
brokre_audit_verify | 验证防篡改审计日志链 |
brokre_bastion_policy | 读取或设置堡垒机门控模式(default / strict);返回 key_set、unlocked |
MCP 与 CLI(对 AI Agent 至关重要)
brokre 不能直接替代 ssh / mysql——必须在命令前加上 brokre,才能注入保险库凭据。
| 任务 | MCP(在 IDE 中) | CLI(终端 / 调试) |
|---|---|---|
| 列出别名 | brokre_list | brokre list --json |
| SSH 远程命令 | brokre_exec binary=ssh,args=["prod","uname","-a"] | brokre ssh prod uname -a |
| 任意 CLI | brokre_exec binary=mysql,args=["prod-db","-e","SHOW TABLES"] | brokre mysql prod-db -e "SHOW TABLES" |
| 写入远程脚本 | shell_command="…"(仅限 ssh) | brokre ssh prod sh -c '…' |
| 特权执行 | brokre_exec_elevated command="…" | brokre ssh prod sudo …(MCP 有会话池;CLI 每次都会使用新的 PTY) |
| 添加凭据 | brokre_setup(打开浏览器) | brokre manage --open |
| 首次保存 | 不可用(需要人工 TTY) | brokre ssh [email protected] |
常见错误(AI Agent)
| 错误 | 正确 |
|---|---|
ssh prod uptime | brokre ssh prod uptime |
MCP args=["prod","uname -a"](一个 shell 字符串) | args=["prod","uname","-a"](argv 参数) |
MCP args=["prod","sh -c 'echo hi'"] | shell_command="echo hi" 或 args=["prod","sh","-c","echo hi"] |
直接使用 mysql -h … -p | brokre mysql <saved-alias> … |
brokre ssh alias sudo -n …(sudo-rs 等) | brokre ssh alias sudo … 或 brokre_exec_elevated——绝不要使用 -n |
在 heredoc 中使用 brokre ssh 会吞掉脚本输入 | 升级后,探测命令(test/uname/bash -c)会自动断开 stdin;如需强制断开,请使用 -n/--no-stdin |
brokre ssh alias bash -c 'echo "$1"' _ val(修复此引号问题前,$1 为空) | 将 args 拆分为 bash、-c、echo "$1"、_、val——brokre 会为脚本参数加引号。嵌套引号仍然有效。也可以使用 shell_command 或环境变量 |
对于远程 SSH:别名之后的参数是 argv 片段,而不是一个 shell 命令。简单命令请使用拆分后的参数;复杂脚本请使用 shell_command。
**OpenSSH 远程引号处理:**当连接目标之后有 两个或更多 argv 参数时,brokre 会在调用 ssh 前添加 shell 引号,避免 OpenSSH 将以空格拼接的远程命令拆分(例如包含空格、制表符、引号的脚本)。只有 一个 远程参数时,brokre 会原样保留——例如,brokre ssh host 'cd /tmp && ls' 仍会由远程登录 shell 解析。拆分后的 argv 参数(例如 *.log 或 $VAR)不会在远程展开;请将 glob/变量放入 shell_command 或单个 shell 字符串中。多跳堡垒机路由需要在内层 brokre 中使用此修复;单跳 直接内层 通过本地双重转义即可处理。
stdin / stdout(自动化脚本)
- 根据意图路由:非消费型远程命令(
test、uname、mkdir、bash -c '…'等)会自动断开 stdin(heredoc 中无需-n);消费型命令(cat、tee、tar、dd、mysql、psql、直接运行的bash/sh)会转发 stdin——cat file | brokre ssh … 'cat > path'无需任何额外标志即可正常工作。 - 非上传远程命令默认使用管道模式(stdout 稳定);MCP
brokre_exec始终会断开 stdin。 - 读取 stdin 的自定义工具:
brokre ssh --with-stdin alias /path/to/tool。 - 显式断开:
brokre ssh -n alias cmd、brokre ssh --no-stdin alias cmd。 - 恢复为旧版行为:
BROKRE_SSH_LEGACY_STDIN=1(可选同时设置BROKRE_SSH_AUTO_NULL_STDIN=1)。 - sudo:使用
brokre ssh alias sudo cmd或 MCPbrokre_exec_elevated;sudo-rs 上的sudo -n是非交互式的,brokre 无法注入密码。
MCP 提权会话(sudo / su,Unix)
默认情况下,brokre mcp 会为每个 (alias, mode, user) 复用一个后台提权 shell,因此不会在每次调用时都重新提示输入 sudo 密码。
brokre_exec_elevated(推荐用于提权):
{
"alias": "prod",
"command": "systemctl status nginx",
"mode": "sudo_login",
"session": "reuse"
}
| 字段 | 描述 |
|---|---|
mode | sudo、sudo_login(或 sudo-i)、su |
session | reuse(默认)、new(关闭旧会话并打开新会话)、close(结束会话;传入 command: "") |
user | 仅适用于 su 模式;默认为 root |
启用会话池时,响应除了包含 exit_code / stdout / stderr 外,还会包含 session_reused 和 session_idle_expires_at。session_idle_expires_at 是一个滚动空闲窗口提示,每次调用时都会刷新,并非固定的过期时间戳。使用会话池时,stderr 通常为空。stdout 仅包含远程命令输出——TTY 回显、__BROKRE_* 框架内容和 shell 提示符都会被剥除。
brokre_exec:在 args 中使用 binary=ssh 并搭配 sudo / su 时,会自动使用同一个会话池(始终为 reuse;不支持 session=new|close)。示例:args=["prod","sudo","whoami"]。
编写远程脚本/文件(仅适用于 shell_command、binary=ssh):在 args 中仅传入别名;将完整 shell 脚本放在 shell_command 中(brokre 会规范化为 sh -c)。Brokre 会在 OpenSSH 传输前为包含多个词元的远程 argv 添加引号,使包含空格/制表符的 -c 脚本能够正常传输;单个远程词元则保持不变。不要在 args 中嵌入 sh -c '...',也不要将 printf / 重定向拆分到多个 argv 词元中。对于特权系统路径,请使用 brokre_exec_elevated.command。
{
"binary": "ssh",
"args": ["prod"],
"shell_command": "cat > /tmp/deploy.sh <<'EOF'\n#!/bin/sh\necho ok\nEOF"
}
堡垒机路由的用法相同:args=["b150::db"],并将远程脚本放在 shell_command 中。
SessionRelay 隧道(默认)
brokre ssh b150::db 默认使用 SessionRelay 路径:笔记本通过 SSH 在 b150 上启动 brokre tunnel agent --stdio,然后由 Agent 在堡垒机上运行 brokre ssh db。多跳路由会由每个 Agent 逐跳处理(b1::b2::db 会先在 b1 上启动,然后由 b1 继续处理 b2::db)。内层凭据保留在堡垒机的保管库中;笔记本只转发终端字节。BROKRE_TUNNEL=0 是用于紧急回滚的临时旧版回退选项。
brokre tunnel doctor b150
brokre ssh b150::db uname -a
路由 SSH 的 MCP brokre_exec 响应会包含 tunnel: { mode, active }。TcpForward、端点同步、Manage UI 隧道控制和持久化 tunneld 属于后续阶段。
| 控制项 | 默认值 |
|---|---|
| 空闲后拆除 | 10 分钟 |
| 最长生命周期 | 30 分钟 |
| 单条命令超时 | 120 秒 |
| 变量 | 默认值 | 含义 |
|---|---|---|
BROKRE_MCP_SESSION | 1 | 0 会禁用会话池;改用一次性子进程执行 |
BROKRE_MCP_SESSION_IDLE_SECS | 600 | 空闲超时(秒) |
BROKRE_MCP_SESSION_MAX_SECS | 1800 | 会话最长生命周期(秒) |
BROKRE_MCP_SESSION_CMD_TIMEOUT | 120 | 远程命令超时(秒) |
不支持:不带命令的交互式 sudo -i、vim / top,或与保管库 password 字段不同的 sudo 密码。请参阅 THREAT_MODEL.md T12。
首次连接时,如果保管库为空,brokre 会在浏览器中打开 manage(http://127.0.0.1:56777/?t=…)。会话令牌仅保留在 localhost 上,绝不会返回给 AI。设置 BROKRE_MCP_NO_AUTO_OPEN=1 可禁用自动打开。
| MCP 工具 | 用途 |
添加凭据
安装 CLI 后,管理器会在首次运行时打开(brokre manage --onboard --open)。也可随时运行:
brokre manage --open
或者在首次交互式连接时保存(任何 CLI 均可):
brokre ssh [email protected]
brokre my-tool --host internal.corp
使用(对 AI 安全)
brokre mysql prod-db -e "SHOW TABLES"
brokre ssh prod-bastion uname -a
brokre <your-cli> <alias> [args...]
列出元数据(适用于 AI / 脚本)
brokre list --json # local aliases with reachability status (default probe)
brokre list --no-probe --json # metadata only, skip TCP/SSH probes
brokre list --reachable-only # hide unavailable aliases
brokre list --all --json # compat: show all (same as default unless --reachable-only)
brokre list --no-bastion-discovery # local only — no bastion SSH discovery
注册堡垒机后,brokre list 默认仍仅在本地运行,不会通过 SSH 连接堡垒机,也不会触发堡垒机解锁。只有在确实需要 b150::db 这类路由别名时,才使用 brokre list --include-bastions(MCP:include_bastions=true);此远程发现操作可能需要解锁。
OpenSSH 会话默认注入 ConnectTimeout=5(BROKRE_SSH_CONNECT_TIMEOUT)。可通过 -o ConnectTimeout=N 或环境变量覆盖。堡垒机 RPC(brokre list --include-bastions / 远程列表)的超时时间为 60 秒(BROKRE_BASTION_RPC_TIMEOUT)。远程命令使用 ControlPath=none,因此不会连接到 ControlPersist 多路复用主连接。
跨网络列表继承(堡垒机代理)
适用于跨网络访问——旅行、VPN、公网入口等场景:本地无法访问直接 LAN 别名,但运行 brokre 的堡垒机可以访问这些别名。
前提条件
- 笔记本:
brokre bastion enable b150(b150是已保存的 SSH 别名) - 堡垒机主机在
~/.brokre/bin/brokre运行 brokre(标准安装 /npx路径),并已保存内部别名(例如db)
路由列表
brokre bastion unlock # if bastion key is set
brokre list --include-bastions # includes b150::db (route=b150, access=via_b150)
跨网络时,需要路由别名时使用 --include-bastions。普通的 brokre list 仍仅在本地运行,不会解锁堡垒机,也不会通过 SSH 连接堡垒机。
执行
brokre ssh b150::db uname -a
# MCP: brokre_exec binary=ssh, args=["b150::db", "uname", "-a"]
当两种路径都可用时,列表会同时显示 db(direct)和 b150::db(via_b150)——根据 access 区分。
堡垒机代理(跨网络 / 内网入口)
将任意远程主机上运行 brokre 的已保存 SSH 别名提升为堡垒机代理。密钥保留在堡垒机上;笔记本缓存元数据,并通过 SSH 透传执行命令。
brokre bastion enable b150 # register ssh alias b150 as bastion
brokre bastion set-key # set bastion unlock key (TTY)
brokre bastion unlock # unlock outbound session (TTL, 30 min idle default)
brokre list --include-bastions --json # discover bastion-routed aliases
brokre ssh b150::db uname -a # routed exec via b150 remote brokre
brokre bastion sync b150 --json # fetch alias list from one bastion
- 路由分隔符为
::(别名名称中不能使用:):db(本地)、b150::db(经由堡垒机)、b1::b2::inner(多跳,默认深度 ≤2)。 - 远程 brokre:路由执行会在堡垒机上调用
~/.brokre/bin/brokre(无头 Linux 上使用BROKRE_SOFT_MEMLOCK=1、BROKRE_ALLOW_FILE_KEYCHAIN=1、BROKRE_ROUTED_INNER=1)。交互式命令(例如sudo -i)会自动添加-tt。 - 防护措施:探测并发上限、毫秒级超时、短缓存、循环检测、审计
route/bastion(HMAC v4)。 - 管理界面:
brokre manage的 Bastion 标签页——注册/禁用堡垒机、通过 Web 设置密钥和解锁/锁定、切换严格模式、同步远程别名;非 TTY 环境下仍会自动打开/bastion-auth。审计标签页支持按bastion/source筛选,并显示路由字段。
Bastion 门禁策略(默认模式与严格模式)
Bastion 门禁是在敏感操作前由人工执行的解锁步骤。设置 Bastion 密钥前,门禁处于关闭状态(brokre bastion set-key)。设置密钥后,解锁会建立一个本地 TTL 会话(brokre bastion unlock、TTY 密码短语、管理界面 /bastion-auth 或 MCP 浏览器引导)。
策略存储在 ~/.brokre/bastion/policy.json(strict_mode,默认值为 false)。
| 模式 | gate_mode | 何时需要解锁(必须已设置密钥) |
|---|---|---|
| 默认 | default | 仅限 Bastion 出站操作——路由到 b150::inner 的 exec;通过 SSH/scp/sftp 连接到已注册的 Bastion 别名;当 Bastion 发现功能通过 SSH 连接到 Bastion 时,执行 brokre list / brokre_list。纯粹的本地 exec(例如 brokre ssh lan-db)不需要解锁。 |
| 严格 | strict | 每次 brokre exec / MCP brokre_exec 都需要解锁;仅获取元数据的 brokre list 仍只在本地执行,而 --include-bastions 仍需要解锁。如果配置了 Bastion 密钥,并且希望 Agent 执行操作时有人参与,可使用此模式。 |
示例(默认模式,已设置密钥,会话处于锁定状态)
| 操作 | 是否需要解锁? |
|---|---|
brokre ssh prod uname -a(本地别名) | 否 |
brokre ssh b150::db uname -a | 是 |
brokre ssh b150 uptime(已注册的 Bastion) | 是 |
brokre list --include-bastions | 是 |
brokre list(仅本地) | 否 |
在严格模式下,exec 行操作需要解锁;仅获取元数据的 brokre list 仍只在本地执行,除非使用 --include-bastions,否则不会解锁。
设置门禁模式
brokre bastion strict status # default | strict
brokre bastion strict on # strict — all exec gated; list stays local-only unless discovery is requested
brokre bastion strict off # default — bastion outbound only
| 界面 | 方式 |
|---|---|
| CLI | brokre bastion strict on|off|status |
| 管理界面 | Bastion 选项卡 — 严格模式开关 |
| MCP | brokre_bastion_policy — 读取当前策略,或传入 {"strict_mode": true} / false |
MCP 读取响应包含 strict_mode、gate_mode、key_set、unlocked。列表/exec 响应包含 bastion_gate(required、unlocked_during_call、idle_expires_at)。
解锁会话 TTL(默认值):空闲 30 分钟(BROKRE_BASTION_IDLE_SECS),最长有效期 8 小时(BROKRE_BASTION_MAX_SECS)。解锁状态下,每次调用受门禁保护的操作都会续期空闲时长(CLI、MCP 和管理界面共用 ~/.brokre/run/bastion_session.json)。Bastion 门禁身份验证独立于管理界面会话的空闲超时。禁用 MCP 解锁时自动打开浏览器:BROKRE_BASTION_NO_AUTO_OPEN=1。
显示 / 删除(仅限人工操作,需真实 TTY)
brokre reveal mysql prod-db --field password
brokre rm ssh prod-bastion
审计日志(仅元数据)
brokre audit list --profile ssh --action exec --json
brokre audit verify --json
事件存储在 ~/.brokre/audit/audit.log(采用 HMAC 链式校验)。命令参数统一脱敏为 <REDACTED>。新事件包含 source 字段(cli、mcp 或 manage)。管理界面的审计日志选项卡和 MCP brokre_audit_list 会显示相同的元数据。
管理界面安全性
- 仅限 127.0.0.1;会话令牌显示在终端中
- 密码:仅可创建 / 轮换——无读取 API
- 删除 / 轮换需要显示密码短语(自动保存的记录则输入
YES) - 空闲超时为 15 分钟
架构
┌─────────┐ ┌──────────┐ ┌─────────────┐ ┌────────────┐
│ AI/User │────▶│ brokre CLI│────▶│ OS Keychain │────▶│ Vault File │
└─────────┘ └──────────┘ └─────────────┘ └────────────┘
│
▼
┌─────────────┐
│ PTY + inj. │──▶ any CLI on PATH (ssh, mysql, gsql, …)
└─────────────┘
- 双重加密:每个字段使用唯一的 DEK;分别为
exec和reveal封装。 - 保管库元数据:
profile、name、host_alias、saved_args以明文形式与密文并存(THREAT_MODEL.md T3)。 - SSH 私钥:会话期间使用
0600临时文件 +-i(docs/HARDENING.md)。
预设管理界面分组
二进制文件位于 PATH 时显示的便捷选项卡:
| 分组 | 二进制文件 |
|---|---|
| SSH | ssh、scp、sftp(共用凭据) |
| FTP | ftp、lftp |
| MySQL | mysql、mariadb |
| PostgreSQL | psql、postgres |
| Redis | redis-cli、redis |
| ClickHouse | clickhouse-client、clickhouse |
| MinIO | mc、minio |
路线图
当前: 通用 PTY 包装器 + manage.toml 分组 + prompts.toml 覆盖项。
计划中: 在 ~/.brokre/profiles/ 下提供完整的 TOML 连接器配置文件,并支持按工具设置注入策略。
管道 stdin 和 OpenSSH 共享
- 管道 stdin(
tar | brokre ssh host 'tar xf -'):注入完成后才会转发管道数据。 - OpenSSH 系列(
ssh、scp、sftp):主机匹配时,共享已保存的凭据。首次保存需进行交互操作(TTY)。
开发
cargo test # unit tests in src/ only (no tests/ integration suite in this repo)
cargo clippy --all-targets --all-features -- -D warnings
cargo build --release # binary: target/release/brokre
发布版本在 VERSION 中声明(也反映在 Cargo.toml 和 packages/brokre-mcp/package.json 中)。官方二进制文件和 npm 包由 TechinOne 通过 GitHub Releases 和 CI 发布,不属于此开源代码树。
许可证
MIT — 参见 LICENSE。
Techinone · 成都同创合一科技有限公司
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。