用户名出现在新目录里,迁移被宣布完成,登录却仍然失败。网关仍然需要一条受支持的认证路径和正确的授权结果,而这两者都不会从一个如今包含这些账号的目录里自动产生。后端迁移是一次带生命周期的切换,而不是复制工作。下面这个症状通常最能揭示两者的差别。

症状:账号存在,会话没有

新目录保存了每一个用户名,测试绑定也能成功,VPN 客户端却仍然返回认证失败。这种组合意味着身份确实存在,但网关使用的验证路径要么到不了它,要么用了它无法满足的方法。两者都是配置问题,而且是不同的问题。

第一种是接线问题:网关指向一个不应答的后端,使用对方并不预期的共享密钥,或者索取新服务不会返回的属性。第二种是密码学问题:该方法需要原始密码,而新存储只保留它的哈希。两种情况下错误文本看起来相似,这也是它们常被当成同一个问题的原因。

在碰账号之前把这两类问题分开,能省下一周时间。一类是路由与信任问题,另一类是重置凭据的决策,混在一起就会产生没人能归因的变更。

在迁移任何人之前先梳理链路

为每个客户端配置写下六件事:外层认证方法、是否存在内层方法、客户端期望的服务器身份、网关与后端之间的接口、网关映射为组成员身份的属性,以及由此产生的资源策略。按顺序读一遍就能看出哪一环没人负责。每一项都有负责人,而切换往往断在没人检查的那一环。

LinkQuestion it answers
Client profileWhich method and server name does the client use?
Inner methodIs there a second authentication step?
Server identityWhich certificate or name must the client accept?
Gateway to backendWhich protocol, port and shared secret?
Attribute mappingWhich returned value becomes group membership?
Resource policyWhat the resulting session may reach

一次普通的目录登录几乎不会经过这条链路的任何一环。它只证明账号存在、密码可用,而这恰恰是从未受到怀疑的部分。

哈希不会在方法之间迁移

凭据兼容性必须在任何人群迁移之前一次性核查。FreeRADIUS 清楚地记录了这一区分:由服务器自己执行的 CHAP 校验需要真实密码,而 MS-CHAP 接受该密码或合适的 NT 材料。为其他用途生成的哈希两类都不满足,无论它多强。

区别在于谁来计算证明。通过绑定目录来验证的方法,让目录去检查它能检查的东西。通过重新计算挑战响应来验证的方法,需要密码本身,因为服务器必须执行同样的计算。

在材料缺失的地方,诚实的选择是受支持的重置、重新注册、外部验证服务或更换方法。临时导出可恢复的密码不在这个清单上。它会在项目最混乱的一周里造出一个明文凭据库,而且通常比迁移本身活得更久。

试点人群,然后是生命周期变更

用真实客户端迁移一小批已批准的身份,并测试四件事:全新登录、故意错误的凭据、会话可以访问的资源,以及会话不应访问的资源。还要检查客户端接受的服务器身份,因为证书名称不匹配在有人读取客户端日志之前是看不见的。

然后演练部署真正依赖的变更。修改一个密码、续期或重新注册一张证书,并撤销一个试点账号的访问权。每做一项都要确认是哪个验证器处理了这次尝试,因为切换之前建立的会话可能继续工作,却完全不能说明下一次登录。

把配置文件下发与身份切换分开。每个试点人群都需要预期的配置文件、其凭据或注册状态、应当使用的认证服务以及一名支持联系人,而这些记录都不应包含密钥。

如果新旧路径并存,就用一个截止日期约束它们。自动回退可能在新负责人撤销访问之后,仍让账号通过旧凭据进入,那是一种伪装成可用性的安全退化。

回滚无法恢复凭据

把切换倒回去,目录仍然停留在现在的状态。被重置的密码仍是重置状态,被吊销的证书仍是吊销状态,被更改的凭据格式仍是更改后的格式。这些是目录里的事件,网关从来不是它们的源头。恢复必须按事件分别定义,而且任何一部分都不能依赖从不兼容的哈希里重建密钥。

保留一条不使用被迁移连接的管理路径。当新认证失败时,暂停该人群并使用其成文的恢复路径,而不是为了赶一个期限而削弱所有人的认证。

在人群覆盖完成后,通过各自的负责人退役旧后端的凭据、配置文件和信任关系。确认旧路径不再放行用户,并保留支持团队仍然需要的、不含密钥的身份到策略映射。迁移的完成标准是新生命周期正常工作、再没有人能从旧路径进入,而不是账号列表看起来完整。

相关文章