摘要

  • FRID 是服务器生成的假名 NAI,用来选择既有 EAP-IKEv2 安全上下文。查到记录不表示提交该字符串的一方掌握上下文密钥。
  • 快速重连仍须用旧上下文验证受保护的消息 3 与消息 4,交换新 SPI 与新 nonce,并在成功后导出新的 MSK/EMSK。EAP-Success 之后还有 AAA 授权、安装、流量与服务证据。

一次复盘从缺失记录开始。认证服务器留下 EAP-Success,AAA 平台也有允许结果,但接入设备没有密钥安装回执,链路上没有首个受保护数据包。若把“认证成功”当作“服务成功”,故障会被错误地归给用户或应用。

RFC 5106 是 2008 年发布的 Experimental EAP 方法。完整运行中,EAP 服务器担任 IKEv2 发起方,对端担任响应方。双方协商算法、交换 nonce 与可选的 Diffie-Hellman 材料,并在受保护载荷中分别验证身份与 AUTH;成功后才产生 EAP-Success、MSK 与 EMSK。

服务器可在成功运行里发送 Next Fast-ID(NFID)。其中的 Fast-Reconnect-ID(FRID)采用 NAI 格式:用户名部分被假名化,realm 保留给 AAA 路由。服务器生成该值,并保存到永久身份与安全上下文的映射。

所以 FRID 是索引,不是凭据。随机、唯一的用户名部分可减少关联和冲突,但不能替代密钥证明。RFC 也不保证下一次请求会到达生成假名的同一台服务器;运营方可集中共享映射,否则收到未知假名的服务器可以要求永久身份。

对端只有在上一次成功运行收到 NFID 后,才能用相应 FRID 请求快速重连。服务器查到上下文后,仍按本地政策选择快速路径或完整路径。对端即使发送了 FRID,也必须能处理完整运行的消息 3。frid_presented、context_mapped 与 fast_path_selected 是三个不同事件。

真正的证明发生在快速重连消息 3 与 4。它们使用上一次成功上下文的密钥加密并保护完整性。服务器必须给 proposal 选择新的非零 SPI,并产生新鲜 Ni;若携带 KEi,也必须新鲜。对端验证消息 3,选择自己的新 SPI 与 Nr,再保护消息 4。服务器只有在正确解密并验证消息 4 后,才能认为运行成功并发送 EAP-Success。

这条链说明为什么查表绿灯过早。攻击者可能知道 FRID,却没有旧上下文密钥;缓存可能返回过期记录;两端可能处于不同密钥世代。以上情况都能在后续完整性验证中失败。查表仅选定要尝试的状态。

成功重连会产生新状态。SKEYSEED 结合旧 SK_d、Ni、Nr 与可选的新 DH 结果,随后重新生成协议密钥。KEYMAT 的前 64 字节成为 MSK,后 64 字节成为 EMSK。RFC 明确禁止在运行未成功时生成它们。

Session-ID 使用方法类型以及本次 Ni、Nr,因此每次成功重连都有新会话标识。Peer-ID 与 Server-ID 则继承创建上下文的完整运行身份。FRID、主体身份与 Session-ID 不能塞进同一个“identity”字段;它们分别回答查哪个状态、谁曾被认证、这次运行是哪一次。

FRID 更新也有提交边界。服务器可在新运行中发出下一枚假名,但对端可能未能持久保存。服务器应保留最近使用和最近签发的 FRID;若认证没有成功,绝不能覆盖最近一次成功认证关联的 FRID。否则一次未确认更新会删掉双方最后共有的恢复路径。

重放防护依赖密钥世代。成功重连后,旧消息 3 应因验证密钥已经改变而失败。因此日志至少要保存上下文世代、Ni/Nr 摘要、SPI、消息验证结果与成功转换。只保存 FRID 无法区分重传、合法恢复和对旧世代的重放。

身份保密同样有限。用户名被假名化,realm 仍可见;这不是完全匿名。FRID 也不应作为长期跟踪标识散落日志,可用分期摘要进行运维关联。

