NTLM历史
NTLM是NT LAN Manager的缩写,是 Windows NT 早期版本的标准安全协议。从Windows 2000开始,kerberos协议是默认的安全认证协议,但是依然支持 NTLM, 是为了保持向后兼容。NTLM是Windows 2000内置三种基本安全协议之一。
早期SMB协议在网络上传输明文口令。后来出现 LAN Manager Challenge/Response 验证机制,简称LM,但是它过于简单,容易被破解。微软提出了WindowsNT挑战/响应验证机制,称之为NTLM。现在已经有了更新的NTLMv2以及Kerberos验证体系。NTLM是windows早期安全协议,因向后兼容性而保留下来。
以上是NTLM安全认证协议的简要历史。
NTLM验证
NTLM认证过程简介
在windows 2000之后,Kerberos是首选的认证方式,也是更为安全的认证方式。在这之前,Windows主要采用另一种认证协议——NTLM(NT Lan Manager)。NTLM使用在Windows NT和Windows 2000 Server(or later)工作组环境中,Kerberos用在域模式下。在AD域环境中,如果需要认证Windows NT系统,也必须采用NTLM。较之Kerberos,基于NTLM的认证过程要简单很多。
NTLM采用一种质询/应答(Challenge/Response)消息交换模式。NTLM有Interactive和Noninteractive两种,Interactive就是用户登录类型的,只有client和DC两个参与者,在用户登录工作组计算机或者windows NT系统的域内计算机的时候即采用此种验证方式。
而Noninteractive则是Client要去连接一个Serve,即要在网络中访问其他server资源的时候。
下面是NTLM的Noninteractive验证过程,有如下6步过程:
用 户通过输入Windows帐号和密码登录客户端主机。在登录之前,客户端会缓存输入密码的哈希值,原始密码会被丢弃(“原始密码在任何情况下都不能被缓 存”,这是一条基本的安全准则)。成功登录客户端Windows的用户如果试图访问服务器资源,需要向对方发送一个请求。该请求中包含一个以明文表示的用户名。
服务器接收到请求后,生成一个16位的随机数。这个随机数被称为Challenge或者Nonce。服务器在将该Challenge发送给客户端之前,该Challenge会先被保存起来。Challenge是以明文的形式发送的。
客户端在接收到服务器发回的Challenge后,用在步骤一中保存的密码哈希值对其加密,然后再将加密后的Challenge发送给服务器。
服务器接收到客户端发送回来的加密后的Challenge后,会向DC(Domain)发送针对客户端的验证请求。该请求主要包含以下三方面的内容:客户端用户名;客户端密码哈希值加密的Challenge和原始的Challenge。
DC根据用户名获取该帐号的密码哈希值,对原始的Challenge进行加密。如果加密后的Challenge和服务器发送的一致,则意味着用户拥有正确的密码,验证通过,否则验证失败。
DC将验证结果发给服务器,并最终反馈给客户端。
NTLM存在的缺陷 泄密风险
NTLM本身存在泄密的风险,由于NTLM支持forward,可以通过做一个MITM attack,在client与server中加一个proxy,监听验证过程中传输的数据。由于账号的用户名是明文的,challenge值也是明文传输的,加密后的challenge值的哈希值也是可以截获的,通过暴力破解可以得到相关账户的原始密码。并且由于这个密码是用户名的密码,更改的频率可能会很低,属于long-term key,破解后可能很长一段时间都能够使用。
单向认证
整个NTLM认证过程中只有服务器对客户端的认证,并没有客户端对服务器的认证,可能遭致假冒服务器攻击。
效率较低
认证的过程中始终都要受信任的第三方参与,认证效率较低。
仅支持本地登录
NTLM用于工作组模式,只支持本地登录认证,并不支持网络登录认证。
应对之道
如果环境中没有windows NT系统,则可以考虑关闭服务器的NTLM验证,使用相对更安全的kerberos验证。
不要直接使用NTLM,而是使用negotiate。如果使用negotiate的话,那么windows会判断kerberos是否可用,如果可用就优先使用kerberos,否则使用NTLM。kerberos的安全性要比NTLM要高。
在sharepoint的中就有NTLM和negotiate的选择,默认选择的是NTLM,如果知道如何配置kerberos的话,建议使用negotiate模
|