通过 RADIUS 进行身份验证:MSCHAPv2 错误 691

通过 RADIUS 进行身份验证:MSCHAPv2 错误 691

我正在通过 RADIUS 设置 Acme Packet Net-Net 3820 (SBC) 的身份验证。会计方面工作正常,没有问题。身份验证方面则是另一回事。我可以从数据包捕获中看到,访问请求消息实际上正在到达 RADIUS 服务器,此时 RADIUS 服务器开始与域控制器通信。然后我看到通信链回到 RADIUS,最后回到 SBC。问题是我收到的响应始终是拒绝访问消息,原因代码为 16(由于用户凭据不匹配,身份验证失败。提供的用户名与现有用户帐户不匹配,或者密码不正确)。通过查看安全事件日志可以确认这一点,我可以看到事件 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(访问被拒绝,因为用户名或密码,或两者,在域上无效)。问题是我知道我使用的用户名是有效的,并且我尝试了许多用户名,包括我为故障排除而创建的新用户名。我不知道我重置了多少次密码,以确保它不是不匹配的密码。我甚至确保使用相当短且仅包含字母的密码来确保没有终端编码问题(我们通过 SSH 客户端连接到 SBC)。我也对 SBC 和 RADIUS 服务器之间通信期间使用的共享密钥做了同样的事情。我尝试在登录时将域名作为用户名的前缀(尽管我认为这不是必要的)。我也尝试使用用户的完整 UPN 登录。我尝试过几个 RADIUS 测试客户端(NTRadPing、RadiusTest 等),但它们要么不支持 MSCHAPv2,要么仅支持 EAP-MSCHAPv2。我甚至使用 PHP 的 PECL RADIUS 模块创建了自己的客户端。但它似乎总是因 MSCHAPv2 身份验证失败而出现错误代码 691。有人知道为什么我已尽一切努力确保不会出现这种情况,但总是收到无效用户名或错误密码的响应吗?

以下是我们的 RADIUS 配置的规格:

  • Windows Server 2012 R2
  • 用于会计的 SQL Server 2012 后端数据库。
  • 该服务器已在域中被授权,并且是“RAS 和 IAS 服务器”组的成员。该组确实有权访问我们正在测试的帐户。
  • 我们正在测试的帐户在其“拨入”属性选项卡下确实选中了“通过 NPS 网络策略控制访问”选项。
  • RADIUS 客户端配置为仅匹配 IP 地址,您可以从上面的事件中看到它正在应用客户端友好名称。
  • 连接请求策略:如上所示,正在应用“SBC 身份验证”策略。唯一的条件是正则表达式成功匹配友好名称。
  • 网络策略:如上所示,没有应用任何策略。为了进行故障排除,我创建了一个网络策略,该策略针对处理顺序设置为“1”,其唯一条件是当前设置为任何时间、任何一天的日期和时间限制。
  • 身份验证方法设置为仅 MSCHAPv2 或 MSCHAPv2(密码过期后用户可以更改密码)。我尝试将其添加到网络策略中,也尝试将其添加到连接请求策略中并将其设置为覆盖网络策略的身份验证方法。
  • 我们域中确实有其他使用 PEAP 来验证无线客户端的 RADIUS 服务器,它们都运行良好。但是,我们需要它仅与 MSCHAPv2 配合使用(无 EAP)。
  • 所有其他配置都设置为默认配置。

唯一需要注意的其他事项是,在上述事件中,您可以看到安全 ID 为“NULL SID”。现在我知道这很常见,尤其是在登录失败的情况下,但鉴于此问题表明用户名无效或密码错误,在这种情况下,这也许很重要。此外,此服务器已使用 Active Directory 中的相同计算机帐户重建。我不知道重建之前它是否会正常工作。本质上,我们构建了此服务器,并且只在决定将 SQL 角色分离到另一台服务器上时将服务器授权给域并添加 SQL。我们只是重建了机器,而不是卸载 SQL。但是,在重新安装 Windows 之前,我确实重置了计算机帐户。我认为这不应该有问题,但如果存在一些奇怪的怪癖,即重复使用先前授权的 NPS 服务器的相同 SID 会导致问题,我想指出这一点。

