跳转到内容

Federation 连接多棵树

Federation 用 remote 节点把另一套 HTBP 服务挂成本地子树。调用方仍使用本地 BaseURL 与本地 SK;网关以节点专用的远端 SK 访问上游,因此它是受控的服务账号代理,不是任意 URL 转发器。

适合跨团队、跨环境组合多棵 HTBP 树,同时保留各自管理权与凭证边界。

不适合把普通 REST/MCP URL 当 remote:remote 目标必须理解同形 ~help~tree 和调用契约。也不适合希望“本地用户身份自动传到远端”的场景;本地 SK 明确不会透传。

  1. Host allowlist:空列表拒绝全部 remote;管理员必须先允许目标 host suffix;
  2. 远端专用 SK:保存进本地 SecretStore,由 remote 节点 skRef 引用;
  3. 本地路径权限:创建者需要目标路径 register,使用者需要本地 remote 路径的 read/call

远端仍会用专用 SK 做第二层授权,所以本地 allow 不会绕过远端 deny。

开始前应理解权限、SK 与可见性以及密钥、出站身份与安全边界;Federation 的 skRef 绝不能替换为本地调用者 SK。

Terminal window
tb federation ls
tb federation add team-b.example.com
tb federation ls --json

传入的是裸 host suffix,不含 scheme、端口或路径。team-b.example.com 可以匹配其子域,但不会匹配 notteam-b.example.com

tb federation ls 合并两类来源:

  • source: env:部署期基线,不可通过 API 删除;
  • source: store:运行时添加,可用 CLI 删除。

在远端网关签发只允许所需子树和动作的 SK,然后写入本地 SecretStore:

Terminal window
tb secret set --name team-b-sk < team-b.sk

不要使用远端 Admin SK,也不要把本地调用者 SK 存为远端身份。remote 的出站权限应小于等于该挂载实际需要的能力。

Terminal window
tb server add teams/team-b \
--remote-url https://tb.team-b.example.com \
--sk-ref team-b-sk \
--description "Team B 工具树"

--base-url 始终表示 CLI 当前访问的本地网关;远端地址只能用 --remote-url。绑定 skRef 需要调用者对 system/secretadmin,防止受限注册者借用平台已有高权限凭证。

Terminal window
tb server ls
tb tree teams/team-b --depth 2
tb help teams/team-b
# 将 tools/search 替换为远端 ~tree/~help 返回的真实相对路径
REMOTE_TOOL_PATH=tools/search
tb help "teams/team-b/$REMOTE_TOOL_PATH"

再完成一次远端只读调用。成功证据包括:

  • 本地树把远端路径正确加到 teams/team-b 前缀下;
  • 远端 ~help 的 command path 没有逃逸挂载节点;
  • 本地只读但无 call 的 SK 能发现、不能调用;
  • 本地无 read 的 SK 得到 404;
  • 远端专用 SK 无权限的能力即使本地允许也不能访问;
  • 日志只记录 actor、节点、skRef 名称和目标,不记录 SK 明文。

随后按~help 到调用完成一次最小、只读的真实远端调用。

  • 生产 remote 默认要求 HTTPS;
  • 注册时和调用时都会检查 allowlist,防止配置漂移后继续访问;
  • 本地 Bearer 不进入出站 Authorization;
  • skRef 无法解析时返回不可用,不会匿名访问;
  • X-TB-Via 用于环检测和跳数上限;
  • 远端返回的路径、树和帮助都按不可信协议数据校验;
  • ~tree 和 MCP 投影有深度、节点、远端请求预算,不能无限递归。
现象 处理
remote baseUrl 不在白名单 先用 tb federation add <host>,并确认 suffix/端口写法
HTTP URL 被拒 生产改用 HTTPS;本地开发例外必须由部署者显式开启
skRef 无法解析 Secret 不存在、主密钥不可用或名称错误;不要去掉 skRef 匿名重试
本地 404 当前本地 SK 没有该路径 read,或远端路径不存在
本地 403 可见但没有本地 call
远端拒绝 专用远端 SK scope 不足、过期或已吊销;在远端处理
unavailable 提到环/跳数 检查 remote 拓扑和实例标识,不要无边界增加跳数
树能展开但 MCP discovery 失败 联邦子树超过 MCP 的远端发现预算;缩小挂载/权限或直接使用 HTBP

先卸载 remote 节点,停止本地新流量:

Terminal window
tb server rm teams/team-b
tb server ls

如果没有其他 remote 使用该 host,再删除运行时 allowlist:

Terminal window
tb federation rm team-b.example.com

env 基线无法用 API 删除,需要修改部署配置并重新部署。最后确认没有其他节点引用远端凭证,再删除本地 Secret,并在远端吊销对应 SK:

Terminal window
tb secret rm team-b-sk

该顺序让每一步可验证,避免先删远端 SK 导致本地节点长时间处于模糊故障状态。

  • 远端只是 MCP server:改用MCP 挂载
  • 远端只是 REST API:使用HTTP 工具
  • 想让 MCP 客户端消费联邦后的可见能力:配置本地 ~mcp,但注意动态清单和发现预算;
  • allowlist 与 remote 命令精确行为以目标实例 tb help system/federationtb server --help 为准;
  • 遇到双层 403/404、环或跳数错误:进入故障排查与升级