如何在 Windows 域中禁用 NTLM 身份验证
NTLM (NT LAN Manager) 是一种传统的 Microsoft 身份验证协议,其历史可以追溯到 Windows NT。尽管 Microsoft 在 Windows 2000 中引入了更安全的 Kerberos 身份验证协议,但 NTLM(主要是 NTLMv2)仍然广泛用于 Windows 域网络上的身份验证。在本文中,我们将了解如何禁用 NTLMv1 和 NTLMv2 协议,并在 Active Directory 域中切换到 Kerberos。
NTLMv1 的关键问题:
弱加密;
将密码哈希存储在 LSA 服务的内存中,可以使用各种工具(例如 Mimikatz)从 Windows 内存中以纯文本形式提取密码哈希,并用于使用 pass-the-has 脚本进行进一步攻击;
服务器和客户端之间缺乏相互身份验证,导致数据拦截和未经授权的资源访问(某些工具(例如 Responder)可以捕获通过网络发送的 NTLM 数据并使用它们来访问网络资源);
-
以及其他漏洞。
其中一些已出现在下一版本 NTLMv2 中,该版本使用更安全的加密算法并允许防止常见的 NTLM 攻击。从 Windows 7 和 Windows Server 2008 R2 开始,默认情况下禁用 NTLMv1 和 LM 身份验证协议。
如何启用 NTLM 身份验证审核日志记录?
在域中完全禁用 NTLM 并切换到 Kerberos 之前,最好确保域中没有需要和使用 NTLM 身份验证的应用程序。您的网络上可能存在仍使用 NTLMv1 身份验证而不是 NTLMv2(或 Kerberos)的旧设备或服务。
要跟踪使用 NTLM 身份验证的帐户或应用程序,您可以使用 GPO 在所有计算机上启用审核日志记录策略。打开默认域控制器策略,导航到计算机配置 -> Windows 设置 -> 安全设置 -> 本地策略 -> 安全选项部分,找到并启用网络安全:限制 NTLM:审核此域中的 NTLM 身份验证策略,并将其值设置为全部启用。
以同样的方式,在默认域策略中启用以下策略:
网络安全:限制 NTLM:审核传入 NTLM 流量 - 将其值设置为启用域帐户审核
网络安全:限制 NTLM:到远程服务器的传出 NTLM 流量:设置全部审核
启用这些策略后,与使用 NTLM 身份验证相关的事件将显示在事件查看器的应用程序和服务日志 -> Microsoft -> Windows -> NTLM 部分中。
您可以分析每台服务器上的事件或将它们收集到中央 Windows 事件日志收集器。
您需要从源 Microsoft-Windows-Security-Auditing 中搜索事件 ID 为 4624 的事件 - “
An Account was successfully logged on”。请注意“详细身份验证信息”部分中的信息。如果身份验证包值中有NTLM,则使用NTLM协议来验证该用户。
查看包名称(仅限 NTLM) 的值。此行显示使用哪个协议(LM、NTLMv1 或 NTLMv2)进行身份验证。因此,您需要识别任何使用旧协议的服务器/应用程序。
此外,如果使用 NTLM 而不是 Kerberos 进行身份验证,事件 ID 4776 将出现在日志中:
The computer attempted to validate the credentials for an account
Authentication Package: MICROSOFT_AUTHENTICATION_PACKAGE_V1_0例如,要搜索所有域控制器上的所有 NTLMv1 身份验证事件,可以使用以下 PowerShell 脚本:
$ADDCs = Get-ADDomainController -filter
$Now = Get-Date
$Yesterday = $Now.AddDays(-1)
$NewOutputFile = "c:\Events\$($Yesterday.ToString('yyyyddMM'))_AD_NTLMv1_events.log"
function GetEvents($DC){
Write-Host "Searching log on " $DC.HostName
$Events = Get-EventLog "Security" -After $Yesterday.Date -Before $Now.Date -ComputerName $DC.HostName -Message "*NTLM V1*" -instanceid 4624
foreach($Event in $Events){
Write-Host $DC.HostName $Event.EventID $Event.TimeGenerated
Out-File -FilePath $NewOutputFile -InputObject "$($Event.EventID), $($Event.MachineName), $($Event.TimeGenerated), $($Event.ReplacementStrings),($Event.message)" -Append
}
}
foreach($DC in $ADDCs){GetEvents($DC)}一旦确定了域中使用 NTLM 的用户和应用程序,请尝试将它们切换为使用 Kerberos(可能使用 SPN)。要使用 Kerberos 身份验证,某些应用程序需要稍微重新配置(IIS 中的 Kerberos 身份验证、为 Kerberos 身份验证配置不同的浏览器、使用 Kerberos 身份验证创建 Keytab 文件)。根据我自己的经验,我发现即使大型商业产品仍在使用 NTLM 而不是 Kerberos,某些产品需要更新或配置更改。这个想法是识别哪些应用程序使用 NTLM 身份验证,现在您有一种方法来识别该软件和设备。
小型开源产品、各种网络扫描仪的旧型号(将扫描结果存储在共享网络文件夹中)、某些 NAS 设备和其他旧硬件、旧版软件和操作系统在禁用 NTLMv1 时可能会出现身份验证问题。
那些不能使用 Kerberos 的应用程序可以添加到例外中。这允许他们使用 NTLM 身份验证,即使在域级别禁用它也是如此。为此,使用网络安全:限制 NTLM:为此域中的 NTLM 身份验证添加服务器例外策略。将可以使用 NTLM 身份验证的服务器名称(NetBIOS 名称、IP 地址或 FQDN)添加到例外列表中。理想情况下,此例外列表应该为空。您可以使用通配符
*
。
要在应用程序中使用 Kerberos 身份验证,您必须指定服务器的 DNS 名称,而不是其 IP 地址。如果您在连接到资源时指定 IP 地址,则将使用 NTLM 身份验证。
配置 Active Directory 以通过 GPO 强制使用 NTLMv2
在 AD 域中完全禁用 NTLM 之前,建议您首先禁用其更易受攻击的版本 NTLMv1。域管理员需要确保其网络不允许使用 NTLM 或 LM 进行身份验证,因为在某些情况下,攻击者可以使用特殊请求来获取对 NTLM/LM 请求的响应。
您可以使用域 GPO 设置首选身份验证类型。打开组策略管理编辑器(
gpmc.msc)并编辑默认域控制器策略。转到 GPO 部分计算机配置 -> 策略 -> Windows 设置 -> 安全设置 -> 本地策略 -> 安全选项,然后找到策略网络安全:LAN Manager 身份验证级别。
策略设置中有 6 个选项可供选择:
发送 LM 和 NTLM 响应;
发送 LM 和 NTLM 响应 - 如果协商使用 NTLMv2 会话安全性;
仅发送 NTLM 响应;
仅发送 NTLMv2 响应;
仅发送 NTLMv2 响应。拒绝LM;
仅发送 NTLMv2 响应。拒绝LM&NTLM。
NTLM 身份验证选项按其安全性改进的顺序列出。默认情况下,Windows 7 及更高版本的操作系统使用选项仅发送 NTLMv2 响应。如果启用此选项,客户端计算机将使用 NTLMv2 身份验证,但 AD 域控制器接受 LM、NTLM 和 NTLMv2 请求。
NTLMv2 可用于 Kerberos 协议失败的情况以及某些操作(例如,管理加入域的计算机上的本地组和帐户)或在工作组中。
您可以将策略值更改为最安全的选项6:“仅发送 NTLMv2 响应。拒绝LM & NTLM”。此策略也会导致域控制器拒绝 LM 和 NTLM 请求。
您还可以通过注册表禁用 NTLMv1。为此,请在注册表项 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa 下创建一个名为 LmCompatibilityLevel 的 DWORD 参数,其值介于 0 到 5 之间。值 5 对应于策略选项“仅发送 NTLMv2 响应”。拒绝LM NTLM”。
确保同一 GPO 部分中启用了网络安全:下次更改密码时不存储 LAN Manager 哈希值策略。从 Windows Vista/Windows Server 2008 开始默认启用它,并阻止创建 LM 哈希。
一旦确保您没有使用 NTLMv1,您可以进一步尝试禁用 NTLMv2。 NTLMv2是一种更安全的身份验证协议,但在安全性方面明显输给了 Kerberos(虽然 NTLMv2 的漏洞比 NTLMv1 少,但仍有可能捕获和重用数据,而且不支持相互身份验证)。
禁用 NTLM 的主要风险是可能使用仍在使用 NTLM 身份验证的旧版或配置错误的应用程序。如果是这种情况,它们将需要更新或进行特殊配置才能切换到 Kerberos。
如果网络上有远程桌面网关服务器,则需要进行额外配置以防止客户端使用 NTLMv1 进行连接。创建一个注册表项:
REG add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\TerminalServerGateway\Config\Core" /v EnforceChannelBinding /t REG_DWORD /d 1 /f完全限制 NTLM 并在 AD 中使用 Kerberos 身份验证
要在不使用 NTLM 的情况下检查域中不同应用程序中身份验证的工作方式,您可以将所需用户的帐户添加到受保护的用户域组(自 Windows Server 2012 R2 版本起可用)。此安全组的成员只能使用 Kerberos 进行身份验证(不允许 NTLM、摘要式身份验证或 CredSSP)。这允许您验证 Kerberos 用户身份验证是否在不同的应用程序中正常工作。
然后,您可以使用网络安全:限制 NTLM:此域中的 NTLM 身份验证策略在 Active Directory 域上完全禁用 NTLM。
该政策有 5 个选项:
禁用:禁用该策略(域中允许NTLM身份验证);
拒绝域帐户访问域服务器:域控制器拒绝域帐户下所有服务器的 NTLM 身份验证尝试,并显示“NTLM 被阻止”错误消息;
拒绝域帐户:域控制器阻止所有域帐户的 NTLM 身份验证尝试,并出现“NTLM 被阻止”错误;
拒绝域服务器:拒绝所有服务器的 NTLM 身份验证请求,除非该服务器名称位于“网络安全:限制 NTLM:为此域中的 NTLM 身份验证添加服务器例外”策略中的例外列表中;
全部拒绝:域控制器阻止所有域服务器和帐户的所有 NTLM 请求。
尽管现在在域上禁用了 NTLM,但它仍然用于处理计算机的本地登录(NTLM 始终用于本地用户登录)。
您还可以使用单独的默认域策略选项禁用域计算机上的传入和传出 NTLM 流量:
网络安全:限制 NTLM:传入 NTLM 流量=拒绝所有帐户
网络安全:限制 NTLM:传出到远程服务器的 NTLM 流量=全部拒绝
启用审核后,当使用 NTLM 进行身份验证时,事件查看器还将显示来自 LsaSRV 源的 EventID 6038:
Microsoft Windows Server has detected that NTLM authentication is presently being used between clients and this server. This event occurs once per boot of the server on the first time a client uses NTLM with this server.
NTLM is a weaker authentication mechanism. Please check:
Which applications are using NTLM authentication?
Are there configuration issues preventing the use of stronger authentication such as Kerberos authentication?
If NTLM must be supported, is Extended Protection configured?
您可以使用以下命令检查 Kerberos 是否用于用户身份验证:
klist sessions此命令显示所有用户都经过 Kerberos 身份验证(内置本地管理员除外,他始终使用 NTLM 进行身份验证)。
如果您在禁用 NTLM 后遇到大量用户帐户锁定事件,请仔细查看 ID 为 4771 的事件(
Kerberos pre-authentication failed)。检查错误描述中的故障代码。这将指示锁定的原因和来源。
为了进一步提高 Active Directory 安全性,我建议阅读以下文章:
保护 Active Directory 中的管理员帐户
如何禁用 TCP/IP 上的 LLMNR 和 NetBIOS?








