通过RADIUS身份validation:MSCHAPv2错误691

我正在通过RADIUS设置validation到Acme Packet Net-Net 3820(SBC)。 事情的会计方面工作得很好,没有问题。 事情的authentication方面是另一回事。 从数据包捕获中我可以看到,访问请求消息实际上正在到达RADIUS服务器,RADIUS服务器开始与域控制器进行通信。 然后我看到通信链回到RADIUS,最后回到SBC。 问题是我得到的响应始终是一个原因码为16的访问拒绝消息(由于用户凭据不匹配而导致身份validation失败,或者提供的用户名与现有用户帐户不匹配,或者密码不正确)。 这可以通过查看安全事件日志来确认,我可以在其中看到事件4625和6273.请参阅以下事件(注意:名称和IP已更改为保护无辜者):

事件ID:6273


Network Policy Server denied access to a user. Contact the Network Policy Server administrator for more information. User: Security ID: NULL SID Account Name: real_username Account Domain: real_domain Fully Qualified Account Name: real_domain\real_username Client Machine: Security ID: NULL SID Account Name: - Fully Qualified Account Name: - OS-Version: - Called Station Identifier: - Calling Station Identifier: - NAS: NAS IPv4 Address: 10.0.0.10 NAS IPv6 Address: - NAS Identifier: radius1.real_domain NAS Port-Type: - NAS Port: 101451540 RADIUS Client: Client Friendly Name: sbc1mgmt Client IP Address: 10.0.0.10 Authentication Details: Connection Request Policy Name: SBC Authentication Network Policy Name: - Authentication Provider: Windows Authentication Server: RADIUS1.real_domain Authentication Type: MS-CHAPv2 EAP Type: - Account Session Identifier: - Logging Results: Accounting information was written to the SQL data store and the local log file. Reason Code: 16 Reason: Authentication failed due to a user credentials mismatch. Either the user name provided does not map to an existing user account or the password was incorrect. 

事件ID:4625


 An account failed to log on. Subject: Security ID: SYSTEM Account Name: RADIUS1$ Account Domain: REAL_DOMAIN Logon ID: 0x3E7 Logon Type: 3 Account For Which Logon Failed: Security ID: NULL SID Account Name: real_username Account Domain: REAL_DOMAIN Failure Information: Failure Reason: Unknown user name or bad password. Status: 0xC000006D Sub Status: 0xC000006A Process Information: Caller Process ID: 0x2cc Caller Process Name: C:\Windows\System32\svchost.exe Network Information: Workstation Name: Source Network Address: - Source Port: - Detailed Authentication Information: Logon Process: IAS Authentication Package: MICROSOFT_AUTHENTICATION_PACKAGE_V1_0 Transited Services: - Package Name (NTLM only): - Key Length: 0 This event is generated when a logon request fails. It is generated on the computer where access was attempted. The Subject fields indicate the account on the local system which requested the logon. This is most commonly a service such as the Server service, or a local process such as Winlogon.exe or Services.exe. The Logon Type field indicates the kind of logon that was requested. The most common types are 2 (interactive) and 3 (network). The Process Information fields indicate which account and process on the system requested the logon. The Network Information fields indicate where a remote logon request originated. Workstation name is not always available and may be left blank in some cases. The authentication information fields provide detailed information about this specific logon request. - Transited services indicate which intermediate services have participated in this logon request. - Package name indicates which sub-protocol was used among the NTLM protocols. - Key length indicates the length of the generated session key. This will be 0 if no session key was requested. 

所以乍一看,这个问题似乎只是一个无效的用户名或密码不匹配的情况。 这在数据包捕获中得到了进一步的证实,我可以看到MSCHAPv2响应的错误码是691(因为用户名或密码,或者两者在域上都是无效的,所以拒绝访问)。 事情是我知道我正在使用一个有效的用户名,我已经尝试了很多用户名,包括我创build的新用户只是为了排除故障。 我不知道有多less次重置密码,以确保它不是不匹配的密码。 我甚至确保使用相当短的密码,只包含字母,以确保没有terminal编码问题(我们通过SSH客户端连接到SBC)。 我也使用SBC和RADIUS服务器之间通信期间使用的共享密钥完成了同样的事情。 我已经尝试在用户名前加上域名login(虽然我不认为这是必要的)。 我也尝试使用用户的完整UPNlogin。 我已经尝试过几个RADIUStesting客户端(NTRadPing,RadiusTest等),但是它们要么不支持MSCHAPv2,要么只支持EAP-MSCHAPv2。 我甚至用PHP的PECL RADIUS模块创build了我自己的客户端。 它仍然似乎总是失败与MSCHAPv2身份validation与691的错误代码。有没有人有任何想法,为什么我总是得到一个无效的用户名或密码错误的反应,当我已经尽一切可能,以确保不是这样的?

