Agent 转发把什么带出去了
Agent 转发的机制是:登录到远端后,本地 ssh-agent 的套接字被转发过去,远端进程可以请求 agent 用你的私钥签名。私钥本身没被复制,但「使用私钥的能力」过去了——远端的 root 可以借此登录其他信任这把钥匙的主机,形成横向移动。
基本信息
| 适用平台 | Linux/macOS(OpenSSH) |
|---|---|
| 服务端配置 | AllowAgentForwarding |
| 客户端选项 | ssh -o ForwardAgent=yes|no |
| 基线 | 服务端默认关闭,按需精确开放 |
典型使用场景
- 跳板机场景:确认是否需要转发,多数场景用 ProxyJump 即可替代
- 多级跳转:历史上靠 agent 转发实现链式登录,现代做法是 ProxyJump
- 合规核查:转发能力属于访问控制与凭据保护范围
- 终端排查:客户端默认值不同,需要确认实际生效的设置
关闭与核查
关闭与核查
# 查看配置与最终生效值
grep -Ei 'agentforward' /etc/ssh/sshd_config
sshd -T | grep -i agentforwarding
# 关闭:在 sshd_config 中写入
# AllowAgentForwarding no客户端侧替代方案
客户端侧替代方案
# 单次登录显式禁用转发
ssh -o ForwardAgent=no host
# 跳板链路改用 ProxyJump:认证在本地完成,不把 agent 暴露给中间机
ssh -J bastion app01
# 核查本地配置里是否默认开启
# grep -i forwardagent ~/.ssh/config配置项读法
| 配置项 | 位置 | 含义 |
|---|---|---|
| AllowAgentForwarding | 服务端 | 是否允许本机接受 agent 转发请求 |
| ForwardAgent | 客户端 | 是否把本地 agent 转发到远端 |
| ForwardX11 | 客户端 | 是否转发图形界面连接 |
| ProxyJump | 客户端 | 推荐的跳板实现方式 |
相关防护配套
- 私钥口令短语:转发放大的风险在私钥本身无口令时最直接,先给私钥加口令再谈转发
- agent 套接字权限:远程会话继承的 SSH_AUTH_SOCK 若可被其他用户读取,任何进程都能请求签名
- 会话复用:ControlMaster 复用连接能减少重复认证需求,也就降低了转发的必要性
- 转发范围:确需转发时按目标主机单独设置 ForwardAgent,不要在全局配置里默认打开
风险场景对照
| 场景 | 风险 | 处置 |
|---|---|---|
| 登录他人管理的机器 | 远端 root 可借 agent 完成对其他信任主机的登录 | 服务端关闭转发,改用 ProxyJump |
| 私钥无口令短语 | 钥匙被借用时无需二次验证,操作难以归属到人 | 为私钥设置口令短语 |
| 共享跳板机 | 多用户跳板机把凭据借用面成倍放大 | 跳板机服务端禁用,终端侧同步关闭 |
| 自动化脚本依赖转发 | 直接关闭会让批量任务在夜间整片失败 | 先盘点依赖,改用专用密钥或 ProxyJump |
ProxyJump 在本地完成认证转发,不把 agent 暴露给中间机,是跳板场景的推荐姿势:既能多级跳转,又不额外扩大凭据暴露面。
关闭后依赖 agent 跳转的运维脚本会失败:先盘点使用面再切换,同时检查终端侧(macOS 与部分 Windows 客户端)是否默认开启转发。
核查时以 sshd -T 的输出为准:配置文件里写着 no 但被其他包含文件覆盖的情况并不罕见,只看配置文本容易得出错误结论。
转发限制只解决凭据借用这一类路径:宿主机仍可直连其他主机,网络层隔离与访问控制仍然必需,两者是配合关系。
转发类配置要放在一起看:AllowAgentForwarding 管的是密钥使用能力,X11Forwarding 管的是图形会话转发,两者都属于凭据与数据外泄面,加固时逐项确认而不是只改一个。