SSH 代理转发的权限边界
agent 转发并不等于 agent 本身。本地 agent 可以替客户端完成认证操作,而不把私钥交给服务器;转发则进一步在远端开放一个套接字,让那边的程序也能请求这项服务。因此,「私钥材料留在本地」和「身份认证能力只留在本地」是两个不同的承诺。 选择堡垒机访问方式时,这个区别尤其重要。如果只是要登录内网机器,通常用 ProxyJump 并关闭 agent 转发就够了。只有程序确实需要在远端发起认证,例如一条经过明确授权的后续 SSH 连接,才需要考虑把 agent 的使用能力交过去。不要把网络可达性和身份委托混成一个开关。 远端拿到的是能力 转发出来的套接字通常通过远端的 SSH_AUTH_SOCK 暴露。能访问它的进程,包括拥有足够权限的本机攻击者,都可以向原始 agent 请求操作。这不意味着服务器上的任何普通账户都有权限,更不意味着私钥文件已经被复制过去;风险来自可以调用身份,而不是必须先偷到密钥。 一把没有额外约束的已加载密钥,在转发通道仍然可用时,可能被拿去完成你没有打算批准的登录。密钥的存活期、逐次确认、目标限制,以及目标服务器是否接受这个身份,都会改变请求能否成功。把它说成「完整拥有私钥」不够准确,把它说成「只是一只无害套接字」同样会误导操作判断。 旧版本曾把一枚没有解释来源的八十八字节签名当作证据。单看长度,既不能证明实验实现了 OpenSSH agent 协议,也不能证明一次经过转发的认证成功。下面改用真正的 SSH 客户端,验证一个范围明确、读者可以复现的性质:最终生效的转发选项。这个检查不冒充真实网络集成测试。 转发由生效配置决定 命令里没有 -A,并不代表关闭了转发。匹配的 Host 段、被包含的配置文件,或者系统配置,都可能已经把它打开。反过来,即使文件写着 ForwardAgent no,命令行上的 -A 仍会显式启用转发。需要关闭时,应当使用 -a,或者没有相互矛盾选项的 -o ForwardAgent=no。 ProxyJump 提供到目标的 TCP 路径,并不会顺便重置目标连接的转发选项。目标 SSH 连接及其认证仍从本地发起,所以单纯借道跳板机不需要把 agent 暴露过去。目标和跳板机的配置也不一定一样,应分别检查相应别名,不要把某一条 ssh -G 的输出理解成整条路径的所有设置。 ...