以下是我们的RADIUSconfiguration的规格:

  • Windows Server 2012 R2
  • SQL Server 2012后端数据库进行记帐。
  • 该服务器已经在该域上授权,并且是“RAS和IAS服务器”组的成员。 对于哪个组可以访问我们正在testing的帐户。
  • 我们正在testing的帐户在其“拨入”属性选项卡下选中了“通过NPSnetworking策略控制访问”选项。
  • RADIUS客户端被configuration为简单地匹配IP地址,您可以从上面的事件看到它正在应用客户端友好的名称。
  • 连接请求策略:正如上面所见,正在应用“SBC身份validation”策略。 唯一的条件是成功匹配友好名称的正则expression式。
  • networking政策:从上面的事件可以看出,没有任何一个得到应用。 出于故障排除的目的,我为处理订单创build了一个设置为“1”的networking策略,其唯一条件是当前设置为任意时间的date和时间限制。
  • 身份validation方法仅设置为MSCHAPv2或MSCHAPv2(用户可以在密码过期后更改密码)。 我已经尝试添加这只是networking策略,我也尝试将此添加到连接请求策略,并将其设置为覆盖networking策略的身份validation方法。
  • 我们的域中有其他RADIUS服务器,它们使用PEAP来validation无线客户端,并且它们都正常工作。 但是,我们只需要这个MSCHAPv2(没有EAP)。
  • 所有其他configuration都设置为默认值。

唯一需要注意的是在上面的事件中,您可以看到Security ID是“NULL SID”。 现在我知道这在login失败时很常见,但是鉴于这个问题表明了一个无效的用户名或密码错误,在这种情况下可能是很重要的。 此外,此服务器已使用Active Directory中的相同计算机帐户重build。 我不知道在重build之前它是否会起作用。 从本质上讲,我们构build了这个服务器,只有当我们决定把SQLangular色分离到另一个服务器上时,只要授权服务器到域并添加SQL即可。 我们只是重build了机器,而不是卸载SQL。 但是,在重新安装Windows之前,我确实在计算机帐户上进行了重置。 我不认为这应该是重要的,但我想我会指出,如果有一个奇怪的怪癖,重用先前授权的NPS服务器相同的SID会导致一个问题。

总而言之,这是一个相当基本的设置,希望我能够提供足够的信息让人们了解可能发生的事情。 道歉,如果我的理解似乎有点基本,毕竟,当谈到RADIUS服务器,我想你可以说我是这里的新人。

编辑1:

为了进一步解决这个问题,我试图提出更多的服务器进行testing。 以下是我已经完成的附加testing。

多个域名

我现在已经在3个不同的孤立域中尝试过了。 我们的testing和生产领域以及我的私人家庭领域,除了对Exchange和ConfigMgr进行的修改外,其他定制方式都很less。 全部具有上述相同的结果。

VPN服务

使用Windows Server 2012 R2,我们启动了一个单独的服务器来运行标准的VPN设置。 目的是看看我们是否可以使用RADIUS身份validation与VPN,如果工作,我们会知道这个问题是与SBCs。 但是,在我们甚至可以configuration它使用RADIUS之前,我们只是试图确保它在本地VPN服务器上使用标准的Windows身份validation。 有趣的是,它也失败了,相同的事件被logging为RADIUS服务器。 客户机是Windows 8.1工作站。 我再次指出,我们正在使用专门用于无线环境的RADIUS服务器。 这些RADIUS服务器和我遇到的问题唯一的区别是工作的无线服务器使用PEAP而不是MSCHAPv2。

FreeRADIUS的