总而言之,这是一个相当基本的设置,希望我提供了足够的信息,让大家了解可能发生的事情。如果我对此的理解似乎有点基础,请原谅,毕竟,当谈到 RADIUS 服务器时,我想您可能会说我是这里的新手。

编辑1:

为了进一步解决此问题,我尝试启动其他服务器进行测试。以下是我执行的其他测试。

多个域

我现在已在 3 个不同的独立域中尝试了此方法。我们的测试和生产域以及我的私人家庭域,除了针对 Exchange 和 ConfigMgr 所做的修改外,几乎没有任何自定义。所有域都具有上述相同的结果。

VPN 服务

使用 Windows Server 2012 R2,我们启动了一个单独的服务器来运行标准 VPN 设置。目的是看看我们是否可以将 RADIUS 身份验证与 VPN 一起使用,如果可行,我们就知道问题出在 SBC 上。然而,在我们将其配置为使用 RADIUS 之前,我们只是尝试确保它与本地 VPN 服务器上的标准 Windows 身份验证一起使用。有趣的是,它也失败了,记录的事件与 RADIUS 服务器相同。客户端计算机是 Windows 8.1 工作站。我再次指出,我们有专门用于无线环境的 RADIUS 服务器。这些 RADIUS 服务器与我遇到问题的服务器之间的唯一区别是,正常工作的无线服务器使用的是 PEAP 而不是 MSCHAPv2。

自由RADIUS

现在我不是 Linux 专家,但我相信我已经启动并运行了它。我能够在登录到控制台时使用 ntlm_auth 对用户进行身份验证。但是,当 radiusd 服务尝试使用 ntlm_auth 执行本质上相同的操作时,它会失败并返回与我在 Windows 服务器上收到的相同消息 (E=691)。我让 radiusd 服务在调试模式下运行,这样我就可以更多地了解正在发生的事情。如果需要,我可以发布我收到的调试信息。然而,我看到的特别有趣的行如下:

