摘要

  • 经 DNSSEC 认证的 SSHFP 匹配,可以把所呈现 SSH 主机密钥的算法与指纹绑定到一个确定的 DNS owner name;它不证明这个名称就是用户想访问的服务,也不携带端口、用户或命令。
  • 完整决策由名称选择、DNSSEC 状态、算法与摘要精确比较、SSH 私钥持有证明和客户端本地策略共同构成;轮换还必须协调 DNS 缓存与 known_hosts 两套时钟。

正确证明落在了错误对象上

开篇场景没有伪造签名。解析器选出完整名称,验证链认证 SSHFP RRset,服务器用对应私钥签署 SSH 交换数据。缺失的是更早的问题:谁证明 db 应当补成这个名称?

RFC 4255 专门警告非完整名称。若攻击者能注入解析搜索路径,客户端可能被带到另一台主机;标准建议这种情况下先检查本地数据库。DNSSEC 能让答案真实,却不能让问题自动正确。

日志必须分开记录原始参数、规范化名称、搜索后缀或 CNAME 决策、SSHFP owner、目标地址与端口。把它们压成一个“host”,等于删除了权限转移发生的位置。

SSHFP 实际承载什么

SSHFP 是 DNS RR type 44。RDATA 只有公钥算法编号、指纹类型和指纹;owner name 位于记录外层。匹配要求服务器公钥算法与编号一致,并用指定摘要算法对公钥 blob 计算出相同指纹。

比较不能替代 SSH 密钥交换。服务器仍须用主机私钥签署交换材料,证明本次会话中持有私钥。但持有不等于独占:被复制的私钥同样能生成有效签名。

格式中也没有端口、用户名、命令、IP、业务角色和有效期。host.example 的匹配不能独自决定 22 端口、另一个 SSH daemon、跳板机或生产角色是否属于同一权限对象。

Secure 是状态,不是万能批准

RFC 4255 要求:若验证所用 SSHFP 未被可信 DNS 签名认证,就不得依靠该方法信任主机密钥。客户端可本地验证;若委托递归验证器,通往验证器的路径也必须受保护。

Secure、Insecure、Bogus、Indeterminate 不能归并。Secure 表示数据在接受的信任锚下通过验证;Insecure 表示链条确认其未受保护;Bogus 表示本应验证却失败;Indeterminate 表示信任信息不足。

Insecure 下的相同指纹可以是提示,却不获得自动信任。Bogus 不得为可用性而降格。即使 Secure,也只认证被查询 owner 下的 RRset,不认证 DHCP 搜索后缀或名称规范化是否符合人的意图。

更强摘要说“不”时不能向下寻找“是”

IANA 当前登记 RSA、DSA、ECDSA、Ed25519、Ed448,以及 SHA-1 与 SHA-256 指纹类型。登记说明互操作编码,不证明客户端实际支持或启用。

RFC 6594 的关键不是多一个编号,而是负面规则:支持 SHA-256 的实现遇到 SHA-1 与 SHA-256 并存时必须优先 SHA-256;若 SHA-256 不匹配,必须拒绝密钥,不能再用匹配的 SHA-1 兜底。

因此遥测需要保存 owner、密钥算法、指纹类型、计算值和每次结果,不能只写 sshfp=match。

最终分支仍在本地

RFC 4255 允许客户端通过策略安排 SSHFP、本地文件等方法的顺序。当前 OpenSSH 文档显示 VerifyHostKeyDNS 默认是 no;设为 yes 时,匹配 Secure 指纹的密钥会被隐式信任,非安全指纹按 ask 处理;设为 ask 时仍由 StrictHostKeyChecking 决定新密钥确认。

用户与全局 known_hosts、Host/Match、名称规范化、允许的 CNAME 和配置优先级都会改变结果。事故证据应保存实际生效配置,而不是操作者以为加载的文件。

端口与路径在记录之外

OpenSSH 的 known_hosts 维护支持 [hostname]:port,ssh-keygen -r 则按 hostname 生成 SSHFP。这揭示结构差异:本地 pin 可限定端口,SSHFP RDATA 不可。

同一名称下两个端口若呈现不同密钥,应用必须另定策略。经跳板连接时,终点 SSHFP 也不会顺带认证跳板;每条实质 transport leg 都需要自己的主机密钥结论。

轮换有两套时间

RFC 4255 允许用替换 SSHFP 分发新密钥;若本地策略强制 SSHFP,删除记录也可参与撤销。但权威区删除不等于全网缓存立即拒绝。TTL、RRSIG 窗口和客户端本地 pin 各自运行。

稳健轮换先通过受认证登记路径发布新指纹,在关键验证器上观察传播,保持有限重叠,再切换 daemon、移除旧记录,并在缓存到期后验证旧密钥被拒绝。紧急妥协可选择停机,但必须明确记录风险决定。

主机身份不是用户权限

SSH 架构把 transport 层服务器认证与用户认证分开。主机密钥通过,只说明与所选服务器建立了受保护通道;它不接受用户密钥、shell、转发或命令。

自动化若把“SSH 主机已验证”直接变成部署秘密或执行维护的许可,就跨越了最后一道边界。账户、命令、变更范围与幂等性都有独立权限。

保留名词的负面测试

让同一短名在两个搜索路径下解析;分别测试 Secure、Insecure、Bogus、Indeterminate;令 SHA-256 失败而 SHA-1 成功;制造本地 pin 冲突;测试双端口、跳板与复制私钥;最后让主机认证通过、用户与命令认证失败。

每个结果都应点名 owner、状态、信任锚、密钥、端口、连接段、本地策略和后续权限。目标不是一律拒绝,而是不让 pass 更换主语。