Windows下的身份验证----NTLM和Kerberos


发布时间:2017/10/28 14:35:01  次浏览  作者:admin

一、概述

身份验证是一个验证客户端身份的过程,通常采用指定的第三方授权方式。客户端可能是最终用户、计算机、应用程序或服务。客户端的标识称为安全原则。为了使用服务器应用程序进行验证,客户端提供某种形式的凭据来允许服务器验证客户端的标识。确认了客户端的标识后,应用程序可以授予执行操作和访问资源的原则。

二、NTLM身份验证

ntlm 是用于 Windows NT 和 Windows 2000 Server 工作组环境的身份验证协议。它还用在必须对 Windows NT 系统进行身份验证的混合 Windows 2000 Active Directory 域环境中。当 Windows 2000 Server 转换为不存在下层 Windows NT 域控制器的本机模式时,禁用 NTLM.然后 Kerberos v5 变成企业级的默认身份验证协议。

ntlm 身份验证机制
 
 
图 1. NTLM 质询/应答机制

下面概述质询/应答机制:

· 用户请求访问。用户尝试通过提供用户凭据登录到客户端。登录前,客户端计算机缓存密码的哈希值并放弃密码。客户端向服务器发送一个请求,该请求包括用户名以及纯文本格式的请求。

· 服务器发送质询消息。服务器生成一个称为质询的 16 字节随机数(即 NONCE),并将它发送到客户端。

· 客户端发送应答消息。客户端使用由用户的密码生成的一个密码哈希值来加密服务器发送的质询。它以应答的形式将这个加密的质询发回到服务器。

· 服务器将质询和应答发送到域控制器。服务器将用户名、原始质询以及应答从客户端计算机发送到域控制器。

· 域控制器比较质询和应答以对用户进行身份验证。域控制器获取该用户的密码哈希值,然后使用该哈希值对原始质询进行加密。接下来,域控制器将加密的质询与客户端计算机的应答进行比较。如果匹配,域控制器则发送该用户已经过身份验证的服务器确认。

· 服务器向客户端发送应答。假定凭据有效,服务器授予对所请求的服务或资源的客户端访问权。

三、Kerberos 身份验证

与 NTLM 身份验证相比,Kerberos 身份验证具有以下优势:

· 相互身份验证。当客户端使用 Kerberos v5 协议对特定服务器上的特定服务进行身份验证,Kerberos 为客户端提供网络上恶意代码不会模拟该服务的保证。

· 委托支持。使用 Kerberos 身份验证对客户端进行身份验证的服务器可以模拟这些客户端,并使用该客户端的安全上下文访问网络资源。

· 性能。Kerberos 身份验证提供优于 NTLM 身份验证的改进的性能。

· 简化的信任管理。具有多个域的网络不再需要一组复杂的显式、点对点信任关系。

· 互操作性。Microsoft 实现的 Kerberos 协议基于向 Internet 工程任务组 (IETF) 推荐的标准跟踪规范。因此,Windows 2000 中协议的实现为与其他网络的互操作奠定了基础(其中 Kerberos 版本 5 用于身份验证)。

kerberos 身份验证机制

图 2 显示 Kerberos 身份验证协议的简化视图。

http://dotnet.chinaitlab.com/UploadFiles_6597/200608/20060808164126557.gif

图 2. Kerberos 身份验证

当客户端对网络服务进行身份验证之后,kerberos v5 协议遵循以下步骤:

· 客户端从 KDC 请求 TGT.用户试图通过提供用户凭据登录到客户端。客户端计算机上的 Kerberos 服务向密钥发行中心 (KDC) 发送一个 Kerberos 身份验证服务请求。该请求包含用户名、请求票证授予票证(ticket-granting ticket,TGT)所获取的服务信息,以及使用用户的长期密钥(即密码)加密的时间戳。

注 在 Windows 2000 Server 或 Windows Server 2003 操作系统上,域控制器充当 KDC,而 Active Directory 宿主安全帐户数据库。

· 身份验证服务发送加密的 TGT 和会话密钥。KDC 为来自 Active Directory 的用户获取长期密钥(即密码),然后解密随请求一起传送的时间戳。如果该时间戳有效,则用户是真正的用户。KDC 身份验证服务创建一个登录会话密钥,并使用用户的长期密钥对该副本进行加密。然后,该身份验证服务创建一个 TGT,它包括用户信息和登录会话密钥。最后,该身份验证服务使用自己的密钥加密 TGT,并将加密的会话密钥和加密的 TGT 传递给客户端。

· 客户端从 TGT 请求服务器访问。客户端使用其长期密钥(即密码)解密登录会话密钥,并在本地缓存它。此外,客户端还将加密的 TGT 存储在它的缓存中。访问网络服务时,客户端向 KDC 票证授予服务(ticket-granting service,TGS)发送一个包含信息的请求,这些信息包括用户名、使用用户登录会话密钥加密的验证者消息、TGT,以及用户想访问的服务(和服务器)名称。

· TGS 发送加密的会话密钥和票证。KDC 上的 TGS 使用自己的密钥解密 KDC 并提取登录会话密钥。它使用该登录会话密钥解密验证者消息(通常是时间戳)。如果验证者消息成功解密,TGS 从 TGT 提取用户信息,并使用用户信息创建一个用于访问该服务的服务会话密钥。它使用该用户的登录会话密钥对该服务会话密钥的一个副本进行加密,创建一个具有服务会话密钥和用户信息的服务票证,然后使用该服务的长期密钥(密码)对该服务票证进行加密。然后,TGS 将加密的服务会话密钥和服务票证添加到客户端。

· 客户端发送服务票证。客户端访问服务时,向服务器发送一个请求。该请求包含验证者消息(时间戳),该消息使用服务会话密钥和服务票证进行加密。

· 服务器发送加密的时间戳以进行客户端验证。服务器解密服务票证并提取服务会话密钥。通过使用服务会话密钥,服务器解密验证者消息(时间戳)并计算它。如果验证者通过测试,则服务器使用服务会话密钥对验证者(时间戳)进行加密,然后将验证者传回到客户端。客户端解密时间戳,如果该时间戳与原始时间戳相同,则该服务是真正的,客户端继续连接。

服务的主要名称

kerberos v5 身份验证协议之所以使用服务的主要名称 (SPN),原因如下:

· 支持相互身份验证。

· 允许一个客户端请求票证,进而允许该客户端与特定服务通讯。

例如,如果某个客户端需要获得一个票证,并对在侦听端口 4766 运行的计算机 (myserver) 上的特定服务 (myservice) 进行身份验证,则该客户端使用根据该信息构造的名称从 KDC 请求一个票证,如下所示:

MyService/MyServer:4766在 Active Directory 中注册的 SPN 在该名称和运行所请求的服务的域帐户之间维护一个映射。通过使用该机制,恶意用户难以在网络上模拟服务。恶意用户必须禁用实际服务并从该网络移除实际服务器。然后,恶意用户必须向网络中添加一台同名的新计算机并公开重复的服务。由于客户端使用具有相互身份验证的 Kerberos v5 协议,因此该客户端将无法使用重复的服务,除非它可以提供配置实际服务进行运行的域帐户的密码。