NTLM 停用会导致业务应用停止运行吗——审计日志的采集方法与消除依赖的顺序
· 更新日期: · Go Komura · NTLM, Kerberos, Windows, Active Directory, 安全, 信息系统, PowerShell
更新记录(仅首版,2026年07月26日 发布)
- 首次发布
引用本文(DOI(已登记存档): 10.5281/zenodo.22175154)
以下 DOI 指向先前登记的存档,内容可能与当前正文不同。引用当前正文时,请使用本页网址。
Go Komura(2026)。《NTLM 停用会导致业务应用停止运行吗——审计日志的采集方法与消除依赖的顺序》。小村软件有限公司。 https://comcomponent.com/zh-CN/blog/ntlm-deprecation-audit-migration/
- DOI(已登记存档)
- 10.5281/zenodo.22175154
- DOI(上次登记版本)
- 10.5281/zenodo.22175155
“听说 NTLM 要停用了,我们这边没问题吧”——要给出答案,第一件事不是在全公司范围内阻止,而是对现在正在跑的认证做审计。2024 年 6 月微软宣布 NTLM 的所有版本进入弃用状态,但仅凭这条公告,业务并不会停摆。1
NTLM 的停用不是“某天打上补丁全公司就停摆”那类变更,而是每次把操作系统换新、限制就逐级收紧的变更。要趁 NTLM 还能用的时候,把依赖它的终端、应用、连接目标列成清单,先在小范围里试过再施加限制。先全部停掉、再去找哪里坏了,顺序正好反了。
本文面向管理 Windows 环境的信息系统部门,以及维护业务应用的开发者,给出实务步骤。推进顺序是:审计 → 原因分类 → 名称、配置、代码的修改 → 按连接逐个测试 → 分阶段施加限制。
协议机制本身(为什么 NTLM 有风险、为什么认证不走 Kerberos 而会回退到 NTLM),拆分到了配套文章《图解 NTLM 与 Kerberos——为什么认证会“回退”到 NTLM》中。
停用路线图与功能提供状况的基准时点,与原文一致,都是 2026 年 7 月。请把它与文章结构的更新日期区分开。IAKerb、本地 KDC 等的提供状况,在实际做迁移判断时,要按目标版本的发行说明重新确认。2
从你遇到的问题入手
| 想确认的事 | 首先要区分开的东西 | 阅读位置 |
|---|---|---|
| 停用之后,业务什么时候会停摆 | 弃用、NTLMv1 的移除、未来的默认禁用 | 第 2 章:当前位置、3 个阶段 |
| 不知道哪台 PC、哪个应用在用 | 审计策略的应用对象,与实际的记录位置 | 4.1 节:审计的准备 |
| DC 的日志很少,是否可以放心 | 域认证,与不经过 DC 的本地认证 | 4.2 节:事件的追踪 |
| 想从大量事件里缩小到负责的应用 | 按连接目标与调用方进程做汇总 | 4.3 节:PowerShell |
| 发现了 NTLMv1 或 PID 为 4 的行 | 要优先处理的依赖,与要用 ProcMon 追的依赖 | 4.4 节:NTLMv1、4.5 节:PID 4 |
| IP 地址、别名、SPN 到底改哪一处 | 影响范围、修改难易度、对端的条件 | 第 5 章:原因分类、第 6 章:处理 |
| 想试试不用 NTLM 能不能连上共享 | 清除已有会话,以及不加标志的对照测试 | 7.1 节:先用一台设备、一个连接来试 |
| 想修改自研应用或 IIS 一侧 | 认证方式、用于认证的账户、SPN 的注册对象 | 第 8 章:面向开发者、IIS 与 SPN |
| 如何判断全公司推广已经完成 | SMB 与 SMB 以外,审计周期与业务走完一轮 | 第 9 章:路线图、审计周期 |
想通读的话请从第 1 章往下看;要开始实际动手时,请回到第 4 章的审计。
1. 先说结论
把变更的当前位置区分开
NTLM 已于 2024 年 6 月被标记为弃用。对象是包含 LANMAN、NTLMv1、NTLMv2 在内的所有版本,这是一句“不再做积极的功能开发”的声明。同时也写明了“在下一版 Windows Server 和下一个年度发行版 Windows 中,NTLM 仍将继续可用”。1
已经有一部分被移除了。NTLMv1 在 Windows 11 版本 24H2 与 Windows Server 2025 中已被移除。1
停用分 3 个阶段推进。阶段 1 是使用情况的可视化与审计,阶段 2(2026 年下半年)是为了消除不得不依赖 NTLM 的场景而提供的功能(IAKerb、本地 KDC),阶段 3 是在下一个主要版本中默认禁用网络 NTLM 认证。2
在阻止之前,先定位依赖之处
现在该做的只有一件事。跑起审计模式,做出一份“哪台终端的哪个应用,对哪台服务器”使用 NTLM 的清单(第 4 章)。
域账户的排查从域控制器开始。按事件 8004 → 成员服务器的 8003 → 客户端的 8001 的顺序追下去,最后能追到应用名(4.2 节)。不过本地账户的认证不经过域控制器,所以不会出现 8004。这条路径要从服务器端的 8003 与客户端的 8001 中取。3
原因大多出在“名称”上。写死 IP 地址与 SPN 未注册是两大主因,两者都不必重做应用就能修好(第 5 章)。32
先小范围试,应用一侧也要改
有办法只在一台设备上安全地试。如果是 Windows 11 24H2 / Windows Server 2025,用 NET USE \\server\share /BLOCKNTLM 就能在完全不改任何策略的前提下,确认“不用 NTLM 能不能连上”(第 7 章)。4
自研应用要把点名指定 NTLM 的地方改成 Negotiate。微软自己就写着“不要直接访问 NTLM 安全包”(第 8 章)。5
图中实线表示始终成立的关系,虚线表示带条件的关系(成立条件写在详情页各关系的说明中)。关系的完整列表(共 29 条,附依据与确信度)以及主要概念的定义,汇总在知识地图详情页(日文)。数据:JSON-LD / Turtle
2. “弃用”到底意味着什么
先把术语理清。这里含糊着就去对公司内部做说明,“听说已经不能用了”和“听说还能撑好几年”会同时传开,话就说不清了。
把弃用的公告与已经发生的移除分开
微软的弃用功能一览中关于 NTLM 的描述,概括起来是下面 3 点。1
- 包含 LANMAN、NTLMv1、NTLMv2 在内的所有版本的 NTLM 都不再是积极功能开发的对象,属于弃用状态。
- NTLM 的使用在下一版 Windows Server 和下一个年度发行版 Windows 中仍将继续可用。
- 应把对 NTLM 的调用替换为对 Negotiate 的调用。Negotiate 会先尝试用 Kerberos 认证,只在必要时才回退到 NTLM。
并且作为更新信息补充说明,NTLMv1 已在 Windows 11 版本 24H2 及 Windows Server 2025 中被移除。1
也就是说,当前位置是“弃用(deprecated)”,而不是“移除(removed)”。但只有 NTLMv1 越过了弃用,已经进入移除阶段。如果老的多功能一体机或 NAS 只能用 NTLMv1 认证,那么升级到 Windows 11 24H2 本身就会变成一次故障。这不是将来的事,而是正在发生的事。
需要替代手段的用途,要把对端的条件也确认清楚
另一件要记住的是,NTLM 还留有“不存在替代方案的用途”。微软明确写道:工作组配置的系统中的 Windows 认证,以及域控制器之外的本地登录认证,依然在使用 NTLM,而且必须使用 NTLM。6 阶段 2 中计划提供的本地 KDC,正是为了填上“本地账户需要 NTLM”这个窟窿的功能。2
2.1. 3 个阶段的当前位置
停用的路线图分 3 个阶段。因为这是随时点而变的信息,所以要带上基准日来整理(下表是 2026 年 7 月时的情况)。
| 阶段 | 内容 | 2026 年 7 月时的状态 | 本公司要做的事 |
|---|---|---|---|
| 阶段 1 | 使用情况的可视化与审计 | 现在就能做。所需的审计策略和 Microsoft-Windows-NTLM/Operational 日志,现在的 Windows 里都已经有了27 |
跑第 4 章的审计,做出清单 |
| 阶段 2 | 消除不得不依赖 NTLM 的场景的功能(IAKerb、本地 KDC) | 处于计划 2026 年下半年提供的阶段2 | 先用发行说明确认目标版本上是正式提供还是预览阶段,再纳入计划。确认之前不要用“阶段 2 会解决”把问题搁置 |
| 阶段 3 | 在下一个主要版本中默认禁用网络 NTLM 认证 | 具体时间尚未公布。据称即便默认变为禁用,仍可通过策略重新启用21 | 先把阶段 1、2 做完。目的就是不要等它来了才开始查 |
这张表里希望你确认的是,现在能靠自己动手推动的只有阶段 1。阶段 2 的功能在第 6 章的判断表里有几处写着“可能成为解法”,但都以确认提供状况为前提。提供时间是会变的,所以这张表的内容,请在本公司做判断的时点务必重新获取一次。
3. 为什么它会消失——只花 3 分钟
作为迁移的判断材料,只讲最低限度。详细图解交给配套文章。
微软在策略设置的文档里明确写道:NTLM 及 NTLMv2 认证,对包括 SMB 中继、中间人攻击、暴力破解在内的各种恶意攻击都很脆弱。7 根子在于下面这些与 Kerberos 对比时被提及的性质。8
没有相互认证
在 NTLM 中,客户端无法验证服务器的身份,某台服务器也无法验证另一台服务器的身份。NTLM 是为“可以假定服务器是真的”的网络环境设计的。Kerberos 不做这个假定。这个差别,正是让认证信息被送到假服务器的中继攻击得以成立的条件。
在域认证中,服务器要去问 DC
在 NTLM 中,应用服务器每次认证域账户的客户端时,都需要连接域控制器(如果是服务器本地的账户,就由服务器查自己的账户数据库来判定)。6 在 Kerberos 中,可续订的会话票据取代了这种传递认证,除非需要验证 PAC(特权属性证书),服务器不必再去找域控制器。
不知道密码,偷来的哈希也会被滥用
NTLM 的凭据由域名、用户名,以及密码的单向哈希构成(进行哈希的只有密码),客户端用这个哈希加密质询并返回响应。5 只要偷到哈希,即便不知道明文密码也能冒充——这个性质正是由此而来。
“没有相互认证”在实务上的含义是:只是想连一下 SMB 共享,就有可能把认证信息交给假服务器。微软之所以准备了 SMB 客户端一侧的 NTLM 阻止功能,给出的理由也是“防止诱使客户端向恶意服务器发送 NTLM 请求的手法”。4
4. 审计——把 NTLM 用在哪些地方列成清单
这里才是正题。微软的指南也明确写道,在实施限制策略之前,必须先发现并审计当前 NTLM 认证流量的状态。9
4.1. 启用审计模式
注意:审计模式只记录,不阻止任何东西。另一方面,在终端数量多的环境里,日志量会一下子涨上来。如果没有使用事件收集(WEF),请先重新审视日志大小上限与保留期限,再启用。微软的指南也提到,视环境复杂程度,分析可能要花上几个月。3
审计周期要从设置真正铺到目标终端之后开始算。为了不漏掉月度处理或故障时才走的路径,请先看一下 9.2 节的“业务走完一轮”。
设置位置与 3 项策略
要设置的是 3 项策略。位置都在 计算机配置\Windows 设置\安全设置\本地策略\安全选项,而且不需要重启。无论是保存在本地,还是通过组策略分发,设置被应用的那一刻就生效。7
不要把保存 GPO 的时刻当作审计的起点
不过“不需要重启”和“立刻对所有机器生效”是两回事。用域的 GPO 分发时,保存 GPO 的那一刻更新的只是 AD/SYSVOL 上的策略,各终端真正开始审计要等到下一次后台刷新,或者执行了 gpupdate /force 之后。审计周期的起点不是“保存 GPO 的日期时间”,而是“应用铺到目标终端的日期时间”,请按后者计。这里搞错了,结果会以“只有第一次汇总时对象台数偏少”的形式被扭曲。
| 策略 | 应用对象 | 设置值 |
|---|---|---|
| 网络安全: 限制 NTLM: 审核此域中的 NTLM 身份验证 | 域控制器 | 全部启用 |
| 网络安全: 限制 NTLM: 审核传入 NTLM 流量 | 所有服务器与客户端 | 对所有账户启用审核 |
| 网络安全: 限制 NTLM: 到远程服务器的传出 NTLM 流量 | 所有服务器与客户端 | 全部审核 |
第三项“到远程服务器的传出 NTLM 流量”有全部允许 / 全部审核 / 全部拒绝 / 未定义这 4 个取值,未定义等同于“全部允许”。微软的建议也很明确:不要一上来就选“全部拒绝”,先设成“全部审核”并查看操作日志,摸清哪些服务器在接收认证请求,然后再做例外列表。7
要看的不是安全日志,而是 NTLM/Operational
记录位置是事件查看器 > 应用程序和服务日志 > Microsoft > Windows > NTLM(Microsoft-Windows-NTLM/Operational)。这项审计没有对应的安全审核事件策略,所以要看的是这个通道,而不是安全日志。7
把机器角色与要记录的事件对应起来
现场最容易搞混的,就是“在哪台机器上放哪项策略、看哪个事件”这个对应关系。把上表的 3 项策略记作①②③,做成检查清单。
| 机器类别 | 要启用的策略 | 要看的事件 | 能从中看出什么 |
|---|---|---|---|
| 域控制器 | ①(DC 专用) 另外②③也要设置。因为 DC 自身也会作为服务器和客户端通信 |
8004 | 在域账户的认证中,哪个用户用 NTLM 向哪台服务器(安全通道名称)做了认证 |
| 成员服务器 (文件服务器、业务服务器) |
②③ | 8003(传入) 8001(该服务器自身的传出) |
是从哪个客户端收到的。PID 为 4(SYSTEM)就说明经由 SMB(4.5 节) |
| 客户端终端 | ②③ | 8001(传出) | 目标服务器与客户端进程名。原因在这里落定 |
| 工作组机器、用本地账户访问共享 | ②③(对端是 Windows 的话两边都要) | 只有 8003 和 8001 | 因为不经过 DC,所以不会出现 8004。这条路径只能靠服务器和客户端的日志才看得见3 |
日志在任何机器上都是同一个 Microsoft-Windows-NTLM/Operational。①只对域控制器有效,而漏掉②③的终端不是“没有使用 NTLM 的终端”,而是“没有做记录的终端”。这个区别,是让汇总结果失真的最大原因。
4.2. 追踪要“从域控制器往下游走”
首先把认证用的账户区分开。域账户就从 DC 往下游追,本地账户就从服务器和客户端追。3
另外,也存在域控制器上不出现 8004 的情况。因为用本地用户账户连接文件服务器时,那次认证不经过域控制器。3 不能因为“看了 DC 的日志很少”就判断没问题。
域账户按 8004 → 8003 → 8001 追
微软的指南给出的域账户追踪路径如下。3
flowchart TD
DC["域控制器<br/>事件 8004"]
MS["成员服务器<br/>事件 8003"]
CL["客户端<br/>事件 8001"]
APP["根源应用程序"]
DC -->|"安全通道名称 =<br/>该去查的服务器"| MS
MS -->|"工作站名称 =<br/>该去查的客户端"| CL
CL -->|"客户端进程名"| APP
MS -.->|"PID 为 4 (SYSTEM) 就是<br/>经由 SMB"| CL
图1:NTLM 审计事件的追踪顺序
每个事件里该看的项目如下。3
| 事件 | 记录位置 | 主要项目 | 读法 |
|---|---|---|---|
| 8004 | 域控制器 | 日期时间 / 安全通道名称 / 用户名 / 域名 / 工作站名称 | “安全通道名称”就是客户端连接的成员服务器。下一步去看那台服务器的 8003 |
| 8003 | 成员服务器 | 日期时间 / 用户名 / 域名 / 工作站名称 / PID | PID 为 4(SYSTEM)就说明经由内核模式(= SMB)。去“工作站名称”那台客户端上看 8001 |
| 8001 | 客户端 | 日期时间 / 目标服务器 / 指定的用户 / 指定的域 / 客户端进程名 / 客户端进程的用户 ID | 原因在这里落定。如果“目标服务器”既不是 NetBIOS 名称也不是 FQDN 格式(= IP 地址),默认配置下就不会使用 Kerberos |
最后要看的是连接目标与进程名
这条路径上特别有价值的,是8001 的“目标服务器”和“客户端进程名”。前者直接告诉你“为什么没走 Kerberos”,后者直接告诉你“问题出在谁身上”。微软的指南也说明,从这些信息可以判定用户连接的是 Web 服务器的 IP 地址,而没有使用本来可以走 Kerberos 的 NetBIOS 名称或 FQDN。3
4.3. 用 PowerShell 做汇总
步骤 1:数一数这台机器上记录了哪些事件 ID
在事件查看器的图形界面里翻几千条并不现实,所以用 Get-WinEvent 汇总。先确认这台机器上各类事件各有多少条。
# 按 ID 汇总 NTLM/Operational 的事件(以管理员权限执行)
Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-NTLM/Operational'
StartTime = (Get-Date).AddDays(-7)
} -ErrorAction SilentlyContinue |
Group-Object Id |
Sort-Object Count -Descending |
Select-Object Count, @{ N = 'EventId'; E = { $_.Name } }
步骤 2:打开一条 8001,确认实际的项目名
确认有事件之后,把客户端一侧的 8001 按“连接目标服务器 × 调用方进程”归并。事件的字段构成因事件 ID 而异,所以先用 Format-List 打开一条确认结构,再决定汇总时用哪个项目名,这样比较稳妥。
# 先只确认一条的内容
$sample = Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-NTLM/Operational'
Id = 8001
} -MaxEvents 1
$sample | Format-List TimeCreated, Id, Message
# 想看结构化字段时
([xml]$sample.ToXml()).Event.EventData.Data |
Select-Object Name, '#text'
步骤 3:按连接目标 × 调用方进程汇总
弄清结构之后,用 XML 的 Name 属性取值并汇总。属性名在不同的操作系统版本之间有差异,按名称取比按位置取更不容易坏。
# 把最近 7 天的 8001 按“连接目标 × 调用方进程”汇总
$events = Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-NTLM/Operational'
Id = 8001
StartTime = (Get-Date).AddDays(-7)
} -ErrorAction SilentlyContinue
$rows = foreach ($e in $events) {
$data = @{}
foreach ($d in ([xml]$e.ToXml()).Event.EventData.Data) {
$data[$d.Name] = $d.'#text'
}
[pscustomobject]@{
Time = $e.TimeCreated
# 只取实际存在的字段名,并按优先级取
Target = @('TargetName', 'TargetServer', 'ServerName') |
Where-Object { $data.ContainsKey($_) } |
ForEach-Object { $data[$_] } | Select-Object -First 1
Process = @('ClientProcessName', 'ProcessName', 'ApplicationName') |
Where-Object { $data.ContainsKey($_) } |
ForEach-Object { $data[$_] } | Select-Object -First 1
}
}
$rows | Group-Object Target, Process |
Sort-Object Count -Descending |
Select-Object Count, Name
步骤 4:比起条数,更要看连接目标与负责的应用
最后的汇总会返回 Count(条数)和 Name(把 连接目标, 调用方进程 用逗号连起来的字符串)两列。也就是说输出是这个样子(值只是用于说明的示例)。
Count Name
----- ----
412 192.168.1.10, System
118 fileserver.corp.example.com, System
57 192.168.1.24, MyBizApp.exe
9 legacy-nas, System
该看的是 Name 的前半段,也就是连接目标。逐行的读法如下。
Name 的形态 |
含义 | 接下来做什么 |
|---|---|---|
前半段是 IP 地址(例:192.168.1.10, ...) |
最危险的模式。默认情况下主机名为 IP 地址时不会尝试 Kerberos 认证,所以这一行从结构上就不可能走 Kerberos10 | 把连接目标改成 FQDN(第 6 章)。从条数多的行开始消,总量会一下子减下来 |
| 前半段是 NetBIOS 名称或 FQDN | 名称本身是正常的。即便如此还是走了 NTLM,那就是 SPN 未注册、别名或路径的问题 | 用第 5 章的表把原因归类 |
后半段是 System 之类的系统侧进程 |
很可能是经由 SMB(PID 4)。调用方应用只能查到这一步 | 在服务器端的 8003 上确认 PID 是不是 4,然后只在那一台终端上布置 ProcMon(4.5 节) |
后半段是可执行文件名(例:MyBizApp.exe) |
根源应用已经确定的状态。最好修 | 把那个应用的连接目标配置都过一遍(8.2 节) |
Name 的后半段为空,或者所有行都为空 |
汇总用的字段名与实际的架构对不上 | 把上一步确认到的名称加进候选数组 |
条数的绝对值本身意义不大。请看这两点:“IP 地址目标的行有没有排在前列”“能查到可执行文件名的行有几条”。前者是改了就一定会减少的依赖,后者是能分派负责人的依赖。
如果汇总出空值或 PID,就要重新检查项目名
字段名在不同的操作系统版本之间有差异,所以这里采用的写法是把候选按优先级排成数组,只取其中真实存在的。这里如果用 -match 'Process' 这样的部分匹配,连 ClientProcessId 这种 PID 字段也会被匹配上,就可能不是按可执行文件名、而是按每次都变的 PID 来汇总(哈希表的键顺序不确定,取到哪一个也不稳定)。如果 Process 列全是空,那就是候选名与实际架构对不上的信号,请把上一步确认到的名称加进数组。
扩大到多台之前,先在一台上把读法统一
要从多台机器上收集的话,用 PowerShell Remoting 并行跑更快(《PowerShell Remoting(WinRM)入门——批量管理多台 Windows》)。Get-WinEvent 的筛选用不用 -FilterHashtable,耗时会差一个数量级,这方面的要领整理在《用 Get-WinEvent 实务排查事件日志——筛选速度决定调查时间》。
4.4. 从安全日志一侧看——NTLMv1 是否还在被使用
除了 NTLM/Operational,还有一种办法是从安全日志的登录事件确认 NTLM 的版本。步骤是:在安全日志中搜索“身份验证包”,再看每条事件的“详细身份验证信息”。3
详细身份验证信息:
登录进程: NtLmSsp
身份验证包: NTLM
传递服务: -
包名称(仅限 NTLM): NTLM V1
密钥长度: 128
NTLM V1 的记录要单独列出、优先处理
这个“包名称(仅限 NTLM)”表示用到了 NTLM 协议族中的哪个子协议。3 出现 NTLM V1 的主机,就是直接升级到 Windows 11 24H2 / Windows Server 2025 后认证会通不过的候选。因为 NTLMv1 在这些版本中已被移除。1 跑审计时,唯独这个视角要提高优先级去取。
4.5. 当 PID 全是 4(SYSTEM)、推进不下去时
一开始做审计,几乎必然会撞上这堵墙。像 SMB(共享文件夹)这样经由重定向器通信的应用,发起认证请求的主体是内核模式的重定向器,因此事件里留下的 PID 始终是 4(SYSTEM)。3
用日志把终端缩小到一台,再用 ProcMon 追那一台
微软的指南给出的处理办法如下。3
- 在正在发送 NTLM 凭据的客户端(8001 的“计算机”)上装上进程监视工具。
- 用对端服务器的计算机名和 IP 地址两者过滤路径。需要长时间采集就用后台模式跑。
- 把采集结果与服务器端事件 8003 的时间戳对照。用户、路径、认证标识符能对上,由此就能确定调用方应用程序。
工具是 Process Monitor(ProcMon)。过滤器怎么加、结果怎么读,整理在《Process Monitor(ProcMon)实战指南——10 分钟定位“配置未生效”“ACCESS DENIED”问题》。
再补一条实务上的诀窍:先只用事件日志把“是哪台终端”彻底缩小到这一步,再只在那一台终端上布置 ProcMon,速度会快得多。给所有机器都发 ProcMon 并不现实。
5. 回退到 NTLM 的典型模式
审计把位置查清之后,接下来是原因分类。微软的指南列出了理论上支持 Kerberos、却仍会使用 NTLM 的应用程序的以下 4 类。3
- 可以选择各种安全配置或提供程序的应用程序
- SPN(服务主体名称)未正确配置的应用程序
- 因配置失误或供应商文档,使用 IP 地址而非 DNS 名称的应用程序
- 拥有遗留代码库、其中还留有 NTLM 专用部分的应用程序
微软日本的支持博客列举的、导致使用 NTLM 的代表性原因有:以 IP 地址指定的方式访问服务器、防火墙对 Kerberos 所需端口的限制、SPN 未注册、对信任关系对端的认证、工作组环境中的认证。2
把原因与修改的优先级记在同一张表里
把这些整理成现场遇到的形态,就是下面这张表。右边两列是用来排优先级的基准。“影响范围”表示停掉之后会造成多大范围的困扰,“修改难易度”表示能不能只凭本公司的判断就改好。有了这两项,直接就是计划书里的动手顺序。
| 症状、配置 | 走 NTLM 的原因 | 确认方法 | 分类 | 影响范围 | 修改难易度 |
|---|---|---|---|---|---|
像 \\192.168.1.10\share 这样用 IP 地址连共享文件夹 |
默认情况下主机名为 IP 地址时不会尝试 Kerberos 认证10 | 事件 8001 的“目标服务器”是 IP 地址 | 马上能改 | 大(条数多) | 高(本公司即可完成) |
| 业务应用的连接目标配置写的是 IP 地址 | 同上。供应商手册里写成 IP 指定的情况很多 | 用事件 8001 的“客户端进程名”定位到该应用 | 马上能改 | 中~大 | 高(只改配置) |
| 用 DNS 的别名(CNAME)或 hosts 里的自定义名访问 | 没有为那个名称注册 SPN | 确认相应服务账户的 SPN 一览 | 注册 SPN 就能改好 | 中 | 中(涉及 AD 侧的作业与协调) |
| 自研的服务/IIS 站点用专用账户运行 | 服务账户未注册 SPN | 同上 | 注册 SPN 就能改好 | 中 | 中(需要确认是否重复注册) |
| 跨站点或跨 VPN 到不了域控制器 | Kerberos 所需的通信不通,于是回退 | 防火墙规则与 DC 可达性 | 路径的问题 | 大(整个站点) | 低(要改网络架构) |
| NAS、多功能一体机、扫描仪的 SMB 发送目标是 Windows 共享 | 设备侧不支持 Kerberos,或者用本地账户认证 | 设备的认证配置,以及服务器端的 8003 | 取决于设备 | 中(业务范围明确) | 低(取决于供应商答复与设备更换) |
| 工作组机器、用本地账户访问共享(两端都是新版 Windows) | 因为不是域账户,本来就不在 Kerberos 的场子里 | 域控制器上不出现 8004 | 阶段 2 可能解决 | 中 | 低(等功能提供。2.1 节) |
| 同上,但对端是老版 Windows 或第三方设备 | 同上。但本地 KDC 只在受支持的 Windows 之间才有效 | 确认对端的操作系统版本/机型 | 自己想办法(加入域、更换设备、换别的协议、走例外) | 中 | 低(牵涉更换设备的预算与时机) |
| 对第三方域、无信任关系的对端做认证 | 无法签发 Kerberos 票据 | 事件 8001 的“指定的域” | 需要设计层面的判断 | 小~中 | 低(要与对方协调) |
| 可以选择认证方式的老套装产品 | 配置里被固定成了 NTLM | 产品的认证设置界面 | 改配置或找供应商确认 | 中 | 中(能靠配置解决的话就是高) |
把 NTLMv1 放在最优先,长周期的协调并行启动
动手顺序,从这两列就能机械地定出来。
- 无论影响范围如何,最优先的是只会说 NTLMv1 的设备,以及记录到
NTLM V1的主机(4.4 节)。因为唯独这里“期限已经到了”,所以放在优先级计算之外。1 - 其次是影响范围 = 大,且修改难易度 = 高的,也就是写死 IP 地址。条数多,而且只凭本公司的判断就能改。第一个月请集中在这里。
- 再往下是修改难易度 = 中的 SPN 相关。与名称的统一一并推进。
- 修改难易度 = 低的那些(取决于设备、路径、等阶段 2),并不是动手要往后拖,而只是前置周期长,所以向供应商的问询和预算申请要与第 1~3 项并行、提前启动。
被归入“马上能改”和“注册 SPN 就能改好”的,应该会占审计结果的大部分。光把这些消掉,剩下的例外就会少很多。
6. 修改方式的判断表
按第 5 章标上的分类来选处理办法。先推进改为 FQDN 和确认 SPN,TryIPSPN 只作为改不了名称时的最后手段。IIS 的 SPN 注册对象有例外,动手之前请先看 8.3 节的“解密票据的身份”。
| 分类 | 要做的事 | 注意事项 |
|---|---|---|
| 写死 IP 地址 | 把连接目标改成 FQDN。共享文件夹的快捷方式、驱动器映射、应用的配置文件、批处理、任务计划程序的参数,全都要过一遍 | 先确认名称解析确实有效。网络驱动器与 UNC 路径相关的坑,整理在另一篇文章里 |
| 写死 IP 地址,但实在改不成名称 | 在客户端设置 TryIPSPN,并用 Setspn -s <服务类>/<IP 地址> <账户> 手动注册 IP 地址的 SPN |
最后的手段。要注册的是客户端实际请求的服务类。共享文件夹等映射到 HOST 的服务用 host/192.168.1.1 就够,但 Web 需要 HTTP/192.168.1.1、SQL Server 需要 MSSQLSvc/192.168.1.1:1433 这种连端口都带上的另一个 SPN,只注册 host/ 是对不上的,还是会回退到 NTLM。微软自己也说,IP 地址是临时性的,通常不用在 SPN 里,只在无法改为 DNS 名称时才作为手动作业使用。用 DHCP 的话以静态保留为前提。设置需要在访问一侧的每台客户端上做10 |
| SPN 未注册 | 对运行该服务的账户,按访问所用的名称注册 SPN | SPN 重复注册会把 Kerberos 认证本身弄坏。注册前务必确认是否已有重复 |
| 用别名(CNAME)访问 | 要么给别名也注册 SPN,要么把访问统一成 FQDN | 原因是“本来的名称”和“实际被使用的名称”对不上,所以要先决定往哪一边统一 |
| 到不了 DC 的站点 | 把 Kerberos 所需的通信放通。如果是永久到不了的架构,阶段 2 的 IAKerb 可能成为解法 | IAKerb 与本地 KDC 计划 2026 年下半年提供。本公司的目标版本上实际能不能用,要按发行说明确认2 |
| 使用本地账户 | 先按对端的身份分类。如果是受支持的 Windows 之间,阶段 2 的本地 KDC 可能成为解法,但老版 Windows 和第三方设备(NAS、多功能一体机等)不在其列。后者要从加入域、更换设备、改用别的协议、放进例外列表中选一个 | 不要用“是本地账户所以等阶段 2”一句话把它们打包搁置。IAKerb 解决的是 DC 的可达性,而不是本地账户或第三方设备能不能支持。在本地登录认证和工作组配置中,NTLM 今后仍然是必需的62 |
| NAS、多功能一体机 | 向厂商确认固件的支持状况。如果做不到支持 Kerberos,就改用 SMB 以外的发送路径(SMTP、FTPS、专用文件夹),或者更换设备 | 只会说 NTLMv1 的设备最优先。Windows 11 24H2 / Server 2025 上已经移除1 |
| 可以选择认证方式的产品 | 在配置里选 Negotiate/Kerberos。选不了就向供应商确认路线图 | “暂无支持计划”这个答复,可以作为更新计划的材料 |
| 自研应用 | 把点名指定 NTLM 的地方换成 Negotiate(第 8 章) | 要改的不只是代码,还有连接目标的写法 |
| 实在留得下来的 | 登记到服务器例外列表,并每年数一次它的条数 | 例外是“消掉之前的宽限”,不是解决。要以条数有没有减少作为指标7 |
7. SMB 的 NTLM 阻止——实地验证的最短路径
审计日志能告诉你“正在被使用”,但不会告诉你“停掉会怎样”。这时派上用场的,是Windows Server 2025 与 Windows 11 版本 24H2 中新增的、SMB 客户端一侧的 NTLM 阻止。4
这个功能会阻止 SMB 客户端在对远程的传出连接中使用 NTLM 认证。微软表示,这样可以防止诱使客户端向恶意服务器发送 NTLM 请求的手法,对抗暴力破解、密码破解和 Pass-the-Hash 攻击,并进一步把它定位为把组织的认证协议切换到 Kerberos 所必需的一环。同时也写道,即便不完全禁用 NTLM,也可以只启用这一层防护。4
注意:这个功能是SMB 客户端一侧的功能。4 SMB 以外的路径(自研应用的 HTTP 通信、到 SQL Server 的连接、WinRM 等)上的 NTLM,用它是拦不住的。那些要按第 5 章的分类逐个消掉。
前提条件有下面两条。4
- SMB 客户端是 Windows Server 2025 或更高版本,或 Windows 11 版本 24H2 或更高版本
- 连接目标的 SMB 服务器能够使用 Kerberos(SMB 服务器一侧的操作系统,只要能用 PKU2U 或 Kerberos,什么都行)
7.1. 先只用一台设备、一个连接来试
不要一上来就下发策略,而是利用可以按连接单位指定阻止这一点。不过要做出判断,需要清除已有会话,并确认不加标志时能连上。下面两条命令只是指定方式的示例,实际的测试请按再下面的 4 个步骤来做。
# 只对这个连接禁用 NTLM 再连一次(连上了,就说明这个共享不用 NTLM 也够)
NET USE \\fileserver.corp.example.com\share /BLOCKNTLM
# 用 PowerShell 的映射也能做同样的事
New-SmbMapping -RemotePath \\fileserver.corp.example.com\share -BlockNTLM $true
满足必要前提后能连上,就可以判断这条路径不用 NTLM 也成立。失败时,要与不加标志的测试对照,把原因区分开。因为不改策略就能一个连接一个连接地确认,所以适合用来核实审计日志。
结果要分成下面 3 个层面来确认。不要只凭错误消息的措辞就断定是依赖 NTLM。
| 想确认的事 | 确认位置 | 读法 |
|---|---|---|
| 有没有连上 | 命令的结果、net use 的列表、Get-SmbConnection -ServerName <服务器名> |
成功就会建立映射,失败则以错误结束、不会留下映射 |
| 失败是不是 NTLM 引起的 | 下面步骤 3 中做的、与不加标志的连接的对照 | 如果不加标志也失败,那就是名称解析、凭据、访问权限等别的问题 |
| 实际的认证方式是什么 | klist 中该服务器的 cifs/ 票据,或者服务器端的安全日志 |
把“没用 NTLM”和“用了 Kerberos”区分开。详见本节末尾 |
避免误判的 4 个步骤
不过这个确认是有步骤要求的。不假思索地执行,两个方向上都会误判。
$server = 'fileserver.corp.example.com'
# 1. 把到那台服务器的映射“一个不剩”地断开
# 只要还留着别的共享,按服务器为单位的会话就会一直活着
net use | Select-String $server # 先看看都连着什么
net use \\$server\share /delete
net use \\$server\other /delete # 同一台服务器的其他共享也全部断开
# 2. 确认会话真的消失了(不变空就不要往下走)
Get-SmbConnection -ServerName $server
# 3. 先确认不加标志能连上(这里就失败的话,是 NTLM 以外的问题)
net use \\$server\share
net use \\$server\share /delete
Get-SmbConnection -ServerName $server # 这里也要恢复成空
# 4. 在此之上再加 /BLOCKNTLM 试一次
net use \\$server\share /BLOCKNTLM
步骤 1~2:要清除的不只是共享,而是到服务器的会话
SMB 的会话是按服务器为单位,而不是按共享为单位。只要到那台服务器的已认证会话还在,重定向器就不会重新认证,而是直接复用它。/BLOCKNTLM 生效的只是为那次映射所做的认证,不会回过头去检验已经建立的会话(它可能就是用 NTLM 建起来的)。
也就是说,只把测试对象的共享 /delete 掉是不够的。同一台服务器的别的共享还连着的话,明明存在 NTLM 依赖也会测成功。请一直断到 Get-SmbConnection 什么都不返回为止。除了自己的映射之外,常驻应用或备份作业也可能占着会话。要想稳妥,从一台从未连过那台服务器的终端上试,是最快的。
步骤 3:把不加标志时的成功,当作比较的基准
名称解析失败、凭据错误、对共享本身的访问权限不足,同样会让带 /BLOCKNTLM 的执行失败。如果不加标志也失败,那就不是依赖 NTLM,而是别的问题。
就算成功了,也不等于认证方式自动就定下来了
这里能说的只到“没有用到 NTLM”,说不到“是用 Kerberos 认证的”,这一点要注意。这个功能的前提条件是“能使用 Kerberos 的 SMB 服务器”,但也说了连接目标可以是能用 PKU2U 的操作系统。4 也就是说,成功的原因有可能不是 Kerberos 而是 PKU2U。对端是已加入域的文件服务器时基本不成问题,但如果想把实际用什么认证也确定下来,请在连接之后在客户端执行 klist,看是否取得了该服务器的 cifs/ 票据;或者在服务器端的安全日志里确认登录事件的身份验证包(4.4 节)。
7.2. 按终端单位启用
核实完成之后,就在试点终端上推进到整台终端的阻止。4
# 在整个 SMB 客户端上阻止 NTLM(需要管理员权限)
Set-SmbClientConfiguration -BlockNTLM $true
用组策略的话,把 计算机配置 > 管理模板 > 网络 > Lanman 工作站 下的 “阻止 NTLM (LM、NTLM、NTLMv2)” 设为已启用。4
7.3. 实在留得下来的对端放进例外列表
未加入域的 SMB 服务器等实在需要 NTLM 的对端,可以设为例外。启用组策略的 Lanman 工作站 > 阻止 NTLM 服务器例外列表,把要放行的对端的 IP 地址、NetBIOS 名称、FQDN 列举出来。4
把永久性的例外与紧急时的注册表操作分开
因为没有提供创建例外列表本身的 PowerShell cmdlet,首次必须在组策略编辑器里设置,但列表建好之后再单独追加,可以用注册表操作完成。4
# 向已有的例外列表追加条目
$params = @{
Path = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\LanmanWorkstation"
Name = "BlockNTLMServerExceptionList"
}
$Entries = "192.168.10.10", "corp.contoso.com", "CORP"
$CurrentValue = (Get-ItemProperty @params -ErrorAction SilentlyContinue).BlockNTLMServerExceptionList
$params["Value"] = if ($null -eq $CurrentValue) { $Entries }
else { $CurrentValue + $Entries }
Set-ItemProperty @params
注意:微软文档里登载的示例,在值还不存在时的分支只是设置
@(""),想追加的条目就这么被丢掉了。4 表现出来就是:首次执行一条例外都进不去,第二次执行才终于进去。所以上面的代码在尚未创建时,也会把待追加的对象直接写进去。话虽如此,这个注册表值本来就是组策略管理的地盘。永久性的例外请在组策略一侧管理,这个操作只限于紧急时的临时处置。下一次策略应用就会把它覆盖掉。
8. 从开发者视角看 NTLM——改用 Negotiate
如果是自己在做 Windows 应用,要改的地方很清楚。微软明确写道:5
应用程序不应直接访问 NTLM 安全包,而应改用 Negotiate 安全包。只要参与认证的系统支持,Negotiate 就能让你用上更先进的安全协议。目前,Negotiate 安全包会在 Kerberos 与 NTLM 之间二选一。除非参与认证的系统中有一方无法使用 Kerberos,Negotiate 都会选择 Kerberos。
也就是说,原则是把写着“NTLM”的地方改成“Negotiate”。弃用功能一览里的描述也一样,说应把对 NTLM 的调用替换为对 Negotiate 的调用。1
8.1. .NET 中常见的“点名指定 NTLM”
不要改用于认证的账户,只替换认证类型
// 反例:在认证类型里点名指定了 NTLM
var credential = new NetworkCredential(user, password, domain);
var cache = new CredentialCache();
cache.Add(new Uri("http://intra.example.local/"), "NTLM", credential);
var handler = new HttpClientHandler { Credentials = cache };
// 正例:只改认证类型。凭据照原样传
var credential = new NetworkCredential(user, password, domain);
var cache = new CredentialCache();
cache.Add(new Uri("http://intra.example.local/"), "Negotiate", credential);
var handler = new HttpClientHandler { Credentials = cache };
这里要改的只有认证类型这个字符串。如果把 credential 换成 CredentialCache.DefaultNetworkCredentials,那变的就不只是认证协议,连做认证的主体也变了。它会用运行该进程的账户(服务账户或当前登录的用户)、而不是你指定的账户去做认证,取决于连接目标的权限配置,可能会跑不起来。协议的替换和凭据的重新审视,请作为两个独立的变更分开推进。
改成用当前用户认证,属于另一个判断
另一方面,如果本来就想用当前登录用户的凭据做认证(集成 Windows 认证),写法可以更简单。这是有意改变“以谁的身份认证”时的写法。
// 集成 Windows 认证(以当前登录用户做认证)
var handler = new HttpClientHandler
{
UseDefaultCredentials = true,
};
HttpClient 本身怎么用(不要用 using 包住、创建模式、超时设计),整理在《不要用 using 包裹 HttpClient》里。
直接使用 SSPI 时,同样要指定 Negotiate
如果必须直接使用 SSPI,可以用 .NET 7 以后新增的 System.Net.Security.NegotiateAuthentication,从托管代码里处理经由 Negotiate 的认证。这里的要点同样是不要在包名里指定 NTLM。
8.2. 比代码更该先看的“连接目标的写法”
就算改了代码,只要连接目标还是 IP 地址,最后还是会回退到 NTLM。因为默认情况下主机名是 IP 地址时,Windows 不会对那台主机尝试 Kerberos 认证,而是回退到 NTLM 等其他可用的协议。10 具体请把下面这些过一遍。
- 配置文件(
appsettings.json、App.config、ini 文件)里写的服务器名 - SQL Server 连接字符串里的服务器指定(
Data Source) - 拼接 UNC 路径的地方。有没有硬编码的 IP 地址
- 安装程序或装机手册里的默认值
- 过去处理故障时以“名称解析不稳定”为由改成 IP、之后一直没改回来的地方
最后一项真的非常容易翻出来。写死 IP 地址在当时是正确的应急处置,但现在是技术债。
8.3. 如果你在做服务一侧
想让自研的 Windows 服务或 IIS 应用用 Kerberos 接受认证,就需要对解密票据的账户,按客户端访问时所用的名称注册 SPN。“未注册 SPN 的应用程序,即便声称支持 Kerberos 也会回退到 NTLM”,这正是微软自己举出的典型例子。3
在 IIS 中,应用程序池的身份未必就是解密的身份
如果简单地认为注册对象是“运行服务的账户”,在 IIS 上就会栽跟头。IIS 的 Windows 身份验证默认启用内核模式身份验证,此时解密 Kerberos 票据的不是应用程序池的身份,而是HTTP.sys 使用的计算机账户。仅仅因为用专用的域账户运行应用程序池,就把站点的 HTTP SPN 注册到那个账户上,会造成SPN 的所有者与实际解密的账户对不上,结果不只是回退到 NTLM,而是直接以 KRB_AP_ERR_MODIFIED 认证失败。
要点是“让 SPN 的注册对象与解密票据的身份保持一致”。可选的形态有下面两种。
| 解密票据的身份 | 需要的配置与 SPN 的注册对象 |
|---|---|
| 计算机账户(保持默认) | 如果站点以主机名对外发布,就把该主机名的 HTTP SPN 注册到计算机账户 |
| 应用程序池的身份 | 启用 useAppPoolCredentials,并把 HTTP SPN 注册到应用程序池的账户 |
选哪一种,取决于是否有多台服务器共用同一个服务账户(共用的话,统一到应用程序池身份的形态更好处理)。另外一个 SPN 只能注册到一个账户上,所以切换时别忘了删除旧的注册。重复注册会把 Kerberos 认证本身弄坏。
到其他服务器的委派,要和协议变更一并确认
如果采用了冒充客户端去访问其他服务器的设计(委派),NTLM 与 Kerberos 的处理方式不同。Kerberos 支持服务代表客户端去连接其他服务的委派机制,而 NTLM 提供的只到本地模拟所需的授权信息为止。8 模拟相关的实现,在《正确处理 Windows 的模拟令牌》里讲过。
9. 逐级收紧的路线图
把以上内容汇总起来,推进顺序如下。每个阶段都以“能退回去”为条件。
| 阶段 | 要做的事 | 完成的判断 |
|---|---|---|
| 0. 准备 | 重新审视事件日志的大小与保留期限。如果有收集机制(WEF 等),确认其路径 | 启用审计后日志不会被覆盖丢掉 |
| 1. 可视化 | 启用 3 项审计策略,一直收集到业务走完一轮(至少要跨过一次月结) | 做出了“终端 × 连接目标 × 进程”的清单,低频处理也跑完了 |
| 2. 分类 | 用第 5 章的表把原因归类。出现 NTLMv1 的主机单独列出、最优先 | 每一行都有了负责人和分类 |
| 3. 修名称 | 把写死的 IP 地址改成 FQDN。注册 SPN | 相应的 8001 事件不再出现 |
| 4. 核实(SMB) | 用 NET USE /BLOCKNTLM 一个连接一个连接地确认(按 7.1 节的步骤) |
主要共享不用 NTLM 也能连上 |
| 5. 试点(SMB) | 在信息部门的终端等几台机器上执行 Set-SmbClientConfiguration -BlockNTLM $true |
跨过一次月结处理,业务没有受影响 |
| 6. 推广(SMB) | 用组策略下发 SMB 的 NTLM 阻止。例外列表尽量做到最小 | 例外列表的条数在可管理的规模 |
| 6b. SMB 以外 | 把 HTTP、SQL Server、WinRM、自研应用剩下的部分,按“到远程服务器的传出 NTLM 流量”的审计 → 登记例外 → 拒绝顺序收紧。整个域则用“此域中的 NTLM 身份验证”按同样的顺序推进 | SMB 以外的 8001 事件也不再出现 |
| 7. 持续 | 定期清点SMB 的例外列表与 Restrict NTLM 的服务器例外列表这两者的条数。跟进阶段 2 的功能提供 | 每年例外都在减少 |
9.1. 就算把 SMB 停了,那也只是 NTLM 对策的一半
阶段 4~6 处理的只是SMB。正如第 7 章提到的,SMB 客户端的 NTLM 阻止是 SMB 客户端一侧的功能,4 对其他路径无效。在阶段 2 里被归类为“在用 HTTP 认证”“SQL Server 走了 NTLM”“WinRM 在用 NTLM”的那些,即便推进到阶段 6 也仍然原封不动地留着。而且它们也不会出现在 SMB 的例外列表里,所以数条数也看不见。
SMB 以外用 Restrict NTLM,按审计 → 例外 → 拒绝推进
收紧那一块的是阶段 6b。用的就是第 4 章里改成审计模式的那 3 项策略本身。步骤也是同一个形状。11
- 保持“到远程服务器的传出 NTLM 流量”为全部审核,把还剩下的连接目标梳理出来
- 把实在必需的对端登记到“添加远程服务器的 NTLM 身份验证例外”
- 在试点终端上切换为全部拒绝,等业务走完一轮
- 没有问题就推广
整个域也要先用对应的审计确认影响,再转拒绝
对整个域,则用“此域中的 NTLM 身份验证”,同样按审计 → 例外(“添加此域中的服务器例外”)→ 拒绝的顺序推进。12 微软也表示,在选择拒绝选项之前,应把对应的审核策略设为同一选项以评估影响。12
并不是“阻止了 SMB,NTLM 对策就完成了”。要作为完成指标的话,请把 SMB 的例外列表和 Restrict NTLM 的服务器例外列表两边都清点一遍。
9.2. 审计周期不按“天数”定,而按“业务走完一轮”定
阶段 1 里最容易失败的,就是周期的定法。要是按“收了两周就算完成”来办,那两周里没有跑过的处理就不会出现在清单上。而没上清单的东西,会在阶段 6 下发阻止之后才第一次坏掉。
不只是月度处理,恢复流程和离线终端也要梳理
具体来说,容易漏掉的是下面这些。
- 月度、季度的结账处理。月末批处理用写死的 IP 地址连共享文件夹或数据库,就是典型例子。
- 年度处理。盘点、年度切换、决算相关。
- 只有出故障时才会走的路径。从备份恢复的步骤、切换到备用服务器、DR 演练。
- 长期离线的终端。外带 PC、长假中的负责人的终端、平时不开机的备用机。
- 一年只用几次的业务应用。
等不及的话,就有意地把低频处理跑一遍
微软的指南自身也说,分析视部署的复杂程度可能长达数月。3 现实的划线方式是下面两种之一。
- 一直跑审计,直到业务走完一轮。至少跨过一次月结,可以的话跨过一个季度。
- 把低频处理梳理出来,有意地跑一遍。等不了那么久的话,就在验证环境里跑一遍结账处理或 DR 步骤,把结果加进清单。要点是先通过向负责人问询,把那些“只是因为没跑过所以没出现”的处理提前列出来。
无论哪一种,都请在能够区分“没有出现事件”和“还没有跑过”的状态下,再进入下一阶段。
9.3. 不要一口气推到拒绝
这里的要点是不要一口气把“传出 NTLM 流量 = 全部拒绝”推上去。微软也表示,把这项策略设为拒绝会导致大量 NTLM 认证请求失败、可能降低生产率,因此实施之前应先用“全部审核”查看日志、对服务器做分析,并做出要排除的例外列表。7 对于面向整个域的“此域中的 NTLM 身份验证”策略,也写有同样的警告。12
10. 小结
- NTLM 在 2024 年 6 月被把所有版本标记为弃用。这不是立刻停止的变更,据称在下一版 Windows Server、下一个年度发行版 Windows 中仍将继续可用。1
- 另一方面,NTLMv1 已经被移除(Windows 11 24H2 / Windows Server 2025)。只会说 NTLMv1 的设备,以及记录到
NTLM V1的主机,是最近的期限。1 - 停用分 3 个阶段,阶段 1 是审计,阶段 2(2026 年下半年)是 IAKerb 与本地 KDC,阶段 3 是默认禁用。2
- 审计是把 3 项策略改成审计模式,收集
Microsoft-Windows-NTLM/Operational。如果是域账户,按 DC 的 8004 → 成员服务器的 8003 → 客户端的 8001 的顺序,最后能追到应用名。本地账户的认证不会出现 8004,所以要从服务器和客户端的事件中取。37 - 经由 SMB 时 PID 始终是 4(SYSTEM)。请先用事件日志把范围缩小到终端,再用 ProcMon 追那一台。3
- 原因大多出在“名称”上。光是把写死的 IP 地址和未注册的 SPN 消掉,剩下的例外就会大幅减少。32
NET USE \\server\share /BLOCKNTLM是不改策略、只用一个连接就能核实的最安全的确认手段。4- 自研应用要把点名指定 NTLM 的地方换成 Negotiate,并把连接目标的写法统一成 FQDN。5
- 例外列表不是解决,而是宽限。请以条数是否每年都在减少作为指标。
相关文章
- 图解 NTLM 与 Kerberos——为什么认证会“回退”到 NTLM
- 网络驱动器与 UNC 路径的陷阱——业务应用中处理文件服务器(共享文件夹)的实务
- 用 Get-WinEvent 实务排查事件日志——筛选速度决定调查时间
- Process Monitor(ProcMon)实战指南——10 分钟定位“配置未生效”“ACCESS DENIED”问题
- PowerShell Remoting(WinRM)入门——批量管理多台 Windows
- PowerShell 中凭据的安全处理方式——把明文密码逐出脚本
- 在 WinForms/WPF 应用中集成 Entra ID 认证——MSAL.NET 与 WAM Broker 的实务架构
- Windows 的 TPM 是什么——图解“不外泄密钥的保险柜”与度量启动
相关咨询领域
小村软件有限公司承接 NTLM 依赖的盘点、伴随迁移到以 Kerberos 为前提的业务应用改造,以及认证相关的故障排查。
参考链接
-
Microsoft Learn,Deprecated features in the Windows client。关于包含 LANMAN、NTLMv1、NTLMv2 在内的所有版本的 NTLM 都不再是积极功能开发的对象、属于弃用状态,NTLM 的使用在下一版 Windows Server 与下一个年度发行版 Windows 中仍将继续可用,应把对 NTLM 的调用替换为对 Negotiate 的调用(Negotiate 会先尝试用 Kerberos 认证、只在必要时回退到 NTLM),弃用公告发布于 2024 年 6 月,以及作为 2024 年 11 月的更新,NTLMv1 已从 Windows 11 版本 24H2 及 Windows Server 2025 中移除的说明。同时还关于弃用(deprecated)与移除(removed)是两个不同阶段,被标记为弃用的功能不再被积极开发、并有可能在未来的更新中被移除这一定位的说明。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12
-
Microsoft Japan Windows Technology Support Blog,关于面向 NTLM 停用的应对措施。关于 NTLM 停用按 3 个阶段推进(阶段 1 = 使用情况的可视化与审计,阶段 2 = 计划于 2026 年下半年提供的应对 NTLM 依赖场景的功能,阶段 3 = 在下一个主要版本中默认禁用网络 NTLM 认证),为审计而设置的 3 项组策略(审核此域中的 NTLM 身份验证、审核传入 NTLM 流量、到远程服务器的传出 NTLM 流量 = 全部审核)以及用 NTLM/Operational 日志做确认,迁移到 Kerberos 时应考虑利用 IAKERB 与本地 KDC、且本地 KDC 计划于 2026 年下半年提供,应用程序应使用 Negotiate,以及导致使用 NTLM 的代表性原因包括以 IP 地址指定的方式访问服务器、防火墙对 Kerberos 所需端口的限制、SPN 未注册、对信任关系对端的认证、工作组环境中的认证的说明。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12
-
Microsoft Learn,Viewing events for assessing NTLM usage。关于可以在安全日志的登录事件中搜索“身份验证包”、并从“详细身份验证信息”的“包名称(仅限 NTLM)”判别是 NTLM V1 还是 V2,分析视部署的复杂程度可能长达数月,理论上支持 Kerberos 却仍会使用 NTLM 的应用程序的 4 种类型(可以选择安全配置或提供程序的应用、SPN 未正确配置的应用、因配置失误或供应商文档而使用 IP 地址而非 DNS 名称的应用、遗留代码库中留有 NTLM 专用部分的应用),审计所用的 3 项策略设置及其对应的事件 ID,从域控制器的事件 8004(日期时间、安全通道名称、用户名、域名、工作站名称)到成员服务器的事件 8003(日期时间、用户名、域名、工作站名称、PID)、再到客户端的事件 8001(日期时间、目标服务器、指定的用户、指定的域、客户端进程名、客户端进程的用户 ID)的追踪步骤,目标服务器既不是 NetBIOS 格式也不是 FQDN 格式时不会使用 Kerberos,用本地用户账户连接文件服务器时可能不会产生域控制器的事件 8004,以及在 SMB 这类经由重定向器通信的应用中 PID 始终是 4(SYSTEM)、需要用 Process Monitor 在客户端一侧确定调用方进程的说明。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19
-
Microsoft Learn,Block NTLM connections on SMB in Windows Server 2025。关于 SMB 客户端可以在对远程的传出连接中阻止 NTLM 认证,由此可以防止诱使客户端向恶意服务器发送 NTLM 请求的手法、对抗暴力破解、密码破解与 Pass-the-Hash 攻击,把组织的认证协议切换到 Kerberos 需要 NTLM 阻止、而另一方面即便不完全禁用 NTLM 也可以只启用这一层防护,前提条件是 Windows Server 2025 或更高版本、或 Windows 11 版本 24H2 或更高版本的 SMB 客户端以及能使用 Kerberos 的 SMB 服务器,NTLM 阻止是 SMB 客户端一侧的功能、连接目标的 SMB 服务器只要是能用 PKU2U 或 Kerberos 的操作系统即可,组策略中要启用“计算机配置 > 管理模板 > 网络 > Lanman 工作站”的“阻止 NTLM (LM、NTLM、NTLMv2)”,PowerShell 中使用
Set-SmbClientConfiguration -BlockNTLM $true,设置例外的“阻止 NTLM 服务器例外列表”策略中要列举 IP 地址、NetBIOS 名称、FQDN,由于不存在对应的 PowerShell cmdlet、首次需要在组策略编辑器中设置、之后可以通过向注册表值BlockNTLMServerExceptionList追加来逐条添加例外,以及可以用NET USE \\server\share /BLOCKNTLM和New-SmbMapping -RemotePath \\server\share -BlockNTLM $true按驱动器映射为单位阻止 NTLM 的说明。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 -
Microsoft Learn,Microsoft NTLM。关于 NTLM 凭据由交互式登录时得到的域名、用户名,以及密码的单向哈希构成,通过加密的质询/响应在不把密码送上链路的情况下完成认证,非交互式认证的步骤(客户端以明文发送用户名,服务器生成 8 字节随机数即质询并发送,客户端用密码的哈希加密质询并返回响应,服务器把用户名、质询、响应三者送给域控制器,域控制器用从 SAM 数据库取出的哈希做同样的计算并比对),以及应用程序不应直接访问 NTLM 安全包、而应使用 Negotiate 安全包,Negotiate 会在 Kerberos 与 NTLM 之间二选一、除非参与认证的系统中有一方无法使用 Kerberos 否则都会选择 Kerberos 的说明。 ↩ ↩2 ↩3 ↩4
-
Microsoft Learn,NTLM overview in Windows Server。关于 NTLM 认证是包含在 Msv1_0.dll 中的一族认证协议(LAN Manager 版本 1、2 与 NTLM 版本 1、2),通过质询/响应机制认证用户或计算机,资源服务器每次需要新的访问令牌时,域账户就去查询域控制器的认证服务、本地账户则查阅本地的账户数据库,配置为工作组成员的系统的 Windows 认证以及域控制器之外的本地登录认证依然在使用、而且必须使用 NTLM,在 Active Directory 环境中 Kerberos version 5 是推荐的认证方式,以及要减少 NTLM 的使用,既需要掌握已部署应用程序的要求,也需要用其他协议的配置步骤的说明。 ↩ ↩2 ↩3
-
Microsoft Learn,Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers。关于取值为“全部允许”“全部审核”“全部拒绝”“未定义”4 个、未定义等同于“全部允许”,推荐的做法是先选“全部审核”并查看操作日志、再做服务器例外列表,设置位置是“计算机配置\Windows 设置\安全设置\本地策略\安全选项”,不需要重启、无论本地保存还是组策略分发都在保存时生效,审核与阻止事件记录在“应用程序和服务日志\Microsoft\Windows\NTLM”的操作日志中、且不存在用于查看这份输出的安全审核事件策略,NTLM 及 NTLMv2 认证对包括 SMB 中继、中间人攻击、暴力破解在内的恶意攻击都很脆弱,以及设为拒绝会导致大量 NTLM 认证请求失败、可能降低生产率,因此应事先用审核评估影响并做出例外列表的说明。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
Microsoft Learn,Kerberos authentication overview in Windows Server。关于 KDC 运行在域控制器上、并把 Active Directory Domain Services 的数据库用作安全账户数据库,Kerberos 支持由服务发起的委派(代表客户端去连接其他服务的机制)、而 NTLM 与 Kerberos 提供的都只是服务在本地模拟客户端所需的授权信息,在 Kerberos 之前的 NTLM 认证中应用服务器每次认证客户端或服务都需要连接域控制器、而在 Kerberos 中可续订的会话票据取代了传递认证、除非需要验证 PAC 服务器不必再去域控制器,以及在 Kerberos 中连接两端都能验证对方的身份、而 NTLM 既不让客户端验证服务器、也不让某台服务器验证另一台服务器,它是为可以假定服务器是真的的环境设计的说明。 ↩ ↩2
-
Microsoft Learn,Assessing NTLM usage。关于在实施使用 Kerberos 等改进后的认证协议的策略或运维之前,必须先发现并审计当前 NTLM 认证流量的状态,应捕捉 NTLM 使用情况的 3 个地点(域内域控制器的传出流量、到远程服务器的传入流量、从客户端到远程服务器的传入流量),以及摸清环境是一项反复迭代的工作的说明。 ↩
-
Microsoft Learn,Configuring Kerberos for IP Address。关于从 Windows 10 版本 1507 及 Windows Server 2016 起可以让 Kerberos 客户端支持 SPN 中的 IPv4/IPv6 主机名,默认情况下主机名为 IP 地址时 Windows 不会对该主机尝试 Kerberos 认证,而是回退到 NTLM 等其他可用的认证协议,应用程序直接写死 IP 地址会导致回退到 NTLM、在逐步禁用 NTLM 的环境中可能引发兼容性问题,为减轻这一影响而引入了可以把 IP 地址用作 SPN 主机名的功能,客户端一侧把注册表值
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Kerberos\Parameters下的TryIPSPN(REG_DWORD,默认不存在)设为 1 即可启用、且需要在每台需要以 IP 地址访问受 Kerberos 保护资源的客户端上设置,以及 IP 地址是临时性的、租约到期与续租可能引发冲突或认证失败,因此通常不应替代主机名使用,基于 IP 地址的 SPN 注册是手动作业、只应在无法切换为基于 DNS 的主机名时使用,注册使用Setspn -s <service>/<ip.address> <domain-user-account>,由于 SPN 在 Active Directory 中一次只能注册到一个账户,使用 DHCP 时建议把 IP 地址静态保留的说明。 ↩ ↩2 ↩3 ↩4 -
Microsoft Learn,Restricting NTLM usage。关于在实施“限制 NTLM”安全策略之前必须先发现并审计当前 NTLM 认证流量的状态,限制 NTLM 流量的 3 个地点(域内域控制器的 NTLM 流量、来自远程服务器的传出 NTLM 流量、从客户端到目标远程服务器的 NTLM 流量),以及为在判定可以接受的服务器上允许 NTLM 认证而配置服务器例外的说明。 ↩
-
Microsoft Learn,Network security: Restrict NTLM: NTLM authentication in this domain。关于取值为“禁用”“拒绝域账户到域服务器”“拒绝域账户”“拒绝域服务器”“全部拒绝”“未定义”,该策略只适用于域控制器、且不影响对域控制器的交互式登录,被拒绝的请求会返回 NTLM 阻止错误、列在“添加此域中的服务器例外”策略的例外列表里的服务器会被排除,以及在选择拒绝选项之前应把对应的审核策略设为同一选项、通过操作日志评估影响的说明。 ↩ ↩2 ↩3
相关文章
共享相同标签的最新文章。可以围绕相近的主题进一步加深理解。
SMB 签名与 LDAP 通道绑定——在实务中收紧 NTLM 对策的“另一半”
在停用 NTLM 之前,抑制中继攻击危害的防御手段是 SMB 签名与 LDAP 签名、通道绑定。本文从实务角度梳理各操作系统的默认值、审计事件的解读方法、推进到强制的步骤,以及业务应用和设备的修复方法。
图解 NTLM 与 Kerberos——认证为什么会“回退”到 NTLM
用图解梳理 NTLM 与 Kerberos 的区别。依据官方文档讲解挑战/响应、TGT 与服务票据、SPN 解析不出来时 Negotiate 回退到 NTLM 的条件、中继攻击与 Pass-the-Hash 成立的原因,直至 NTLMv1 被移除。
Windows LAPS 实务指南——告别全部 PC 通用的本地管理员密码
全部 PC 通用的本地管理员密码,是一台失陷就波及全部设备的 Pass-the-Hash 攻击温床。本文讲解已成为 OS 标准功能的 Windows LAPS 如何自动轮换,如何配置保存到 AD/Entra ID,以及运维中的陷阱。
组策略(GPO)实务入门——原理、生效确认与 Intune 分工
还不清楚“用 GPO 下发”的含义就在操作 AD 环境吗?本文从实务角度讲解组策略原理与 LSDOU 应用顺序、用 gpupdate、gpresult 确认生效、与 Intune 分工,以及客户方 GPO 改变应用行为的陷阱。
Windows 安全审核策略与事件日志排查实务——成为看得懂 4625 的信息系统负责人
这是一份用于回应“帮忙查一下登录失败日志”的实务指南。讲解基本审核策略与高级审核策略的关系、至少应启用的子类别、事件 ID 4624/4625/4688 的读法、Security 日志的容量设计,以及用 Get-WinEvent 提取日志的方法。
相关主题
与本文相近的主题页面。以本文为起点,可以进一步了解相关服务和其他文章。
Windows 技术主题
汇整 KomuraSoft LLC 关于 Windows 开发、故障调查与既有资产活用文章的主题中心。
常见问题
汇总了咨询这一主题时常见的问题。
- NTLM 停用之后,业务从什么时候开始会停摆?
- 仅凭“弃用(deprecated)”这条公告,什么都不会停。微软在 2024 年 6 月把 NTLM 的所有版本标记为弃用,但当时的说明是“在下一版 Windows Server 和下一个年度发行版 Windows 中,NTLM 仍将继续可用”。已经真正失效的具体变更,是 Windows 11 版本 24H2 与 Windows Server 2025 中移除了 NTLMv1。未来版本中默认禁用网络 NTLM 的计划虽已公布,但据称届时仍可通过策略重新启用。也就是说,这不是“某一天全公司突然停摆”那类变更,而是每次把操作系统换新就一点点收紧的变更。正因如此,与其等停摆之后再查,不如趁 NTLM 还能用的时候用审计日志把依赖之处先梳理出来,这才是唯一现实的准备。
- 怎样才能把使用 NTLM 的地方列成清单?
- 把组策略中“网络安全: 限制 NTLM”系列设置改为审计模式,然后收集 NTLM/Operational 日志。在域控制器上设置“审核此域中的 NTLM 身份验证”,在服务器与客户端上设置“审核传入 NTLM 流量”以及“到远程服务器的传出 NTLM 流量 = 全部审核”,事件就会记录到事件查看器的“应用程序和服务日志 > Microsoft > Windows > NTLM”下。如果是域账户的认证,追踪顺序是:先用域控制器的事件 8004 确定用户与连接目标服务器(安全通道名称),再看那台服务器的事件 8003 取得进程 ID,最后用客户端的事件 8001 确定“哪个应用、以哪个服务器名”发出了请求。事件 8001 里包含目标服务器名与客户端进程名,追到这一步就能找出根源应用。不过本地账户的认证不经过域控制器,因此不会产生 8004。工作组机器或用文件服务器的本地账户连接共享的这条路径,只能从服务器端的 8003 与客户端的 8001 中取。请不要只看域控制器的日志就判断“我们这边用得很少”。
- 做了审计,但事件里的 PID 全是 4(SYSTEM),分不清是哪个应用。
- 因为这是经由 SMB(共享文件夹)的通信。SMB 的认证由内核模式的重定向器完成,调用方应用被挡在 SMB 数据包的另一侧,所以事件里留下的 PID 始终是 4(SYSTEM)。微软的指南也明确写到了这种情况,并给出了处理办法:在出现该事件的客户端上运行 Process Monitor(ProcMon),用对端服务器的计算机名和 IP 地址过滤路径,再与服务器端事件 8003 的时间戳对照,从而确定调用方进程。在实务中,先用事件日志把范围缩小到“是哪台终端”,再只对那一台用 ProcMon 追踪,速度最快。
- 本应支持 Kerberos 的应用,为什么会回退到 NTLM?
- 大多数是名称的问题。微软的指南列出了理论上支持 Kerberos 却仍会使用 NTLM 的四类应用:可以选择安全配置或提供程序的应用、SPN(服务主体名称)未正确注册的应用、因配置失误或供应商手册而用 IP 地址而非 DNS 名称连接的应用、遗留代码库中还留有 NTLM 专用部分的应用。如果事件 8001 的“目标服务器”既不是 NetBIOS 名称也不是 FQDN 格式(也就是 IP 地址),那么在默认配置下就不会使用 Kerberos。先做的两步是:把写死的 IP 地址改成 FQDN;如果是用别名访问,就为那个名称注册 SPN。另外,为了应对实在改不成名称的情况,也准备了在客户端设置 TryIPSPN、手动注册 IP 地址 SPN 的做法,但微软自己也说这只应用于无法改为 DNS 名称的场合,所以终究只是最后的手段。
- 我们自己开发的 Windows 应用,应该改哪里?
- 把在认证包中点名指定 NTLM 的地方换成 Negotiate。微软明确写道“应用程序不应直接访问 NTLM 安全包,而应使用 Negotiate 包”。Negotiate 会在 Kerberos 与 NTLM 之间二选一,除非参与认证的系统中有一方无法使用 Kerberos,否则都选 Kerberos。在 .NET 中,典型的修改是把传给 CredentialCache.Add 的认证类型从 "NTLM" 改为 "Negotiate"(指定认证类型的是 CredentialCache.Add,而不是 NetworkCredential 的构造函数)。与此同时还需要:把连接目标写成 FQDN,而不是 IP 地址或写在 hosts 里的别名;如果要让自研服务以 Kerberos 接受认证,还得给那个服务账户注册 SPN。