上方本地、跳板、目标路径保持目标认证从本地发起;下方远端套接字与本地代理交换请求和签名。

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 的输出理解成整条路径的所有设置。 ...

二月 9, 2028 · 1 分钟 · XB Field Notes
客户端与代理交换签名请求和签名;独立服务端方块表示另行授权决定,没有私钥导出路径。

ssh-agent 在会话期间替你记住已解密的密钥

SSH 代理为公钥认证提供签名操作。对于普通软件密钥,加载加密私钥时会解锁相关材料,此后代理便可以使用它,不必每次连接都重新询问文件口令。正常代理协议向客户端返回公钥身份和签名,而不是导出私钥。硬件支持的身份有所不同:私钥可以一直保留在认证器里,并要求触摸或用户验证,不能把所有代理身份都描述成完整私钥必然存放在代理内存中。 套接字提供的是服务访问能力 OpenSSH 通常通过 SSH_AUTH_SOCK 查找代理,但客户端配置中的 IdentityAgent 可以选择另一个套接字,也可以关闭代理使用。知道路径并不等于有连接权限。套接字和父目录的权限都重要;root 以及与用户同身份运行的其他进程,则是需要考虑的威胁。环境变量本身不能代替操作系统隔离,隐藏路径也不是可靠的保护边界。 能够访问代理,并不保证每个签名请求都会成功。密钥约束、确认要求、硬件在场和协议限制都可能拒绝请求。即使签名成功,远端服务器也不必接受这把密钥或授予权限。因此,本地签名能力与服务端授权决定应分开观察。诊断“代理里有钥匙但登录失败”时,不能只停留在身份列表这一层。 同时限制身份与委托 ssh-add 加载身份,并在需要时询问文件口令。但 ssh 的 AddKeysToAgent 等配置路径也能加载身份,不能说只有 ssh-add 才可能解锁。代理避免反复读取加密私钥文件,却不保证交换空间、转储、备份或其他进程中绝不存在私钥材料。操作系统与密钥存储策略仍然需要独立审阅,代理不是整台机器的保密证明。 -t 为添加的身份设置存活期限。到期后身份会被移除,这个参数不只是提醒;代理也可以提供默认期限;两种期限都没有时,普通身份才可能一直留到显式删除或代理退出。移走、删除或者替换磁盘文件,并不会自动替换代理里已经加载的副本。轮换时应检查实际使用的指纹,而不是只确认文件名已经改变。 -c 通过 ssh-askpass 要求确认。决定是否批准的是辅助程序是否成功退出,而不是远端主机有没有终端。需要验证本地确认机制确实能工作,并拒绝意外请求。确认可以减少无人值守的使用,但仍需理解提示所代表的主机和操作,不能看到弹窗就习惯性通过,也不能把没有远端终端当作必然拒绝的证据。 OpenSSH 8.9 引入的目的地约束使用主机密钥进一步限制允许的认证路径。经过转发时,客户端与服务端都需要支持相关协议,已知主机信息也必须正确识别目标。恶意中转节点仍可绕开协作式 SSH 再次中继套接字,但签名仍受获准目的地限制。这不是防火墙;依赖约束前应核对兼容性、保持更新,并理解主机密钥变化对路径的影响。 坏掉的样子 代理转发允许远端在转发通道存在期间中继签名请求。那里的管理员或被入侵进程可能使用这份能力,而不需要提取私钥。没有必要时应避免转发,并查看客户端最终生效的配置;命令行没有 -A,不足以证明配置文件没有开启它。风险在于签名委托,不在于私钥文件一定已经复制到远端。 从代理删除身份,并不会撤销已经被复制的私钥、删除服务器 authorized_keys 中的条目,也不保证关闭已建立的 SSH 会话。反过来,服务端撤销授权可能阻止新登录,即使代理仍保存这把钥匙。恢复计划应分别处理受影响的副本、授权记录和活动会话,而不是把其中一个动作误当成全部撤销。 现代 OpenSSH 代理还限制远端加载提供方和部分 FIDO 签名用途,但识别远端客户端依赖协作式 SSH 转发;这些机制可减少把转发认证器用于 SSH 之外的特定风险。这些保护不是公开套接字或随意放宽选项的理由。不同版本和平台集成的默认值、套接字位置可能不同;排查时应阅读当前实现的文档,不能把某次输出的路径和权限数字当成永远成立的协议常量。 ...

