Agent 转发的便利与代价
开启 agent 转发后,本地 ssh-agent 的套接字会随会话转发到远端,远端进程可以通过它借用本机私钥完成进一步跳转,本机私钥本身从不离开本地。方便之处是跳板机上不必存放私钥;风险在于跳板机一旦被控制,攻击者无需复制任何文件,就能借用同一把私钥访问后续主机,横向移动几乎不留文件痕迹。取证时要判断这台主机是否允许转发,以及是否出现过带转发参数的会话。
基本信息
| 客户端 | ssh -A,或 ssh_config 中 ForwardAgent yes |
|---|---|
| 服务端 | AllowAgentForwarding(默认 yes,可整机关闭) |
| 单键限制 | authorized_keys 中加 no-agent-forwarding 或 restrict |
| 痕迹来源 | 进程命令行参数、/tmp/ssh-*/ 下的套接字目录 |
典型使用场景
- 确认跳板机是否允许转发,评估横向移动风险
- 从进程命令行中找出使用了 -A 的会话
- 检查管理员是否用 restrict 或 no-agent-forwarding 做过加固
- 分析套接字目录的残留时间,推断会话存活时段
- 加固整改时评估关闭转发对现有运维流程的影响
痕迹检索
痕迹检索
ps -eo pid,user,lstart,args | grep '[s]sh -A' | head # 找带转发参数的会话
ls -la /tmp/ssh-* 2>/dev/null | head # 套接字目录,重启后消失
grep -R 'AllowAgentForwarding' /etc/ssh/sshd_config* 2>/dev/null # 服务端是否放行
grep -n 'no-agent-forwarding\|restrict' ~/.ssh/authorized_keys 2>/dev/null | head # 单键加固痕迹
sshd -T 2>/dev/null | grep -i agentforwarding # 查看实际生效值痕迹来源读法
| 痕迹 | 位置 | 判读要点 |
|---|---|---|
| 命令行参数 | 进程列表中的 -A | 进程存活期才能看到,需及时采集 |
| 套接字目录 | /tmp/ssh-* | 目录存在时间反映会话存活区间 |
| authorized_keys | no-agent-forwarding 等选项 | 反映是否做过加固 |
| 服务端配置 | AllowAgentForwarding 值 | 判断转发在全机层面是否可行 |
转发本身不产生独立的认证日志,只能从进程参数与套接字残留判断;这些痕迹随会话结束与主机重启消失,现场采集要第一时间执行。
转发会话中,远端 root 可以在会话存活期内通过套接字使用转发来的密钥,且不留下认证到跳板机的记录,审计时容易漏判。
服务端允许转发并不代表转发真的发生过:是否启用还取决于客户端会话是否带转发参数,两者要结合判断,只看服务端配置会把风险面评估得过高。