EAP-Success 是方法层回执。RFC 5247 所描述的密钥框架还涉及其他参与者。AAA 是否授权、authenticator 是否收到并安装材料、受控端口是否开启、首包是否通过、应用是否可用,都需要独立记录。

RFC 5106 明确不支持 channel binding。这意味着方法成功并不证明底层接入网络的全部属性。把它展示成“已接入正确网络”会越过规范给出的证据。

历史算法也要单独判断。2008 年互操作基线包含 1024 位 MODP、3DES 与 SHA-1 时代算法。符合历史 RFC 不等于满足当前密码政策。合规、当前可接受性与实际启用套件应分别记录。

可审计系统应为每次尝试保留 FRID 摘要、realm、收发服务器、映射结果、上下文世代、fast/full 选择、新 SPI、Ni/Nr 摘要、DH 组、消息 3/4 验证、EAP 结果、Session-ID 与密钥句柄,绝不记录原始密钥。随后再关联 AAA 决策、安装回执、首个受保护流量与服务探针。

这样,“成功但无流量”不会成为一句模糊告警。系统能指出是查表失败、上下文错代、完整性失败、nonce 重用、未导出、未授权、未安装,还是安装后没有数据。快速路径缩短交换,却不能缩短证据链。

还要区分“上下文不存在”与“上下文不再可用”。前者可能源于请求落到未共享映射的服务器;后者可能是过期、主动撤销、内存淘汰或密码政策变化。两者都可以触发完整交换,但审计含义不同。若系统为了提高命中率而在没有旧密钥和成功历史的情况下重建同名空记录,就制造了一个只能查到、无法证明的伪上下文。

延迟指标也应沿证据边分解。身份到 lookup、lookup 到 message 3、message 3 到 message 4、message 4 到 EAP-Success 分别代表路由、状态读取、对端处理和密码验证。只优化 lookup 延迟,可能让首页数字变好,却把更多请求推入完整性失败或完整路径回退。真正的 fast 是更快地产生可验证的新会话,而不是更快点亮第一盏灯。

重试需要 attempt ID。相同 FRID 可能出现在同一 run 的网络重传,也可能出现在新的重连尝试。旧 header SPI、proposal SPI、Ni 与上下文世代的组合可以帮助判断。如果只按 FRID 去重,丢包会被当作攻击;如果永不区分世代,真正针对已轮换密钥的 replay 又会被统计成普通重试。

取消或过期也不能只删映射。删除 FRID 行之前,应保留撤销原因、最后成功世代与不可再用时间。这样收到旧值时,系统能回答“未知”“已过期”“已撤销”“落错服务器”中的哪一种,而不是统一返回失败。错误分类本身是运维证据,不应由客户端猜测。

权限模型必须限制谁能读取映射。FRID 虽是假名,但集中表能还原到永久身份;它同时也是会话连续性的敏感索引。认证服务可执行映射,不代表分析平台、客服工具和长期日志都应看到原值。最小权限与可轮换摘要能减少假名被再识别的风险。

当算法政策改变时,已有上下文也要有明确命运。服务器可以按政策拒绝快速路径并要求完整交换,从而重新协商当前允许的 suite。不能因为 FRID 仍可解析,就让旧算法状态无限续命。映射有效、上下文密码学上可用、政策允许重用是三项独立判断。

同样,EAP-Success 的发送与对端实际接收也不是同一事件。服务器日志可以证明它生成并交给传输层,不能单独证明对端处理了结果。若 lower layer 依赖后续 key handoff,必须把 method outcome、transport delivery 与 key consumer acknowledgement 分开,否则最后一个 EAP 包丢失时会出现两端状态分叉。

时间线应采用单调时钟或明确的时钟域。墙上时钟跳变不应让旧 attempt 看起来晚于新 generation。nonce 提供密码学 freshness,时间戳提供运维排序;两者相辅相成但不能互相替代。审计记录要说明时间源,而不是把日期当作防 replay 证明。

容量规划也应保护最后成功状态。清理任务若只按最近访问时间删除旧 FRID,可能正好删掉客户端仍持有的恢复值。应把已签发未确认、最近成功、已撤销和已过期分成不同 retention class,并在淘汰前保留可解释的 tombstone。

来源