现在我不是Linux大师,但我相信我已经启动并运行了。 我能够使用ntlm_authlogin到控制台时对用户进行身份validation。 但是,当radiusd服务试图使用ntlm_auth来做基本相同的事情时,它会失败,并返回我一直使用Windows服务器(E = 691)获得的相同消息。 我有在debugging模式下运行的半径服务,所以我可以看到更多的事情正在进行。 如果需要,我可以发布我得到的debugging信息。 我所看到的特别感兴趣的线条如下:

 (1) ERROR: mschap : Program returned code (1) and output 'Logon failure (0xc000006d)' (1) mschap : External script failed. (1) ERROR: mschap : External script says: Logon Failure (0xc000006d) (1) ERROR: mschap : MS-CHAP2-Response is incorrect 

这里要注意的是,虽然我们基本上仍然得到一个“错误的密码”的消息,但实际的状态码(0xc000006d)与我在Windows服务器上得到的(0xc000006a)稍有不同。 从这个文件你可以看到这些代码的含义: NTSTATUS值 。 FreeRADIUS服务器的好处在于,我可以在debugging模式下看到所有的挑战响应。 所以,如果我可以围绕MSCHAPv2响应如何计算,我可以比较它,看看这是不是一个错误的挑战反应。 更新只是注意到6a代码只是6d代码的子状态代码。 所以没有什么不同的Windows服务器,我仍然怀疑是否有挑战的答复,但计算错误。

目前,我正在开发一个RADIUS服务器的Windows Server 2008 R2实例,以查看是否有帮助。 然而,如果有人在W2K8 R2和W2K12 R2之间爆发了一些服务,但是到目前为止还没有人注意到,我会感到惊讶。 如果这不起作用,我可能不得不向微软开个案。 更新:与W2K8 R2相同的结果。

更新2

我向微软公司开了一个案子,他们为此工作了几个星期。 我花了我第一周的时间,试图让他们明白,这与无线无关,我们尝试连接的设备不支持使用任何forms的EAP对RADIUS服务器进行身份validation。 一旦他们终于明白我们正在设置validation方法只是MSCHAPv2,他最初的反应就是“你不能这样做”。 他说,不pipe你总是需要什么forms的EAP或PEAP设置在顶部框(甚至PAP和其他“不太安全的方法”在authentication方法窗口)。 这对我来说似乎不太可能,所以我要求提供一些文件说明这个问题,然后他改变主题,从来没有提供任何文件。 很明显,当我告诉我这个问题似乎与用户名和密码有关的时候,我和微软没有任何关系。 所以花了他们两个星期才得出这个结论,当我的首映机票的主题行有E691错误代码,这意味着不匹配的用户名和密码,尽pipe我很长的段落解释,我已尽一切可能确保它是不是一个错误的用户名和密码。

不幸的是,我的项目负责人不想再浪费任何的首演支持时间,所以我们已经结案。 我们可能只是处理SBC本地共享login,并设置一些其他方式来强制问责制(我们只有4人将有权访问)。

我会指出,在我被告知放弃这个项目之前,我确实让FreeRADIUS服务器只使用MSCHAPv2工作,但是只能使用FreeRADIUS服务器本地的帐户来完成这个工作。 这是纯文本密码存储在FreeRADIUSconfiguration文件的某处。 所以显然不是解决scheme,但它至less表明SBC通过MSCHAPv2正确地与RADIUS服务器通信。 这和上面提到的其他事情使我相信问题在于RADIUS服务器和域控制器之间。 尽pipeNTLM身份validation在Windows RADIUS和FreeRADIUS服务器上正常工作,但在本地login到服务器时(可以通过testing帐户login到Windows RADIUS,只需使用用户名和密码使用ntlm_auth命令即可在FreeRADIUS服务器上成功进行身份validation)当RADIUS进入RADIUS请求(FreeRADIUS使用与我本地login时使用的ntlm_auth命令相同的命令,而不是提供用户名和密码给它提供用户名和质询响应的命令)时,RADIUS服务器似乎没有经过用户authentication。

所以我会在这里结束这个线程,但我会留意这个,它会通知我,如果有人发布的东西。 如果有人发布解决scheme或有评论,我会回应。

难道你不知道吗?在我们放弃了使用RADIUS服务器来控制对SBC的访问的一个月后,我们find了一个可能的解决scheme。 当然,在这个时候,我们忙于其他项目回去尝试这个解决scheme,所以我不能说100%,如果这能解决问题,但是一旦我解释你可能会同意这就是答案。