二月 27, 2027 · 1 分钟 · XB Field Notes
可信所有者或控制台提供的参考指纹,与当前观察到的服务器主机指纹一起进入安装前比较。严格检查下,已知且匹配的密钥通过主机身份检查;未知或变化的密钥被拒绝。

SSH 主机密钥是部署记录的一部分

记录期望的指纹,使用斟酌过的 StrictHostKeyChecking 策略,并把变化当作事故来对待。

七月 28, 2026 · 1 分钟 · XB Field Notes
指纹式密钥符号分支连接负责人、账号与操作、退役,表示访问清单而非安全徽章。

SSH 密钥卫生,主要是限制密钥能干什么

SSH 密钥卫生首先要回答:哪份凭据授予什么访问,谁负责,以及如何结束这份授权。密钥注释方便维护清单,却不是经过认证的所有者记录,更不是授权规则。应把指纹与负责人、目标账号、允许操作和移除计划对应起来。生成现代密钥只是开始,不能用一条生成命令代替完整的访问生命周期管理。 限定服务端权限 authorized_keys 中的公钥通常用于授权访问某个账号,同时还受服务器其他控制约束。自动化任务应结合权限有限的账号和经过选择的选项。强制命令能限制执行的操作,from 可以限制来源地址,但二者都不会自动把进程关在某个工作目录,也不会让一个会拼接不可信命令的包装脚本变得安全。 restrict 禁用转发、伪终端分配和 ~/.ssh/rc,但显式搭配选项可以重新启用个别功能;它本身并不禁止 shell 或命令执行。因此,无人值守任务通常还需要谨慎实现的强制命令。no-agent-forwarding 只禁止代理转发,不能证明密钥没有普通 shell 权限。principals 对可信证书颁发机构条目有专门含义,并不是加在任意普通公钥前面就能形成通用身份约束。 还要审阅最终生效的服务端配置和其他授权来源。AuthorizedKeysCommand、证书颁发机构、账号权限和 Match 规则,都会让结果超出单个文件的内容。清单工具看到选项名时应报告观察事实,不能直接给出“已限制,所以安全”的结论。来源限制也取决于服务器实际看到的地址,包括代理、跳板机或地址转换后的来源,不能只按客户端想象的拓扑解释。 区分密钥类型与签名算法 RSA 公钥行仍使用 ssh-rsa 类型标签,即使认证时采用 rsa-sha2-256 或 rsa-sha2-512 签名。OpenSSH 8.8 默认禁用的是使用 SHA-1 的 ssh-rsa 签名方案,而不是所有 RSA 密钥。应检查密钥长度与实际支持的签名算法,不能只凭一行的第一个词就把所有 RSA 条目判成过时。DSA、弱参数和不受支持的配置,需要各自的迁移计划。 新凭据应选择当前环境支持的算法和合适的保护。口令可以保护加密私钥文件,避免文件被复制后立刻就能使用;硬件密钥则提供不同的边界。它们都不能代替安全工作站、受控代理访问和服务端权限限制。无法交互输入口令的自动化,需要明确的凭据保管和更新设计,不能简单地把“没有提示”当成设计完成。 坏掉的样子 只追加新公钥的轮换,会让旧凭据继续得到授权。应从所有相关来源移除退役条目,验证替代凭据,并单独处理现有会话。普通裸公钥不会自动携带到期机制;需要通过支持的服务端选项、SSH 证书或明确的生命周期操作执行过期。在注释里写一个日期不会产生任何强制效果,负责人离职也不会自动让那一行失效。 权限数字需要准确解释。私钥应限制为所有者访问,常见模式是 0600;私有目录常见模式是 0700。authorized_keys 的公钥内容并不是秘密,在所有权和写保护满足检查时,0644 也可能被服务器接受。采用更严格的 0600 策略合理,却不能声称每个其他模式都证明已经泄露。ACL、父目录和平台规则仍需分别核对,简单的模式检查并不涵盖全部访问路径。 ...

七月 6, 2026 · 2 分钟 · XB Field Notes