更新记录(仅首版,2026年07月26日 发布)
- 首次发布
引用本文(DOI(已登记存档): 10.5281/zenodo.22175181)
以下 DOI 指向先前登记的存档,内容可能与当前正文不同。引用当前正文时,请使用本页网址。
Go Komura(2026)。《图解 NTLM 与 Kerberos——认证为什么会“回退”到 NTLM》。小村软件有限公司。 https://comcomponent.com/zh-CN/blog/ntlm-kerberos-explained/
- DOI(已登记存档)
- 10.5281/zenodo.22175181
- DOI(上次登记版本)
- 10.5281/zenodo.22175182
即便是被称作“我们是 Kerberos 环境”的企业内网,只要采集审计日志,也一定会看到 NTLM。而且出现的多半是本应支持 Kerberos 的应用。
这里说的“回退到 NTLM”,不是指认证报错中断,而是指用不上 Kerberos,于是切换到 NTLM。业务照常运转,并不代表实际使用的就是你期望的认证方式。
本文先用图对比 NTLM 与 Kerberos 各自以什么为材料、验证的又是谁。看清这个区别之后,连接目标的名称或账户类型导致认证切换到 NTLM 的原因,以及中继攻击和 Pass-the-Hash 得以成立的原因,都可以用同一套机制来解释。
阅读顺序是机制上的区别 → 发生切换的条件 → 防护与迁移的判断。如果目的是故障排查,请先把“正在用 NTLM 运行”和“认证本身已经中断”区分开,从第 1 章的按目的索引进入第 6 章。
自家环境的盘点步骤(审计策略的设置、事件的追踪方法、修复顺序),汇总在与本文成对的文章《NTLM 停用会导致业务应用停止运行吗》里。
1. 先说结论
最先要把握的是认证的材料、切换到 NTLM 的条件、安全性与迁移方针这三点。
看清机制上的区别
NTLM 根据哈希生成响应,Kerberos 使用指定了连接目标的票据。 NTLM 的凭据是域名、用户名,以及密码的单向哈希。1 在 NTLMv2 中,用从该哈希导出的密钥,以服务器的挑战、时间、客户端一侧的挑战、目标信息为材料计算 HMAC(2.2 节)。2
另一方面,Kerberos 以 SPN(连接目标的服务名)为依据签发服务票据,确认的是“谁、对哪个服务”。3 由这个区别衍生出相互认证、域账户认证时对 DC 的查询、向其他服务的委派这三项差异(第 5 章)。4
把切换与认证错误分开
“以 NTLM 运行”和“因 Kerberos 报错而中断”,排查的入口不同。 切换到 NTLM 的主要原因是直接填 IP 地址、SPN 未注册、工作组、到不了 DC 的路径。其中,能否从连接目标的名称解析出 SPN 尤其关键(第 6 章)。56
与此相对,像时间偏差这种在 Kerberos 已被选中之后才失败的问题,属于认证本身中断的问题。不要认为失败之后一定会改用 NTLM 重试(6.5 节)。7
把握安全性与迁移方针
即使用 NTLMv2,中继攻击和 Pass-the-Hash 的问题依然存在。 中继源于认证往来不绑定目的地,Pass-the-Hash 源于哈希本身就是认证的材料。连接目标是否要求 SMB 签名和通道绑定也在其中,成立条件在第 7 章确认。81
NTLMv1 已在 Windows 11 版本 24H2 和 Windows Server 2025 中移除。NTLMv2 还能工作,但属于弃用对象(第 8 章)。9 应用不要直接指定 NTLM,而应使用优先选择 Kerberos 的 Negotiate,并在此基础上把能让 Kerberos 成立的名称、SPN、连接路径整理好。1
按目的与症状阅读
| 想了解的事、遇到的麻烦 | 先读哪里 | 要点 |
|---|---|---|
| 想了解 NTLM 与 Kerberos 的区别 | 第 2 章:NTLM、第 4 章:Kerberos、第 5 章:对比表 | 区分基于哈希的响应与指定了目的地的票据 |
| 应用明明支持 Kerberos,用的却是 NTLM | 第 6 章:发生切换的条件 | 检查连接目标的名称、SPN、账户、到 KDC 的路径 |
| 认证本身报错 | 6.5 节:与失败的区别 | 不要与回退到 NTLM 混淆,去查时间偏差等原因 |
| 想排查 DC 日志里看不到的 NTLM | 2.3 节:本地账户 | 本地账户的认证在服务器自身就完成了 |
| 想了解用 NTLMv2 是否仍有风险 | 第 7 章:中继与 Pass-the-Hash、第 8 章:弃用与移除 | 把攻击的成立条件与版本的处置分开看 |
| 想了解应用和设备该怎么迁移 | 第 9 章:今后的方向与实务篇 | 区分可以指望新功能覆盖的依赖和要自己修的依赖 |
本文讲的是机制与判断。要实施审计配置和盘点的具体步骤,请前往开头介绍的实务篇。
图中实线表示始终成立的关系,虚线表示带条件的关系(成立条件写在详情页各关系的说明中)。关系的完整列表(共 35 条,附依据与确信度)以及主要概念的定义,汇总在知识地图详情页(日文)。数据:JSON-LD / Turtle
2. NTLM 在做什么
本章先把生成响应的一方和验证的一方分开。先看域账户下三方之间的往来,再确认 NTLMv2 的实际计算,以及本地账户时的差异。
NTLM(Windows Challenge/Response)正如其名,是一种挑战/响应方式的认证协议。把微软的说明概括一下:凭据由交互式登录时得到的域名、用户名,以及密码的单向哈希构成(进行哈希的只有密码);为了不让密码在线路上传输就完成认证,请求认证的一方会做一次计算,以证明自己“能够访问安全保管的 NTLM 凭据”。1
这里重要的是,认证的材料不是密码本身,而是密码的哈希。正是这一点构成了后面要看的 Pass-the-Hash 的成立条件。
2.1. 域账户下会出现三方
设想一个已经登录的用户,用域账户访问服务器上的资源。这属于非交互式认证,登场的是下面三方。1
| 登场角色 | 负责的事情 |
|---|---|
| 客户端 | 用密码的哈希生成响应 |
| 资源服务器 | 发出挑战,并把收到的响应交给 DC 验证 |
| 域控制器(DC) | 用账户数据库里的哈希做计算,与响应比对 |
关键在于,资源服务器不是自己验证域用户的响应,而是把计算交给 DC。
图 1 及其下方的 7 个步骤,是微软概述页面给出的概念层面的流程。NTLMv2 准确的响应计算放在 2.2 节。用图 1 读“谁委托谁验证”,用图 2 读“怎么计算”,就不会混在一起。1
sequenceDiagram
autonumber
participant C as 客户端
participant S as 服务器
participant DC as 域控制器
Note over C: 登录时计算密码的哈希<br/>并丢弃密码本身
C->>S: 用户名(明文)
S->>C: 8 字节随机数(挑战)
Note over C: 用密码的哈希<br/>加密挑战
C->>S: 响应
S->>DC: 用户名 / 挑战 / 响应
Note over DC: 从 SAM 取出哈希<br/>做同样的计算
DC-->>S: 一致则认证成功
S-->>C: 允许访问
图 1:NTLM 的非交互式认证(域账户的情况)
把图 1 拆成步骤,就是下面 7 步。NTLMv2 的响应计算本身,在接下来的 2.2 节改写。
- (仅限交互式认证)用户输入域名、用户名、密码。客户端计算密码的加密哈希,并丢弃真正的密码。
- 客户端把用户名以明文发送给服务器。
- 服务器生成 8 字节随机数(挑战,即 nonce)并发给客户端。
- 客户端用该用户密码的哈希加密这个挑战,把结果(响应)返回。
- 服务器把用户名、发给客户端的挑战、收到的响应这三样发送给域控制器。
- 域控制器根据用户名从 SAM 数据库取出密码哈希,用它加密挑战。
- 把自己算出的结果与客户端的响应比较,相同则认证成功。
2.2. 实际的计算——NTLMv2 要更复杂一些
上面这 7 步,是微软在概述页面讲解的基本形态。当前 Windows 实际使用的 NTLMv2,比“用密码的哈希加密挑战”还要再复杂一层。规范([MS-NLMP])中的定义如下。2
生成响应密钥,再用挑战等材料计算 HMAC
- 响应密钥为
NTOWFv2 = HMAC_MD5( MD4(UNICODE(密码)), 转为大写的用户名 + 域名 ) - 客户端把响应版本、时间、客户端生成的 8 字节挑战、目标信息(AV 对)连接起来,构成
temp - 响应的核心是
NTProofStr = HMAC_MD5( 响应密钥, 服务器的挑战 + temp )
只把材料和处理流程抽出来,就是下面这一张图。
flowchart TD
PW["密码"] --> MD4["MD4(UNICODE(密码))<br/>= NT 哈希"]
UD["转为大写的用户名<br/>+ 域名"] --> H1["HMAC_MD5"]
MD4 -->|"以此作为密钥"| H1
H1 --> KEY["响应密钥 NTOWFv2"]
MAT["响应版本 / 时间 /<br/>客户端的 8 字节挑战 /<br/>目标信息(AV 对)"] --> TEMP["temp"]
SC["服务器的挑战"] --> H2["HMAC_MD5"]
TEMP --> H2
KEY -->|"以此作为密钥"| H2
H2 --> PROOF["NTProofStr"]
PROOF --> RESP["NtChallengeResponse<br/>= NTProofStr + temp"]
TEMP --> RESP
图 2:NTLMv2 响应的生成过程(密码 → NT 哈希 → 响应密钥 → HMAC)
也就是说,实际计算的是不仅混入服务器的挑战,还混入客户端的随机数、时间、目标信息的 HMAC。验证方也要复现同样的计算。账户在 Active Directory 里,就把挑战与响应的组合发给域控制器验证;账户是服务器本地的,就由服务器用自己保管的 OWF 计算期望值。2
计算变复杂了,但有两点没变
对本文的讨论来说重要的是,即使变复杂,下面两点也没有变。
- 密钥的材料到现在仍然是密码的哈希。
NTOWFv2的出发点是MD4(UNICODE(密码)),也就是 NT 哈希本身。2 所以 Pass-the-Hash 能够成立(7.2 节)。 - 客户端并没有验证服务器是不是真的。微软所说的 NTLM 没有相互认证,在 NTLMv2 中同样成立。4
后面的讲解都建立在这两点之上。
2.3. 本地账户下两方就能完成
如果是本地账户,图 1 右侧的域控制器就不见了。
资源服务器在账户是域账户时,会向该域的域控制器上的认证服务查询;而账户是本地账户时,则查阅本地的账户数据库。10
也就是说,工作组机器,或者用文件服务器的本地账户连接共享的情况,域控制器不会出场,而是服务器查自己的 SAM 自行判定的两方往来。
这个差异直接关系到 6.3 节要讲的“因为是本地账户所以用不了 Kerberos”这类依赖的盘点。即使去看域控制器的审计日志,这条路径上的 NTLM 也不会出现。
2.4. 这种设计带来的三个结果
从目前为止的往来中,可以抽出三条会引出后续故障与攻击的性质。
| 性质 | 后面会引出什么 |
|---|---|
| 没有让服务器向客户端证明“我是真的”的步骤 | 相互认证的差异(第 5 章)与中继攻击的成立条件(7.1 节) |
| 验证需要账户的哈希 | 域账户查 DC,本地账户查服务器自身的账户数据库(第 3 章) |
| 响应是针对该次挑战的,但不绑定目的地 | 简单重用旧响应,与中继当前进行中的往来,是两回事(7.1 节) |
第 2 行的查询发生在资源服务器每次需要新的访问令牌时。域账户下向 DC 的认证服务确认,本地账户下向本地的账户数据库确认。10
另外,由于挑战每次都变,同一个响应无法原样重用。但是,把刚收到的挑战与响应在与另一台服务器之间中继,仅凭这一点是防不住的。这个差异在第 7 章来看。
3. 服务器为什么要问域控制器
NTLM 把验证交给持有哈希的一方
域用户的密码哈希在 DC 一侧的账户数据库里。资源服务器不知道该用户的哈希,因此无法自行验证收到的响应。
于是,把用户名、挑战、响应交给 DC 去判定,这就是直通认证。域账户下的 NTLM 认证之所以需要向 DC 查询,正是出自这种职责分工。101
如果是本地账户,确认哈希的地方就是服务器自身的 SAM。“NTLM 要问 DC”这个说法,只适用于域账户的情况。
Kerberos 用票据取代查询
Kerberos 用可更新的会话票据取代了这种直通认证。微软说明,NTLM 中应用服务器每次认证都必须连接 DC,而在 Kerberos 中这种查询就不再需要了。4
不过,需要验证 PAC(特权属性证书)时是例外。这并不等于“用了 Kerberos,服务器与 DC 之间就完全没有通信”。
也就是说,迁移到 Kerberos 除了“能确认对方身份”这项安全性改善,还有减少每次认证对 DC 的依赖这层运维上的意义。下一章来看票据是怎么承担这个角色的。
4. Kerberos 在做什么
NTLM 是每次认证都请别人验证响应,而 Kerberos 则是先完成身份确认拿到票据,再把这张票据用于后续认证。图 3 展示了从最初的身份确认到连上服务的整个流程。
KDC(密钥分发中心)运行在域控制器上,把 Active Directory Domain Services 的数据库当作安全账户数据库使用。4
看图之前,先把名称和票据分开
| 术语 | 在本章中的角色 |
|---|---|
| KDC(密钥分发中心) | 运行在域控制器上,负责身份确认与签发票据 |
| SPN(服务主体名称) | 客户端用来指定想连接的服务的名称 |
| TGT(票据授予票据) | 申请服务票据时向 KDC 出示的票据 |
| 服务票据 | 向连接目标的服务出示的、发给该目的地的票据 |
图 3 是做身份确认拿到 TGT → 指定 SPN 拿到服务票据 → 向服务出示这三个阶段。要点是不要把 TGT 和服务票据当成同一样东西来读。
sequenceDiagram
autonumber
participant C as 客户端
participant KDC as KDC(域控制器)
participant S as 服务(由 SPN 标识)
Note over C,KDC: AS 交换——身份确认与获取 TGT
C->>KDC: KRB_AS_REQ<br/>(用户名 + 用长期密钥加密的时间)
Note over KDC: 能用长期密钥解密即为本人
KDC-->>C: KRB_AS_REP<br/>TGT(用 krbtgt 的密钥加密)+ 会话密钥
Note over C,KDC: TGS 交换——获取服务票据
C->>KDC: KRB_TGS_REQ<br/>(TGT + 连接目标的 SPN + 验证子)
Note over KDC: 从 SPN 查出服务账户<br/>用它的长期密钥加密票据
KDC-->>C: KRB_TGS_REP<br/>服务票据 + 会话密钥
Note over C,S: AP 交换——向服务出示
C->>S: KRB_AP_REQ<br/>(服务票据 + 验证子)
Note over S: 能用自己的长期密钥解密<br/>= 是发给自己的票据
S-->>C: KRB_AP_REP(在要求相互认证时)
图 3:Kerberos 的三次交换(AS / TGS / AP)
图例——AS = Authentication Service(认证服务)、TGS = Ticket Granting Service(票据授予服务)、AP = Application(应用程序)。消息名中的 _REQ 表示请求,_REP 表示响应。例如 KRB_TGS_REQ 的意思是“向票据授予服务发出的请求”。
4.1. AS 交换——只做一次的身份确认
发出的东西:用长期密钥加密的时间
客户端向 KDC 发送用户名、域名,以及用自己的长期密钥(从密码派生出的密钥)加密的时间戳。这就是预认证(pre-authentication)。KDC 如果能用该长期密钥解密,并且时间戳合理,就判定“是本人”。3
收到的东西:TGT 与会话密钥
KDC 返回两样角色不同的东西。两者都是“客户端收到的东西”,但客户端能不能读懂里面的内容并不相同。3
| 收到的东西 | 用什么密钥加密 | 客户端如何处理 |
|---|---|---|
| TGT(票据授予票据) | KDC 自身的长期密钥(krbtgt 账户的密钥) | 读不了内容。在下一次 TGS 交换中出示给 KDC |
| 客户端与 KDC 之间使用的会话密钥 | 客户端的长期密钥 | 解密后用于与 KDC 的往来 |
持有 TGT 与能读懂 TGT 的内容是两回事。这个区分,引出了接下来“附上 TGT 和验证子提出请求”的步骤。
时间一偏,Kerberos 本身就会失败
这里要记住的是,时间戳是认证的一部分。Kerberos 对时间同步要求严格正是因为这个,默认允许的时间差是 5 分钟。7 超出这个范围,预认证就通不过,Kerberos 认证本身会报错失败(Windows 的时间同步汇总在《Windows 的时间同步(w32time)指南》中)。这里的“Kerberos 失败”与“回退到 NTLM”是两回事。区分方法在 6.5 节讲。
4.2. TGS 交换——申报“要连到哪个服务”
拿到 TGT 之后,接着申请发给连接目标服务的票据。到这一步,“要连到哪个服务”这个名称(SPN)才成为中心。3
客户端向 KDC 发送连接目标的 SPN、TGT、验证子。KDC 查找与 SPN 对应的服务账户,用该账户的长期密钥加密服务票据后返回。3
把这个流程倒过来读,就能看到第 6 章要讲的问题。
- SPN 解析不出来,就签发不了票据。 服务账户如果没有注册 SPN,KDC 就无法确定该用谁的密钥。用 IP 地址连接同样是默认不尝试 Kerberos 的条件(6.1 节)。
- 票据是按目的地制作的。 由于它是用该服务的长期密钥加密的,持有其他长期密钥的服务无法解密。之所以不能换个目的地重用,原因就在这里。
4.3. AP 交换——向服务出示与相互认证
最后是与 KDC 无关的与连接目标服务之间的往来。这里也要把服务一侧的确认和客户端一侧的确认分开来读。
服务一侧:打开发给自己的票据
客户端出示服务票据和验证子。服务用自己的长期密钥解密票据,取出会话密钥和授权信息。能用自己的密钥解密,就是这张票据发给自己的确认。3
客户端一侧:在要求相互认证时确认对方
如果客户端要求了相互认证,服务会把收到的时间戳用会话密钥加密后返回。客户端验证这个响应,确认对方是真正的服务。3
不只是服务确认客户端,客户端也能确认服务。 这就是 NTLM 所没有的相互认证。
5. 决定性的差异
把第 2 到 4 章的机制,从运维和设计上起作用的视角做个对比。对 DC 的查询会因为是域账户还是本地账户而不同,Kerberos 这边也有 PAC 验证这个例外。 请连同条件一起读。
| 视角 | NTLM | Kerberos |
|---|---|---|
| 对对方的验证 | 客户端无法验证服务器,一台服务器也无法验证另一台服务器。设计上假定服务器是真的4 | 连接的两端都能验证对方确实是其自称的身份4 |
| 每次认证对 DC 的查询 | 如果是域账户则需要。资源服务器每次需要新的访问令牌都要向 DC 查询(本地账户则查自己的账户数据库)10 | 不需要(需要验证 PAC 的情况除外)。由可更新的会话票据取代4 |
| 目的地的绑定 | 没有。响应不证明“是给谁的” | 有。服务票据用目的地服务的长期密钥加密3 |
| 委派 | 只提供在本地模拟客户端所需的授权信息4 | 支持服务代表客户端连接到其他服务的委派4 |
| 时间同步 | 不依赖 | 依赖(默认允许差为 5 分钟)7 |
| 名称解析 | 不挑对方的名称(用 IP 地址也能成立) | 前提是能解析出 SPN3 |
| 在域外的使用 | 工作组配置和本地登录中至今仍然需要10 | 以 Active Directory 为前提4 |
用到委派的设计,还要再选方式
委派是这样一种机制:例如前端的 Web 应用代表用户去连接后端的 SQL Server。在服务器内部模拟用户,与代表用户继续走到另一个服务,要分开考虑。4
而且 Kerberos 的委派还分为非约束委派、约束委派(constrained delegation)、基于资源的约束委派(RBCD)。设计上的议题不只是决定“用 Kerberos”,还包括用哪种委派方式。
本文不深入各方式的具体配置。请把这三个名称记住,作为调查需要委派的架构时的下一批检索词。
名称与域的条件,会连到下一步的排查
这张表最后两行,直接就是“回退到 NTLM 的原因”。因为 Kerberos 的强项(绑定目的地、验证对方)是建立在名称能被正确解析之上的。
6. 为什么会“回退”到 NTLM
本章要查的是“业务在运转,但认证变成了 NTLM”的原因。请按连接目标的名称、SPN 的注册、账户、到 KDC 的路径这个顺序确认。如果是认证本身报错,请先到 6.5 节确认是否需要另一套排查方法。
即使应用程序没有直接指定 NTLM,NTLM 也会被用上。因为 Negotiate 就是这么工作的。按微软的说明,Negotiate 会在 Kerberos 与 NTLM 之间做出选择,并且除非参与认证的某个系统用不了 Kerberos,否则选择 Kerberos。1
也就是说,即便用的是 Negotiate,只要让 Kerberos 成立的条件不齐,选中的就是 NTLM。应用支持 Kerberos,与这条连接实际用上 Kerberos,是两回事。
下面的图和表,是在 NTLM 可用的配置下的典型分支。它并不意味着在 NTLM 本身受限的情况下认证也一定成功。请先查清楚发生切换的原因,对认证方式的限制则结合第 8 章、第 9 章一起确认。
flowchart TD
START["用 Negotiate 开始认证"]
Q1{"是域的<br/>账户吗?"}
Q2{"能从连接目标名称<br/>构造出 SPN 吗?"}
Q3{"这个 SPN<br/>已注册吗?"}
Q4{"能到达<br/>KDC 吗?"}
KRB["用 Kerberos 认证"]
NTLM["回退到 NTLM"]
START --> Q1
Q1 -->|"否<br/>(工作组 / 本地账户)"| NTLM
Q1 -->|是| Q2
Q2 -->|"否<br/>(直接填 IP 地址)"| NTLM
Q2 -->|是| Q3
Q3 -->|"否<br/>(SPN 未注册 / 用别名访问)"| NTLM
Q3 -->|是| Q4
Q4 -->|"否<br/>(分支站点 / VPN / 防火墙)"| NTLM
Q4 -->|是| KRB
图 4:Negotiate 回退到 NTLM 的分支
先把四大成因按条件、原因、修复方法三列列出来。细节从 6.1 节开始讲。
| 条件(这样就会回退) | 为什么会回退 | 修复方法 |
|---|---|---|
| 用 IP 地址指定连接目标(6.1 节) | 默认情况下,当主机名是 IP 地址时 Windows 不会尝试 Kerberos 认证11 | 把连接目标的配置改成 FQDN。只对实在改不了的对象,把客户端的 TryIPSPN 设为 1 并手动注册 IP 地址的 SPN(最后手段)11 |
| SPN 未注册/用 DNS 别名访问(6.2 节) | KDC 无法从 SPN 查出服务账户,也就无法用该账户的长期密钥加密票据3 | 用实际访问所使用的名称,注册所需服务类的 SPN。用 CNAME 的话,该名称的 SPN 也要有5 |
| 用工作组机器/本地账户访问(6.3 节) | 在 Active Directory 之外,根本没有 KDC10 | 加入域,或改成用域账户访问。第 2 阶段的本地 KDC 只能补上支持该功能的 Windows 之间的情况6 |
| 到不了域控制器(6.4 节) | 无法与 KDC 通信,也就拿不到票据6 | 重新检查路径和防火墙,让 Kerberos 所需的通信能到达 KDC |
6.1. 用 IP 地址连接
默认行为:IP 地址不尝试 Kerberos
这是最常见的原因。微软明确写道,默认情况下,当主机名是 IP 地址时,Windows 不会对该主机尝试 Kerberos 认证,而是回退到 NTLM 等其他可用的认证协议。11 审计指南那边也写着,如果事件 8001 的“目标服务器”既不是 NetBIOS 形式也不是 FQDN 形式,就不会使用 Kerberos。5
而且,导致这种情况的原因也被列了出来:由于配置错误或厂商文档的缘故,使用 IP 地址而不是 DNS 名称的应用程序。5 实务中还非常常见另一种情况:过去因为“名称解析不稳定”而改写成 IP 的配置,就这么一直留着。
例外:设置 TryIPSPN,并配置实际会被请求的 SPN
IP 地址不尝试 Kerberos,是默认行为,而不是绝对的限制。 从 Windows 10 版本 1507 和 Windows Server 2016 起,已经有让 SPN 的主机名可以使用 IP 地址的机制。11
需要的是下面两项,缺一不可。
- 在客户端一侧把注册表值
TryIPSPN设为 1。 - 用
Setspn -s <服务类>/<IP 地址> <账户>的形式,手动注册使用 IP 地址的 SPN。
注册的 SPN,要与客户端实际请求的服务类一致。即便原本的连接目标是同一个 IP 地址,不同服务需要的名称也不一样。
| 对象示例 | SPN 示例与注意事项 |
|---|---|
共享文件夹等映射到 HOST 的服务 |
host/192.168.1.1 就够了 |
| Web | HTTP/192.168.1.1 |
| SQL Server | 要像 MSSQLSvc/192.168.1.1:1433 这样连端口一起写 |
只注册 host/,如果与被请求的 SPN 对不上,Kerberos 照样不成立。微软把这个功能定位为减轻禁用 NTLM 对兼容性造成的影响的手段。11
先改成 FQDN,例外只当最后手段
话虽如此,这并不是首选。微软自己也说,IP 地址是临时的,租约到期与续订会引发冲突和认证失败,因此通常不要用它代替主机名,而且基于 IP 地址的 SPN 注册是手工作业,只应在无法改用基于 DNS 的主机名时使用。11 审计中发现的直接填 IP 地址,请首先考虑改成 FQDN。TryIPSPN 是对那些实在做不到的对象的最后手段。
6.2. SPN 未注册
接着要看的是,实际访问所用的名称,是否已注册为 SPN。微软把 SPN 未正确配置的应用,列为明明支持 Kerberos 却使用 NTLM 的应用类型之一。5
在图 3 的 TGS 交换中,KDC 从 SPN 查出服务账户,用它的长期密钥加密票据。没有 SPN,就无法确定“那个服务的密钥”。
用 DNS 别名(CNAME)或自定义主机名连接时,如果该名称的 SPN 未注册,也会发生同样的事。能用某个名称找到服务器,与能用该名称拿到 Kerberos 的票据,是两回事。
要确认的是应用连接配置里写的名称,以及针对该名称会被请求的服务类的 SPN。有时应用运行得好好的,只是它用的那个名称没有登记在册。
6.3. 本来就在 Active Directory 之外
找出现在必须用 NTLM 的路径
工作组配置的终端,以及用本地账户访问共享,都不在 Kerberos 的场子里。微软也说,对配置为工作组成员的系统进行 Windows 认证,以及在域控制器之外进行本地登录认证,会使用而且必须使用 NTLM。10
区分本地 KDC 能补上的范围与补不上的范围
这正是不能“简单禁止”NTLM 的原因。第 2 阶段计划提供的本地 KDC,就是为了补上这个缺口的功能。6
不过请这样理解:能补上的只有支持该功能的 Windows 之间的情况。对方是旧版 Windows,或者 NAS、多功能一体机这类第三方设备的本地账户认证,本地 KDC 来了也不会自动变成 Kerberos。这类划分在实务篇的第 5 章、第 6 章中讲。
6.4. 到不了 KDC
跨分支站点或经 VPN 到不了 DC,或者 Kerberos 所需的通信被防火墙挡住,也是切换到 NTLM 的原因。6 因为在无法从 KDC 取得所需票据的场景里,使用 Kerberos 的准备工作做不完。
这里请把“能不能到达 DC”,细分到是谁发出的通信。
| 认证方式 | 这里需要的路径 | 需要确认该路径的理由 |
|---|---|---|
| Kerberos | 客户端 → KDC | 为了获取 TGT 和服务票据 |
| 域账户的 NTLM | 资源服务器 → DC | 为了委托验证收到的响应 |
“客户端到不了 KDC”与“用 NTLM 就不需要 DC”不是一回事。 正如第 3 章所见,域账户的 NTLM 需要服务器一侧向 DC 查询。10 即使选中了 NTLM,只要这条验证路径也断了,认证同样完不成。
6.5. 不要把“Kerberos 失败”与“回退到 NTLM”混为一谈
无法开始 Kerberos,与选中之后才失败
最后,把容易混淆但确实不同的两件事区分开。到这里为止的 6.1~6.4,都属于“没能开始 Kerberos”的情形。因为开始不了,Negotiate 才选择 NTLM。
另一方面,Kerberos 被选中之后才失败的问题,要另行排查。典型例子就是 4.1 节也提到过的时间偏差。
只要能解析出 SPN、也能到达 KDC,Negotiate 首先就会选择 Kerberos。但如果时间差超出允许范围(默认 5 分钟),预认证就通不过,会作为 Kerberos 的错误而失败。7
“因为用不了 Kerberos 所以选择 NTLM”与“选中的 Kerberos 失败了所以改用 NTLM 重试”,并不是一回事。Negotiate 未必一定会走到后者;应用程序显式改用其他方式重试的情况,也需要另外考虑。
先区分症状,再挑日志和命令
实务上的含义很简单。时间偏差引起的故障,去翻事件 8001 是找不到的。症状也不一样。
| 症状 | 怀疑的对象 | 要看的地方 |
|---|---|---|
| 能用,但认证变成了 NTLM | 6.1~6.4(没能开始 Kerberos) | NTLM/Operational 的事件 8001 |
| 认证本身报错失败 | 时间偏差、SPN 重复注册、加密类型不匹配等 | 系统日志的 Kerberos 事件、klist、w32tm /query /status |
请先分清是“回退到了 NTLM”还是“Kerberos 坏了”,再开始排查。这里说的“能用但是 NTLM”这种症状,说的是 NTLM 可用的配置。对 NTLM 的限制与阻止,要与第 8 章、第 9 章分开确认。
7. 从攻击角度看差异——中继与 Pass-the-Hash
中继和 Pass-the-Hash 都被当作 NTLM 的问题来谈,但它们利用的东西不同。
| 攻击 | 攻击者利用的东西 | 机制上的问题 |
|---|---|---|
| 中继 | 正在进行中的挑战与响应的往来 | 无法确认响应的目的地,仍留有允许中继的条件 |
| Pass-the-Hash | 从终端等处窃取的密码哈希 | 不破解明文密码也能当作认证的材料使用 |
先在 7.1 节看中继能成立的条件,再在 7.2 节看哈希被盗后的问题。
微软在策略设置文档中明确写道,NTLM 及 NTLMv2 认证容易受到包括 SMB 中继、中间人攻击、暴力破解在内的各种恶意攻击。8 至于为什么会这样,看图 1 就能解释。
7.1. 中继攻击——不绑定目的地的后果
sequenceDiagram
autonumber
participant V as 受害者的 PC
participant A as 攻击者的服务器
participant T as 真正的服务器
Note over V,A: 把受害者引诱到攻击者的服务器
V->>A: 开始认证(用户名)
A->>T: 用同一个用户开始认证
T-->>A: 挑战
A-->>V: 把该挑战原样转发
Note over V: 无法区分它是不是<br/>来自真正的服务器
V->>A: 响应(用哈希派生的密钥计算)
A->>T: 把该响应原样转发
Note over T: 在既不要求签名<br/>也不要求通道绑定的情况下
T-->>A: 认证成功 → 以受害者身份建立连接
图 5:NTLM 中继的成立(对方没有签名与通道绑定的情况)
中继不需要偷到密码或哈希也能成立
攻击者不需要知道密码,也不需要知道哈希。只要把挑战和响应从左手倒到右手就行。它之所以能成立,是因为客户端一侧没有手段确认“这个响应是不是真的交给了本来想连的对象”。
能不能成立,取决于连接目标的防护
不过,并不是对任何对象都能中继成功。被中继的往来能不能变成可用的会话,取决于连接目标的防护。
- 对要求 SMB 签名的对象走不通。微软明确写道,附在每条 SMB 消息上的签名包含整条消息的哈希,并且由于要确认发送方与接收方的身份,可以防止中继攻击。12 另外,域控制器默认会要求连接方使用 SMB 签名。12
- 对强制启用 Extended Protection for Authentication(通道绑定)的服务也走不通。因为它把认证绑定到下层的 TLS 通道上,中继到另一条通道的认证就通不过了。
图 5 的前提是接受 NTLM、既不要求签名也不要求通道绑定的对象。不要把它读成“凡是用 NTLM 的连接都无条件能被这样中继”。
这里要确认的不只是防护功能“是否支持”,而是实际上有没有要求、有没有强制。在盘点 NTLM 的同时,确认一下是否配置为要求 SMB 签名,是值得做的。
把向 Kerberos 的迁移与 SMB 一侧的防护放在一起考虑
在 Kerberos 中,同样形式的中继本来就做不到。服务票据是用目的地服务的长期密钥加密的,拿到别的服务那里也解不开。3 而且客户端还能通过相互认证确认对方是不是真的。4
微软之所以准备 SMB 客户端一侧的 NTLM 阻止功能,正是出于这个原因。官方说明它的目的是防止诱使客户端向恶意服务器发送 NTLM 请求的手法。13
另外,在 SMB 签名相关的建议中,微软还提到:为了让会话密钥一开始就足够强,应使用 Kerberos 而不是 NTLMv2;以及不要用 IP 地址或 CNAME 记录连接共享(因为那样会使用 NTLM 而不是 Kerberos)。12 这和 6.1 节、6.2 节说的是同一件事。
7.2. Pass-the-Hash——哈希等价于密码
flowchart LR
P["密码"] -->|"单向哈希"| H["密码的哈希"]
H -->|"导出响应密钥<br/>并计算 HMAC"| R["响应"]
R --> AUTH["认证成功"]
STEAL["从终端<br/>窃取哈希"] --> H
NOTE["不需要<br/>明文密码"] -.-> STEAL
图 6:认证需要的是哈希,而不是明文密码
能用哈希生成响应,这本身就是问题
NTLM 凭据的材料是密码的单向哈希。1 在 NTLMv2 中,也是以 MD4(UNICODE(密码)) 为密钥导出响应密钥,再用该密钥计算 HMAC 生成响应。2
也就是说,计算再复杂,出发点没有变。拿到哈希的攻击者,不破解明文密码也能完成以该用户身份认证所需的计算。
光靠密码的复杂度堵不上这条路径
把密码设得又长又复杂,与哈希被盗之后不让它被使用,是两回事。把密码弄复杂,用窃取的哈希的路径依然存在。 微软在讲 SMB 的 NTLM 阻止能对抗的攻击时,除了暴力破解和口令破解,还列出了 Pass-the-Hash。13
Kerberos 也有长期密钥。不过,日常认证中来回传递的是有有效期的票据和会话密钥。3 比较时还需要把“被盗的是什么、其有效范围有多大”这一点一并考虑进去。
8. NTLMv1、NTLMv2 与“移除”
NTLM 不是单一协议,而是包含 LAN Manager 版本 1、2 和 NTLM 版本 1、2 的一组认证协议。10
这里要区分的是弃用与移除。弃用意味着不再是积极功能开发的对象,移除意味着在相应版本上已经不能用了。
下表把 2024 年 6 月的弃用公告与之后的 NTLMv1 移除并列起来。请不要把第 1 行的“仍可工作”读成第 2 行那些操作系统上也能用 NTLMv1。 对 NTLMv1 而言,适用的是之后的移除。9
| 版本 | 状态 | 含义 |
|---|---|---|
| LANMAN / NTLMv1 / NTLMv2 | 全部弃用(2024 年 6 月)9 | 不再是积极功能开发的对象。不过在下一版 Windows Server 和下一个年度版本的 Windows 上仍可工作 |
| NTLMv1 | 已移除(Windows 11 24H2 / Windows Server 2025)9 | 在这些版本上已不能使用 |
优先找出只能用 NTLMv1 的对象
也就是说,并不是“因为是 NTLMv2 所以暂时可以放着不管”。不过优先级是明确的:只会说 NTLMv1 的设备和主机优先级最高。审计中记录为 NTLM V1 的主机,一旦直接升级到新版 Windows,认证就通不过了。版本的辨别方法(看安全日志中的“包名称(仅限 NTLM)”),在实务篇文章的 4.4 节讲。5
限制策略对 v1 和 v2 都生效
另外,限制 NTLM 的审计与阻止策略,对 NTLMv1 和 NTLMv2 具有相同的效果。5 施加限制时,行为不会因版本而改变。
9. 今后会怎样
迁移的方向,按改变应用的调用 → 减少必须用 NTLM 的场景 → 改变网络认证的默认值这个顺序来把握,就比较好理解。
下面关于 IAKerb、本地 KDC 的提供时间以及默认禁用,都是作为所引用的微软路线图中的计划来讲的。不要把它们当成已经提供的功能,或者在所有设备上都能自动使用的功能。6
第一件:在应用程序一侧使用 Negotiate
NTLM 的调用应当替换为 Negotiate 的调用,这是弃用公告本身包含的指示。9 文档也明确写道,应用程序不应直接访问 NTLM 安全包。1
第二件:减少必须用到 NTLM 的场景本身
第 2 阶段(2026 年下半年)计划提供的 IAKerb 和本地 KDC 属于这一类。6 这是要从协议一侧去补上 6.3 节看到的“因为是本地账户所以用不了 Kerberos”“因为到不了域控制器所以用不了 Kerberos”这两个缺口。
不过能补上的范围是有限的。IAKerb 解决的是到域控制器的可达性,而不是对方是否支持。本地 KDC 也只在支持该功能的 Windows 之间才管用。
如果对方是第三方的 NAS 或多功能一体机,等到第 2 阶段情况也不会变,因此必须自己在设备更新、加入域、切换到其他协议、例外管理之中做出选择。
第三件:改变网络 NTLM 认证的默认值
第 3 阶段计划在下一个主要版本中默认禁用网络 NTLM 认证。6 不过官方也给出了一个前提:可以用策略重新启用。
现在要做的:区分可以指望新功能覆盖的依赖和要自己修的依赖
这个计划的顺序是“先消除使用 NTLM 的理由,再改变默认值”。自家的依赖也按下面这样分好,就不会把该等的和该先修的混在一起。
| 残留的依赖 | 判断方向 |
|---|---|
| 支持该功能的 Windows 之间的本地账户认证、客户端到 DC 的可达性 | 可以指望本地 KDC、IAKerb 覆盖的范围。但要确认对方是否支持 |
| 直接填 IP 地址、SPN 未注册 | 把连接目标统一成 FQDN,把 SPN 整理好。不要等新功能 |
| 与旧版 Windows 或第三方 NAS、多功能一体机之间的本地账户认证 | 从设备更新、加入域、切换到其他协议、例外管理中选择 |
重要的是,不要把与旧版 Windows 或第三方设备的认证一律归入“等第 2 阶段”。它们不会自动变成 Kerberos,放着不管的话,到了默认禁用的阶段就会以故障的形式暴露出来。
具体的盘点与分类步骤,汇总在实务篇里。
10. 小结
最后,按判断的顺序梳理一遍。
机制:是基于哈希的响应,还是发给特定目的地的票据
NTLM 根据密码的哈希生成对挑战的响应。验证方在域账户下是 DC,在本地账户下是服务器自身的 SAM。110
Kerberos 使用以目的地服务的长期密钥加密的票据。3 把握了相互认证、每次认证对 DC 的查询、委派这几点差异,就能看清两种方式区别使用的前提。4
排查:是在用 NTLM 运行,还是认证本身中断了
如果是切换到了 NTLM,就确认直接填 IP 地址、SPN 未注册、在 Active Directory 之外、到 KDC 的可达性这四个条件。5611
另一方面,像时间偏差这种在 Kerberos 被选中之后才出认证错误的问题则另当别论。不要只盯着 NTLM/Operational 的事件 8001,还要查 Kerberos 一侧的事件和时间同步。7 调查的出发点是不要武断地认为“能用就是 Kerberos”“停了就是回退到 NTLM”。
应对:确认防护,再推进 Negotiate 与名称的整备
中继 NTLM 往来的中继攻击,与使用窃取哈希的 Pass-the-Hash,成立的原因和所需的材料都不一样。8113 在确认连接目标防护条件的同时,逐步减少对 NTLM 本身的依赖。
NTLMv1 已在 Windows 11 24H2 / Windows Server 2025 中移除,包括 NTLMv2 在内的所有版本都已弃用。9 在应用中要做的是使用 Negotiate、把连接目标统一成 FQDN、注册 SPN。15 在此基础上,把可以指望新功能覆盖的依赖和必须自己修的依赖分开,推进迁移。
相关文章
- NTLM 停用会导致业务应用停止运行吗——审计日志的采集方法与消除依赖的顺序
- 网络驱动器与 UNC 路径的陷阱——业务应用中处理文件服务器(共享文件夹)的实务
- Windows 的时间同步(w32time)指南
- 用 Get-WinEvent 实务排查事件日志——筛选速度决定调查时间
- PowerShell 中凭据的安全处理——把明文密码逐出脚本
- Windows 的 TPM 是什么——图解“不让密钥离开的保险柜”与度量启动
- 信息安全 10 大威胁 2026——排行榜的看法,以及中小企业真正该防范的东西
相关咨询领域
小村软件有限公司承接因调整认证方式而产生的 Windows 业务应用改造,以及 Kerberos/NTLM 相关认证故障的原因调查。
参考链接
-
Microsoft Learn, Microsoft NTLM. 关于 NTLM 是被称为 Windows Challenge/Response 的认证协议,是向应用程序提供认证、完整性、机密性的安全包;NTLM 凭据由交互式登录时得到的域名、用户名,以及密码的单向哈希构成;通过加密的挑战/响应在不让密码流经线路的情况下完成认证,请求认证的一方要做计算以证明自己能够访问安全保管的 NTLM 凭据;非交互式认证在客户端、服务器、域控制器三方之间进行;其具体步骤(客户端计算密码的哈希并丢弃明文密码、以明文发送用户名、服务器生成并发送 8 字节随机数即挑战、客户端用哈希加密挑战并返回响应、服务器把用户名与挑战与响应发给域控制器、域控制器用 SAM 数据库中的哈希做同样的计算并比对);以及应用程序不应直接访问 NTLM 安全包而应使用 Negotiate 安全包,Negotiate 会在 Kerberos 与 NTLM 之间做出选择,除非参与认证的某个系统用不了 Kerberos 否则选择 Kerberos。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13
-
Microsoft Learn, [MS-NLMP]: NTLM v2 Authentication. 关于 NTLM 的认证版本不由协议协商,而必须在认证之前在客户端与服务器双方配置好;NTLM v2 的响应密钥定义为
NTOWFv2(Passwd, User, UserDom) = HMAC_MD5( MD4(UNICODE(Passwd)), UNICODE(转为大写的 User + UserDom) );客户端会生成 8 字节挑战;temp是响应版本、8 字节 GMT 时间、客户端挑战、ServerName(AUTHENTICATE_MESSAGE 的 NTLMv2_CLIENT_CHALLENGE 中所含的 AvPairs 结构体)等的连接;NTProofStr = HMAC_MD5( ResponseKeyNT, 服务器的挑战 + temp ),NtChallengeResponse是NTProofStr与temp的连接;SessionBaseKey = HMAC_MD5(ResponseKeyNT, NTProofStr);以及关于验证方:要认证的用户账户托管在 Active Directory 上时,把挑战/响应的组合发给域控制器验证,DC 使用 NTOWF v2 / LMOWF v2 计算期望值并比对,DC 返回 STATUS_NTLM_BLOCKED 时服务器返回 STATUS_NOT_SUPPORTED,账户托管在服务器本地时由服务器用本地保管的 OWF 计算期望值并比对。 ↩ ↩2 ↩3 ↩4 ↩5 -
Microsoft Learn, How the Kerberos Version 5 Authentication Protocol Works. 关于 AS 交换中,客户端把用户主体名称、账户的域名,以及用用户的长期密钥(从密码派生的密钥)加密的预认证数据(含时间戳)发给 KDC,KDC 用长期密钥解密并验证后,返回用 KDC 自身的长期密钥(krbtgt 账户的密钥)加密的 TGT,以及用用户的长期密钥加密的会话密钥;TGT 包含会话密钥、授权数据(用户 SID 与组 SID)、有效期与标志。关于 TGS 交换中,客户端把目标服务器名称(SPN)、TGT、用会话密钥加密的验证子(含时间戳与校验和)发给 KDC,KDC 用自身的长期密钥解密 TGT 取出会话密钥,验证验证子的时间戳在策略规定的范围内之后,返回用目标服务的长期密钥加密的服务票据,以及用 TGS 会话密钥加密的新会话密钥。关于客户端/服务器交换(AP 交换)中,客户端把服务票据和验证子出示给服务,服务用自己的长期密钥解密票据取出会话密钥与授权数据,在要求相互认证时把客户端的时间戳用会话密钥加密后返回,以此证明服务自身的身份。以及关于长期密钥与会话密钥的区别(长期密钥从密码或服务账户派生,跨会话持续存在;会话密钥是短命的,随票据到期而销毁)。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13
-
Microsoft Learn, Kerberos authentication overview in Windows Server. 关于 Windows Server 实现了 Kerberos version 5 认证协议以及用于公钥认证、授权数据传输、委派的扩展;Kerberos 客户端作为 SSP(安全支持提供程序)实现,经由 SSPI 访问;KDC 与域控制器上的其他安全服务集成,把 Active Directory Domain Services 的数据库当作安全账户数据库使用;Kerberos 支持服务的委派(前端服务用客户端的身份信息连接到其他计算机上的后端服务的机制),而 NTLM 与 Kerberos 提供的只是服务在本地模拟客户端所需的授权信息;在 Kerberos 之前的 NTLM 认证中,应用服务器每次认证客户端或服务都必须连接域控制器,而在 Kerberos 中可更新的会话票据取代了直通认证,除非需要验证 PAC,服务器不必访问域控制器;以及关于相互认证:在 Kerberos 中网络连接的两端都能验证对方确实是其自称的身份,而 NTLM 既不能让客户端验证服务器的身份,也不能让一台服务器验证另一台服务器的身份,它是为可以假定服务器是真的这种网络环境设计的,Kerberos 不做这样的假定。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13
-
Microsoft Learn, Viewing events for assessing NTLM usage. 关于可以判别事件日志中的 NTLM 审计信息属于 NTLM v1 还是 v2,方法是在安全日志的登录事件中检索“身份验证包”并查看“详细身份验证信息”中的“包名称(仅限 NTLM)”;限制 NTLM 的审计与阻止策略对 NTLM 的两个版本具有相同的效果;理论上支持 Kerberos 却会使用 NTLM 的应用程序的四种类型(可以选择各种安全配置或提供程序的应用、SPN 未正确配置的应用、由于配置错误或厂商文档而使用 IP 地址而非 DNS 名称的应用、遗留代码库中带有 NTLM 专用部分的应用);从域控制器的事件 8004 到成员服务器的事件 8003、再到客户端的事件 8001 的调查步骤以及各事件的字段;事件 8001 的“目标服务器”既不是 NetBIOS 形式也不是 FQDN 形式时不会使用 Kerberos;以及经由 SMB 的通信中 PID 始终为 4(SYSTEM),因此需要用 Process Monitor 定位调用方进程。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9
-
Microsoft Japan Windows Technology Support Blog, 关于面向 NTLM 停用的应对. 关于 NTLM 的停用分三个阶段推进(第 1 阶段=使用状况的可视化与审计,第 2 阶段=计划于 2026 年下半年提供的针对 NTLM 依赖场景的应对功能,第 3 阶段=在下一个主要版本中默认禁用网络 NTLM 认证);第 2 阶段计划提供 IAKERB(支持代理功能的协议)和本地 KDC(支持本地认证的功能);应用程序应使用 Negotiate;以及使用 NTLM 的典型原因包括用 IP 地址指定访问服务器、Kerberos 所需端口被防火墙限制、SPN 未注册、对信任关系对端的认证、工作组环境下的认证。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9
-
Microsoft Learn, Registry entries about Kerberos protocol and Key Distribution Center (KDC) configuration. 关于
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters下的各项设置。特别是SkewTime的默认值为 5 分钟,这是接受 Kerberos 认证的服务器或 KDC 与客户端计算机之间允许的最大时间差,该值也用于判定票据能否重用;以及 SPN 缓存的有效期(SpnCacheTimeout,默认 15 分钟)用于清理客户端和成员服务器上“未找到 SPN”这类否定缓存条目,而在域控制器上 SPN 缓存是禁用的。 ↩ ↩2 ↩3 ↩4 ↩5 -
Microsoft Learn, Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers. 关于设置值有“全部允许”“全部审计”“全部拒绝”“未定义”四种;推荐的步骤是先选择“全部审计”,查看运行日志之后再制定例外列表;审计与阻止的事件记录在“应用程序和服务日志\Microsoft\Windows\NTLM”中;以及 NTLM 及 NTLMv2 认证容易受到包括 SMB 中继、中间人攻击、暴力破解在内的各种恶意攻击,通过在环境中减少并排除 NTLM 认证,可以让 Windows 使用 Kerberos version 5 这类更安全的协议或智能卡这类其他认证机制,并且只有在服务器或域控制器处理 NTLM 请求时这些攻击才可能成立。 ↩ ↩2 ↩3
-
Microsoft Learn, Deprecated features in the Windows client. 关于包括 LANMAN、NTLMv1、NTLMv2 在内的所有版本的 NTLM 都不再是积极功能开发的对象,均已弃用(公告发布于 2024 年 6 月);NTLM 在下一版 Windows Server 和下一个年度版本的 Windows 上仍会继续工作;NTLM 的调用应替换为 Negotiate 的调用,后者会先尝试用 Kerberos 认证,只在必要时才回退到 NTLM;以及作为 2024 年 11 月的更新,NTLMv1 已从 Windows 11 版本 24H2 和 Windows Server 2025 中移除。同时还涉及列在该清单中的功能不再被积极开发、可能在将来的更新中被移除这一点,即弃用(deprecated)与移除(removed)在定位上的区别。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
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;以及要减少 NTLM 的使用,既需要掌握已部署应用程序的需求,也需要做出使用其他协议的配置。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10
-
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 保护资源的客户端都要做这个设置;SPN 的格式为service/hostname[:port];以及 IP 地址是临时的,租约到期与续订会引发冲突和认证失败,因此通常不要用它代替主机名,基于 IP 地址的 SPN 注册是手工作业,只应在无法改用基于 DNS 的主机名时使用,注册使用Setspn -s <service>/<ip.address> <domain-user-account>,由于一个 SPN 在 Active Directory 内同一时间只能注册到一个账户上,使用 DHCP 时建议把 IP 地址静态保留。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 -
Microsoft Learn, Overview of Server Message Block signing in Windows. 关于 SMB 签名会给每条 SMB 消息附上用会话密钥和 AES 生成的签名,签名中除了整条消息的哈希,还包含原始发送方与预期接收方的身份信息;传输途中一旦被篡改就与签名对不上,由此可以防范中继攻击和冒充攻击;SMB 2/3 的签名与加密的安全性依赖会话密钥,签名通过确认发送方与接收方的身份来防止中继攻击;由于会话密钥从密码派生,因此希望使用长而复杂的非词典密码;为了让会话密钥一开始就足够强,推荐使用 Kerberos 而不是 NTLMv2;应避免用 IP 地址或 CNAME 记录连接共享,因为那样会使用 NTLM 而不是 Kerberos;域控制器默认要求连接 SYSVOL 和 NETLOGON 的一方使用 SMB 签名,客户端一侧的 UNC Hardening 进一步对这两个共享要求 Kerberos;签名作为预认证完整性的一部分,也用于防止降级攻击;策略的位置与注册表值(
RequireSecuritySignature);以及从 Windows 11 版本 24H2 起可以使用检测不支持签名/加密的对端的审计功能(Set-SmbClientConfiguration -AuditServerDoesNotSupportSigning等,SMBClient/Audit 的 31998、31999,SMBServer/Audit 的 3021、3022)。 ↩ ↩2 ↩3 -
Microsoft Learn, Block NTLM connections on SMB in Windows Server 2025. 关于 SMB 客户端可以在向远程发起的出站连接中阻止 NTLM 认证;由此可以防止诱使客户端向恶意服务器发送 NTLM 请求的手法,并对抗暴力破解、口令破解、Pass-the-Hash 攻击;Kerberos 通过票据方式能够验证服务器的身份,因此比 NTLM 更安全,而要把组织的认证协议切换到 Kerberos,NTLM 阻止是必需的;另一方面,不完全禁用 NTLM 也可以只启用这一层防护;前提条件是 Windows Server 2025 以上或 Windows 11 版本 24H2 以上的 SMB 客户端,以及能使用 Kerberos 的 SMB 服务器;以及这是 SMB 客户端一侧的功能。 ↩ ↩2 ↩3
相关文章
共享相同标签的最新文章。可以围绕相近的主题进一步加深理解。
SMB 签名与 LDAP 通道绑定——在实务中收紧 NTLM 对策的“另一半”
在停用 NTLM 之前,抑制中继攻击危害的防御手段是 SMB 签名与 LDAP 签名、通道绑定。本文从实务角度梳理各操作系统的默认值、审计事件的解读方法、推进到强制的步骤,以及业务应用和设备的修复方法。
NTLM 停用会导致业务应用停止运行吗——审计日志的采集方法与消除依赖的顺序
围绕 NTLM 停用,整理出梳理本公司 Windows 环境与业务应用在何处依赖 NTLM 的步骤:审计策略、NTLM/Operational 日志中事件 8001~8004 的追踪方法、回退到 NTLM 的典型模式与修复方式,以及 SMB 的 NTLM 阻止。
Windows LAPS 实务指南——告别全部 PC 通用的本地管理员密码
全部 PC 通用的本地管理员密码,是一台失陷就波及全部设备的 Pass-the-Hash 攻击温床。本文讲解已成为 OS 标准功能的 Windows LAPS 如何自动轮换,如何配置保存到 AD/Entra ID,以及运维中的陷阱。
Windows 共享文件夹为什么时好时坏——排查 Kerberos、NTLM 与凭据问题
通过症状和日志排查 Windows 共享文件夹时而能访问、时而无法访问的问题。说明 IP 与名称的差异、仅应用失败、空密码、1219、重启及 SMB 签名的检查步骤,以及每项结果能证明什么。
Windows 服务的账户选定——LocalSystem、虚拟账户与 gMSA 的取舍
您是否让 Windows 服务一直以 LocalSystem 运行?本文用判断表比较 LocalService、NetworkService、虚拟账户、域用户与 gMSA 的权限和网络身份,讲解以最小权限运维的选择方法。
相关主题
与本文相近的主题页面。以本文为起点,可以进一步了解相关服务和其他文章。
Windows 技术主题
汇整 KomuraSoft LLC 关于 Windows 开发、故障调查与既有资产活用文章的主题中心。
常见问题
汇总了咨询这一主题时常见的问题。
- NTLM 与 Kerberos,归根结底有什么区别?
- 最大的区别在于“能不能确认对方的身份”。微软明确写道,在 NTLM 中,客户端无法验证服务器的身份,某台服务器也无法验证另一台服务器的身份。NTLM 是为可以假定“服务器是真的”这种环境设计的,而 Kerberos 不做这种假定。第二个区别是服务器是否需要向域控制器查询。在 NTLM 中,如果是域账户的认证,应用服务器每次认证客户端都要连接域控制器(如果是服务器本地的账户,则由服务器查自己的账户数据库自行判定,域控制器不会出场)。在 Kerberos 中,可更新的会话票据取代了这种直通认证,因此除非需要验证 PAC,服务器不必访问域控制器。第三点是 Kerberos 支持服务的委派(代表客户端连接到其他服务的机制)。
- 明明应该支持 Kerberos,为什么还是变成了 NTLM?
- Kerberos 是以“连接目标的名称”为钥匙来签发票据的机制,名称解析不出来就无法成立。客户端要把连接目标的 SPN(服务主体名称)提交给 KDC 来申请服务票据,但默认情况下,当主机名是 IP 地址时 Windows 不会尝试 Kerberos 认证;而且服务账户如果没有注册 SPN,KDC 也无法签发票据。微软的审计指南也写道,如果事件 8001 的“目标服务器”既不是 NetBIOS 名称也不是 FQDN 形式,就不会使用 Kerberos(关于 IP 地址,可以在客户端设置 TryIPSPN 并手动注册 IP 地址的 SPN,作为例外让 Kerberos 成立,但这被定位为无法改成 DNS 名称时的最后手段)。此外,工作组机器或本地账户的认证(本来就在 Active Directory 之外)、无法到达域控制器的分支站点、对没有信任关系的对方进行认证,也都是 Kerberos 无法成立的条件。Negotiate 会在用不了 Kerberos 时选择 NTLM,所以在这些情况下就会“回退”。
- 什么是 NTLM 中继攻击?它为什么能成立?
- 这是一种攻击:攻击者把受害者引诱到自己的服务器,再把到达那里的 NTLM 认证往来原样中继给真正的服务器,从而冒充受害者。之所以能成立,是因为 NTLM 的挑战/响应没有把“在向谁认证”绑定住的机制。客户端只是根据服务器发出的挑战计算并返回响应,在客户端一侧没有办法确认这个响应是发给真正的服务器的,还是攻击者中继过来的。微软自己也在策略设置文档中明确写道,NTLM 及 NTLMv2 认证容易受到包括 SMB 中继、中间人攻击、暴力破解在内的各种恶意攻击。不过,并不是对任何对象都能中继成功。如果连接目标要求 SMB 签名,由于签名会确认发送方与接收方的身份,中继就无法成立;对强制启用 Extended Protection for Authentication(通道绑定)的服务也一样。反过来说,被盯上的是那些既没有签名也没有通道绑定、又接受 NTLM 的对象。在 Kerberos 中,服务票据是用该服务的长期密钥加密的,把发给别处的票据拿到另一个服务那里也无法解密。
- Pass-the-Hash 是不是说不破解密码也能冒充身份?
- 正是如此。NTLM 的凭据由域名、用户名,以及密码的单向哈希构成。在当前 Windows 使用的 NTLMv2 中,响应密钥是以密码的 MD4 哈希(NT 哈希)为密钥导出的 HMAC,再用这个密钥,对服务器的挑战、时间、客户端一侧的挑战、目标信息汇总而成的内容计算 HMAC。虽然不是单纯地对挑战加密,但出发点仍然是密码的哈希,这一点没有变。也就是说,认证需要的是哈希,而不是明文密码。因此,只要攻击者能从终端的内存等处取出哈希,即使不破解密码,也能以该用户的身份完成认证。把密码设得又长又复杂,也堵不上这条路径。微软准备 SMB 客户端一侧的 NTLM 阻止功能,理由之一正是对抗 Pass-the-Hash 攻击。
- 只要用的是 NTLMv2,短期内就安全了吗?
- NTLMv2 比 NTLMv1 强,但并没有被排除在弃用对象之外。微软的已弃用功能列表写道,包括 LANMAN、NTLMv1、NTLMv2 在内的所有版本的 NTLM 都不再是积极功能开发的对象,均已弃用。限制策略的行为也一样,官方说明审计和阻止策略对这两个版本具有相同的效果。另一方面,NTLMv1 的处置不同,它已经不是弃用而是进入了移除阶段,从 Windows 11 版本 24H2 和 Windows Server 2025 开始已被移除。因此正确的结论不是“因为是 NTLMv2 所以暂时可以放着不管”,而是“NTLMv1 现在就是期限,NTLMv2 则要一边盘点一边朝默认禁用的方向推进”。