详细分析SSH密钥作为Bearer凭证的不可逆风险,提供基于临时证书或权限隔离的安全部署方案,避免将私钥直接暴露给AI Agent环境。
编程那部分基本已经解决了。Agent 可以拉分支、打补丁、写测试、提 PR。但改动最终得落到真实服务器上——重启服务、运行迁移、编辑 nginx 配置——然后自主性就戛然而止了。部署需要 SSH,SSH 需要凭证,没有人会理智到把私钥粘贴到 Agent 的环境中。
这种顾虑是对的,而且值得把它精确地说清楚。SSH 私钥是一种持有者凭证(bearer credential):谁持有那段字节,谁就是你。把它分享给 Agent 不同于分享给同事,因为你无法收回。一旦密钥经过了 Agent 的上下文——环境变量、挂载的文件、配置 blob——你就再也无法证明它没有落到某个日志、转录记录或某个你根本没看过的工具调用里。对于"模型看到我的密钥了吗?"这个问题,唯一诚实的答案是:轮换密钥——在所有信任该密钥的主机上。这就是不可逆性问题,也就是为什么"干脆给 Agent 一个密钥"即使对那些说不清威胁模型的人也觉得不对劲。
粘贴原始密钥。直接路线:把 id_ed25519 扔进 Agent 的配置或环境里,让它自己跑 SSH。除了上述不可逆性问题之外,SSH 密钥没有作用域也没有过期——能部署到 staging 的密钥通常也能在两跳之外读取生产数据库凭证。而撤销意味着轮换,轮换意味着要动每台机器上的 authorized_keys,这意味着你会一直拖着不做。
生成一个长期令牌。部署令牌、PAT、"自动化"凭证,永不过期。这看起来比密钥更卫生,但其实是同样的持有者问题,只是多了几道弯。经验法则:如果撤销一个凭证需要先记得它存在,那它一定会比你创建它的那个实验活得更久。
给 Agent 自己的 root 账户。这个至少展示了正确的本能——一个你可以单独撤销的独立身份。但按常规做法来做(把公钥扔进 authorized_keys 建一个 deploy-bot 用户,然后走人),它没有任何审计追踪。没有任何东西能把 Agent 的命令和其他人的命令区分开,没有任何东西记录它实际做了什么,而凌晨两点出问题的时候,你只能靠 bash 历史和感觉来重建 Agent 的会话。
共同点:在这三种做法里,Agent 都持有一个常驻凭证,可观测性都是事后才想到的。
翻转这个模型。Agent 根本不应该持有凭证。
Agent 发出请求,托管人签署。代理进程持有密钥——或者生成短期证书——并代表 Agent 执行认证。Agent 的环境里没有任何值得窃取的东西:攻陷了这个上下文,你得到的只是通过托管人请求操作的能力,而不是可以从互联网上任何地方冒充你的能力。
作用域是显式的。托管人只能访问你在配置中列出的主机。新增一台主机是一个新的决策,而不是默认行为。
人可以观看。在事情发生的时候实时观看——而不是只在事后复盘。而且记录必须能区分"这是 Agent 做的"和"这是我做的"。
撤销是一个开关,而不是轮换。因为根本没有任何东西被分享过,所以关闭访问权限没有任何代价。
这些都不稀奇——它大致就是有真实基础设施团队的公司已经在用的基于证书的 SSH 的工作方式。一直以来存在的问题是自己搭建太费功夫,所以大多数人都直接跳到上述某种糟糕的做法上。
Termalin 是一个内置 MCP 服务器的 SSH 客户端。你的 Agent——无论是 Claude 还是任何支持 Model Context Protocol 的产品——可以获得 hosts_list、ssh_exec、SFTP 读写和持久会话等工具。认证由 Termalin 完成。
在你的机器上。把绑定的本地服务器注册到你的 Agent:
claude mcp add termalin -- <path>/termalin-mcp
Agent 只访问你在 Settings → MCP 中启用的主机——Agent 访问默认关闭,而且主机清单是用仅 Agent 的认证写入的,所以不会有密码落到磁盘上。认证通过 Termalin 的密钥托管人:你解锁密钥一次,Termalin 代表 Agent 签署。没有 ssh-add,没有 Agent 可读的密钥文件,密钥完全不触碰磁盘。
而且你可以真正观看。Agent 会话作为实时终端标签页运行,观察网格镜像每个打开的会话并排显示,Agent 正在驱动的磁贴会发光。让 Agent 在你已经打开的会话中输入是一个单独的同意开关,不是默认行为。每条 Agent 命令都会在会话录制中标记——录制只捕获输出,从不捕获你的按键——并连同来源设备和 IP 一起写入审计日志。
没有应用在运行。如果你的 Agent 运行在你桌面不在的地方——CI、云沙箱——在 web cabinet 中创建一个 API 密钥,指向托管的 MCP 端点:
{
"mcpServers": {
"termalin": {
"url": "https://termal.in/api/v1/mcp",
"headers": { "Authorization": "Bearer tk_live_…" }
}
}
}
托管端点只访问已注册隧道代理的服务器,而且每次运行都通过短期证书进行认证——同样,没有任何常驻密钥被分发出去。API 密钥本身作用域限定到特定服务器,带有过期时间(30、90 或 365 天),可以随时撤销;托管运行按密钥进行速率限制和时间限制。
无论哪种方式,你想要的那个属性都成立:Agent 可以部署,而且它从未见过密钥。
不要从生产环境开始。先登记一台低风险的机器——staging 服务器、一台玩具 VPS。让 Agent 做一个真实的工作:部署这个分支,tail 日志直到错误出现,修复配置,重启服务。在它工作的时候保持观察网格打开。你在第一个小时学到的——它如何行为、它在什么地方犹豫、它如何处理歧义——决定第二台主机是否被登记。
这就是托管人模式的隐形回报:你可以一次扩展一台主机,因为你采取的每个步骤都是可以撤回的。
Termalin 的 Free 套餐是完整的桌面应用,每个新账户开始时都有 14 天 Pro 试用——下载它,或者从 MCP 文档开始。