我的一位同事在微软的会议上进行了各种讨论,当时他发现MSCHAPv2依靠NTLM来产生密码挑战和响应。 现在,在Windows RAS服务中使用简单的旧MSCHAP和MSCHAPv2(即不是EAP-MSCHAPv2或PEAP)将默认使用NTLMv1。

正如你们中许多人已经开始接触到的那样,我们像许多pipe理员一样,在我们的区域中禁用了NTLMv1,因此区域中心只接受NTLMv2请求。 这解释了为什么我继续得到的失败是一个“错误的密码”错误。 发送给DC的密码是NTLMv1格式,被忽略。

一旦我们意识到这一点,我可以做更多的研究,我发现了以下文章:

http://support.microsoft.com/kb/2811487

本文介绍了我遇到的相同的行为,包括我提到的E = 691错误代码。 本文还提供了一种解决方法来强制RAS服务在构buildMSCHAPv2响应时使用NTMLv2。 有趣的是,在你确切知道问题是什么之后,find这些文章是多么的容易。

再次,我还没有validation这是问题,因为我没有时间重build我已经退役的RADIUS服务器,但是如果我有机会,我打算在某个时间试用这个服务器。 我只是想发布这个可能的解决scheme,以防其他人绊倒这个问题。 如果有人可以在我做之前确认,请告诉我。

编辑 – 确认

我们被要求在这些SBC上扮演更重要的angular色,因此我们又回到了这个项目,并重新开发了Windows RADIUS服务器。 这次我们应用了上面链接中描述的registry项。 在对RADIUS服务器和SBC之间的通信进行数据包捕获之后,事实上现在可以看到“接受接受”消息被SBC发回。 所以我现在至less可以在我们的场景中确认我们遇到的问题如上所述。

TL; DR

NT上的NTLMv1被禁用。 设置一个registry项来强制RADIUS服务器使用NTLMv2解决了这个问题。

从我的经验MS NPS告诉你,如果RADIUS预共享密钥不匹配。 像这样的东西:

 Event 14: A RADIUS message was received from RADIUS client xxxx with an invalid authenticator. This is typically caused by mismatched shared secrets. Verify the configuration of the shared secret for the RADIUS client in the Network Policy Server snap-in and the configuration of the network access server. 

你会在事件日志中得到它。

这个事实,你在被捕获的stream量中看到访问拒绝也意味着预先共享的密钥匹配在双方,否则NPS只是不会回复,你会看到访问请求后没有进一步的RADIUS数据包。

您提供的日志中的重要内容是:

 Sub Status: 0xC000006A 

这意味着“用户名正确但密码错误”。 我的观点非常明确。

我知道MS-CHAPv2不需要使用可逆encryption来存储密码,但只是为了检查这个猜测,是否可以为您使用的用户帐户设置此checkbox,然后重新设置其密码并再次尝试。

仅供参考 – 升级正在运行的RADIUS + MSCHAP系统后,我得到了同样的错误。

“\ 000E = 691 R = 1”

结果发现有一种类似的桑巴舞转变,把winbind socket的权利剥夺了。 将freerad添加到winbindd_priv组修复了这个问题。

/ etc / group:winbindd_priv:x:110:freerad

在将新的2012R2域控制器添加到现有的2008R2环境中之后,我们也遇到了与来自NPS服务器的身份validation相同的问题。 在2008R2域控制器启用的情况下,新的2012R2域控制器禁用了NTLMv1。

NPS服务器(运行2008R2),随机拒绝用户访问。

NPS服务器上logging以下事件:事件ID 6273(安全日志)networking策略服务器拒绝访问用户。 原因码:16原因:由于用户证书不匹配导致身份validation失败。 提供的用户名称不映射到现有的用户帐户或密码不正确。

当连接到2008R2 dc的NPS服务器的一切工作像一个魅力。 但在2012R2直stream的访问被拒绝。 所有这些都是因为NTLMv1在新的2012R2域控制器上被禁用。

我可以确认在MS知识库文章( http://support.microsoft.com/kb/2811487 )中的解决scheme完美的作品!

非常感谢你这个优秀的文章! 这为我解决了这个问题节省了大量的时间。 – )