(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 服务器的优点是,当它处于调试模式时,我可以看到所有的质询响应。因此,如果我能弄清楚 MSCHAPv2 响应是如何计算的,我就可以比较它,看看这是否只是一个计算错误的质询响应。更新刚刚注意到 6a 代码只是 6d 代码的子状态代码。所以与 Windows 服务器没什么不同,不过我仍然怀疑质询响应是否存在计算错误。

目前,我正在努力启动 RADIUS 服务器的 Windows Server 2008 R2 实例,看看这是否有帮助。但是,如果 W2K8 R2 和 W2K12 R2 之间的服务出现问题而至今无人注意,我会感到惊讶。如果这不起作用,我可能不得不向 Microsoft 提出诉讼。更新:与 W2K8 R2 的结果相同。

更新 2

我向微软提出了一个案例,他们花了几个星期的时间处理这个问题。第一周我花了很长时间试图让他们明白这与无线无关,我们试图连接的设备不支持使用任何形式的 EAP 对 RADIUS 服务器进行身份验证。当他们最终明白我们试图将身份验证方法设置为仅 MSCHAPv2 时,他的第一反应只是“你不能这样做”。他说,不管怎样,你总是需要在顶部框中设置某种形式的 EAP 或 PEAP(即使对于该身份验证方法窗口中的 PAP 和其他“不太安全的方法”也是如此)。这对我来说似乎不太可能,所以我要求提供一些说明这一点的文档,但他随后转移了话题,从未提供任何文档。当他们告诉我问题似乎出在用户名和密码上时,我显然与微软无缘。因此,当我的首映票的主题行出现 E691 错误代码(这意味着用户名和密码不匹配)时,他们花了 2 周的时间才得出这个结论,尽管我用了很长的篇幅解释说,我已尽一切努力确保这不是一个错误的用户名和密码。

不幸的是,我的项目负责人不想再浪费高级支持时间,所以我们已经结案了。我们很可能只处理 SBC 本地共享登录,并设置其他方式来强制问责(只有我们 4 个人有访问权限)。

我要指出的是,在我被告知放弃该项目之前,我确实让 FreeRADIUS 服务器仅使用 MSCHAPv2 工作,但只能使用 FreeRADIUS 服务器本地的帐户来执行此操作。这是存储在某个 FreeRADIUS 配置文件中的纯文本密码。显然这不是解决方案,但它至少表明 SBC 正在通过 MSCHAPv2 正确地与 RADIUS 服务器通信。这一点以及我上面提到的其他事情让我相信问题出在 RADIUS 服务器和域控制器之间。虽然在本地登录服务器时,NTLM 身份验证在 Windows RADIUS 和 FreeRADIUS 服务器上都可以正常工作(可以通过测试帐户登录 Windows RADIUS,并且仅使用用户名和密码使用 ntlm_auth 命令即可在 FreeRADIUS 服务器上成功进行身份验证),但当以 RADIUS 访问请求进入时,两个 RADIUS 服务器似乎都没有通过用户进行身份验证(FreeRADIUS 使用与我在本地登录时相同的 ntlm_auth 命令,但它不向命令提供用户名和密码,而是提供用户名和质询响应)。

所以我会在这里结束这个帖子,但我会关注此事,如果有人发布内容,它会通知我。如果有人发布解决方案或有评论,我会回复。

答案1

解决方案

您知道吗,在我们放弃使用 RADIUS 服务器控制 SBC 访问的方法大约一个月后,我们找到了一个可能的解决方案。当然,目前我们忙于其他项目,无法回去尝试这个解决方案,所以我不能 100% 肯定这是否能解决问题,但一旦我解释,您可能会同意这就是答案。

我的一位同事在参加微软会议时进行了各种讨论,突然意识到 MSCHAPv2 依赖 NTLM 来生成密码挑战和响应。现在,在 Windows RAS 服务中使用普通的 MSCHAP 和 MSCHAPv2(即不是 EAP-MSCHAPv2 或 PEAP)时,默认情况下将使用 NTLMv1。

你们中的许多人已经开始意识到,我们和许多管理员一样,在我们的 DC 上禁用了 NTLMv1,因此 DC 只接受 NTLMv2 请求。这解释了为什么我不断收到“密码错误”的错误。发送到 DC 的密码是 NTLMv1 格式,被忽略了。

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

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

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

再次强调,我还没有验证这是不是问题,因为我还没有时间重建已经停用的 RADIUS 服务器,但如果有机会,我确实计划尝试一下。我只是想发布这个可能的解决方案,以防其他人偶然发现这个问题。如果有人能先确认这一点,请告诉我。

编辑-已确认

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

总结

DC 上已禁用 NTLMv1。设置注册表项以强制 RADIUS 服务器使用 NTLMv2 可解决此问题。

答案2

根据我的经验,如果 RADIUS 预共享密钥不匹配,MS NPS 会通知您。如下所示:

Event 14: A RADIUS message was received from RADIUS client x.x.x.x 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.

您会在事件日志中找到它。

您在捕获的流量中看到访问拒绝这一事实也意味着双方的预共享密钥匹配,否则 NPS 不会回复,并且在访问请求后您将不会看到进一步的 RADIUS 数据包。

您提供的日志中同样重要的是:

Sub Status:     0xC000006A

意思是“用户名正确,密码错误”。我觉得这个解释很直白。

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

答案3

仅供参考 - 升级有效的 RADIUS + MSCHAP 系统后,我遇到了同样的错误。

“\000E=691 R=1”

原来是某种 Samba 更改导致 winbind 套接字的权限被剥夺。将 freerad 添加到 winbindd_priv 组解决了该问题。

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

答案4

在将新的 2012R2 域控制器添加到现有 2008R2 环境后,我们在 NPS 服务器的身份验证方面遇到了同样的问题。新的 2012R2 域控制器禁用了 NTLMv1,而 2008R2 域控制器启用了该功能。

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

NPS 服务器上记录了以下事件:事件 ID 6273(安全日志)网络策略服务器拒绝用户访问。原因代码:16 原因:由于用户凭据不匹配,身份验证失败。提供的用户名未映射到现有用户帐户或密码不正确。

当 NPS 服务器连接到 2008R2 域控制器时,一切都运行正常。但在 2012R2 域控制器上,访问被拒绝。这都是因为 NTLMv1 在新的 2012R2 域控制器上被禁用了。

我可以确认 MS KB 文章中的解决方案(http://support.microsoft.com/kb/2811487) 运行完美!

非常感谢这篇精彩的文章!它为我节省了大量时间来解决这个问题;-)

相关内容