当你的 SSH 密钥不再只属于你:SSH Agent 转发的隐性代价

很多人日常用 SSH Agent 转发(-A 参数)跳板登录内网机器,图的是方便——本地密钥不用拷到跳板机,看似很安全。但问题出在转发之后的那段路上。当你启用了 Agent 转发,跳板机上会开一个 Unix domain socket,任何能访问这个 socket 的进程都可以让你的 agent 签名认证请求。这意味着如果跳板机被攻陷,或者上面有个恶意用户拿到了 root 权限,他可以直接通过这个 socket 用你的身份去连接任何你授权访问的机器,而你全程无感知。

更隐蔽的是,攻击者不需要偷走你的私钥文件。他只是"借"你的 agent 做签名,私钥从头到尾没离开过你的笔记本。这就像你把家门钥匙扣在了门外的锁匠窗口——钥匙还在你手上,但任何人都能让锁匠用你的钥匙开锁。

实际攻击链是这样的:攻击者先拿下跳板机,找到 /tmp/ssh-*/agent.* 这样的 socket 文件,然后 SSH_AUTH_SOCK=/tmp/ssh-xxx/agent.xxx ssh target.internal,直接以你的身份登录下一个目标。在大型内网里,一个高权限用户的 agent 转发足以横向移动到大量服务器。

替代方案有几个:用 ProxyJump(-J)代替 Agent 转发,它只在本地建立隧道,不在远端暴露 socket;或者用 SSH Certificate 配合短时效证书,限制横向移动的窗口;再或者直接跳板机上加 AllowAgentForwarding no 从服务端堵死。



#Security