Share via


NTLM协议(一)——面向连接认证

在Windows 网络中,NTLM(NT LAN Manager)是一系列旨向用户提供认证,完整性和机密性的微软安全协议。NTLM有NTLMv1和NTLMv2两个版本,NTLMv2在安全上有了很大改进,基本上替代了NTLMv1。

虽然Kerberos已经代替NTLM成为活动目录中默认的认证协议,但是NTLM仍然被广泛的应用在客户端无法找到域控制器或者无法访问域控制器的情况下。比如,客户端不支持Kerberos,服务器没有加入域,或者用户是通过网络远程认证时,NTLM都非常有用。

NTLM是Challenge-Response(质询-响应)验证机制的认证协议。这表示为了认证用户,服务器会发送Challenge给用户,然后用户返回一个Response。这个Response是将Challenge,用户密码哈希和其他信息一起通过特定函数计算出来的结果。该函数保证了计算出正确的Response一定需要知道用户的密码(哈希)。服务器(或者该服务器信任的对象,如域控制器)从账户数据库中获得用户密码哈希,然后计算出Challenge对应的正确的Response。服务器会用该Response与用户返回的Response相比较,假如两值相同,则客户端通过服务器的验证。

不同于SMB或者HTTP这种独立的应用协议,NTLM消息是嵌在需要认证用户的应用协议中的。也就是说NTLM是嵌入协议。所以应用协议决定了如何和何时NTLM消息被编码,分帧和传输。

NTLM的实现也跟其他普通协议不一样。它由一组可以被其他应用协议调用的函数组成函数库,而不是网络协议栈中的某一层。微软将NTLM函数库实现为安全性支持提供程序(SSP),应用协议通过安全性支持提供程序接口(SSPI)调用它。

NTLM函数在处理调用者传递的参数后,返回认证消息。该认证消息放在调用者自己的消息字段中。如果仔细研究该消息,您会发现NTLM认证协议的两种主要变体:面向连接和无连接认证。今天我们的主题是面向连接认证,无连接认证将在下次介绍。

下图是应用协议创建一个认证会话时,NTLM面向连接认证的调用流程(call flow):

那么,该图中调用流程的消息都有什么意义呢?让我们来初步了解一下这个流程吧。

  1. Application message(s):表示客户端和服务器之间发送的应用协议消息。
  2. Application message [NTLM_NEGOTIATE]:当应用程序程序需要建立认证会话的时候,NTLM协议就会被调用。客户端发送NTLM NEGOTIATE_MESSAGE消息到服务器。这个消息指定了该会话期望的安全特性。
  3. Application message [NTLM_CHALLENGE]:服务器发送NTLM CHALLENGE_MESSAGE消息到客户端。该消息包括商定的安全特性和服务器产生的随机数(Challenge)。
  4. Application message [NTLM_AUTHENTICATE]:客户端向服务器发送NTLM AUTHENTICATE_MESSAGE消息。该消息包含用户名和Response。这个Response可以证实客户端知道用户的密码。服务器接下来会验证这个Response。假如该用户是本地账户,服务器可以根据本地账户数据库中的信息验证Response。假如该用户是域账户,服务器会将用户认证信息(用户名,服务器发送给客户端的Challenge,客户端发送给服务器的Response)发送给域控制器,由域控制器验证该Response。这时候NTLM协议认证过程完成。
  5. Application message(s):如果Challenge和Response证明客户端知道用户密码,那么认证成功。假如认证失败,服务器可能会以某种方式发送认证失败的状态给应用协议,或者单纯的结束连接。

服务器发送给客户端的Challenge是一个8字节的随机数。在NTLMv2版本中,客户端发送给服务器的Response包含LMv2,定长客户端Challenge,NTv2和不定长客户端Challenge。

LMv2和NTv2是由服务器Challenge,客户端随机产生的Challenge以及由用户密码和其他身份信息产生的HMAC-MD5哈希值共同产生的HMAC-MD5哈希值。LMv2和NTv2的区别在于客户端随机产生的Challenge。LMv2中该Challenge是8字节的随机数,而NTv2中该Challenge是不定长的。为了让服务器能验证Response,所以需要在Response中加入LMv2和NTv2中使用的客户端Challenge,否则服务器无法产生一样的哈希值。

NTv2包含的不定长的客户端Challenge是由当前时间(以NT时间格式表示),8字节随机数,域名和一些标准格式的信息组成。所以,这个Challenge是不定长的。

LMv2和NTv2中由用户密码和其他身份信息产生的HMAC-MD5哈希值(v2-Hash)是由NT-Hash,用户名,域名等身份信息产生的HMAC-MD5哈希值。NT-Hash保存在SAM或者AD数据库中。

通过上面的解释,您或许还有些困惑,但是相信您看了下面的这些公式之后,就会对Response的生成过程和结果有更全面的了解。其中X表示标准格式信息。

SC = 8字节服务器Challenge

CC = 8字节客户端Challenge

CC* = (X, time, CC, domain name)

v2-Hash = HMAC-MD5(NT-Hash, user name, domain name)

LMv2 = HMAC-MD5(v2-Hash, SC, CC)

NTv2 = HMAC-MD5(v2-Hash, SC, CC*)

Response = LMv2 | CC | NTv2 | CC*

讲到这里,相信您对NTLM面向连接认证的内容已经有了比较深入的认识,今天就分享到这里了,下一期我们会进一步分享一下NTLM无连接认证,敬请期待!

 

谢谢,

屈贝伟 | 企业平台支持部AD技术工程师 | 微软亚太区全球技术支持中心

 

本博文仅供参考,微软公司对其内容不作任何责任担保或权利赋予。