AD认证:Kerberos 和 NTLM

  • Post author:
  • Post category:其他


AD认证主要用到两种协议:Kerberos 和 NTLM

NTLM

认证过程如下:

  1. client本地生成NTLM hash,值为用户密码的hash值。

  2. client发送用户名给应用服务器。

  3. 应用服务器随机生成一个值给client,这个值通常叫nonce或challenge。

  4. client用NTLM hash对nonce进行加密,并发送给应用服务器。

  5. 应用服务器收到后,连同用户名和nonce一并发送给AD服务器。

  6. AD根据该用户的密码生成NTLM hash,并对nonce进行加密,然后对client发送的进行比对。

  7. 若值相同,则通过认证,若不同,则认证失败。

Kerberos

关键名词:

  1. KDC:Key Distribution Center,密钥发行中心,提供两个服务:身份验证服务(Authentication Service 简称AS)和Ticket-Granting Service(TGS)。域会为KDC生成名为krbtgt的域账户,TGT的加密解密均使用该账户的密码。域用户首次访问时,会想AS进行身份验证,通过后,AS请求TGS向域用户提供票证(TGT)。

  2. SPN:Service Principal Name。AD账户除了用户账户外,还有服务账户。应用程序也会有与之关联的服务账户,便于应用程序访问服务器资源,如exchange、SQL、IIS等。SPN则用于将应用程序启用的服务与AD中服务账户关联起来的一项服务。

认证流程:

  1. 当域用户登录时,会向DC发送一个AS request(AS_REQ),请求会包含一个加密的时间戳,通过该用户的密码hash和用户名进行加密。

  2. DC收到请求后,使用该用户的用户名和密码hash进行解密,若加密成功且判断时间戳不重复,则认证成功。(时间戳判断防止重放攻击)DC向客户端回复一个AS reply(AS_REP),回复会包含一个session key和TGT(Ticket Granting Ticket)。session key是加密的,用用户的密码hash加密。TGT中包含了组成员关系、域、时间戳、客户端IP和session key。TGT也是加密的,用KDC服务账户密码加密,客户端无法解密。(默认TGT 10小时内有效,之后发生的更新无需用户重新输入密码)

  3. 当用户请求域内资源时,会发送一个Ticket Granting Service Request(TGS_REQ),包含用户名、时间戳、TGT、SPN。时间戳和用户名用session key进行加密。

  4. KDC收到请求后,先判断是否域内是否存在请求中的SPN,然后解密TGT,提取session key和TGT中的时间戳等,用TGT中的session key对加密的用户名和时间戳进行解密。进行几项检查:

    • TGT解密出来的时间戳,必须是有效的。(若发生了重放攻击,时间戳就失效了。)

    • TGT里的username和请求中的username是否一致。

    • TGT里的IP和请求中的IP是否一致。

通过检查则回复客户端Ticket Granting ServiceReply(TGS_REP),包含授权访问的SPN、客户端与SPN之间访问所用新的session key、新的Service Ticket服务票证(包含新的session key、用户名和用户组)。授权访问的SPN和访问SPN的session key均用TGT中的session key加密。service ticket使用对应SPN服务账户的密码加密。

  1. 经过以上过程,用户已经获取了与应用服务相关的session key和service ticket。用户向应用服务发送请求Application Request(AP_REQ),包含用户名和时间戳,均用session key进行加密。

  2. 应用服务用服务账号密码hash解密service ticket,提取用户、用户组、session key。用解密出来的session key解密AP_REQ中的用户名和时间戳。先比对service ticket中的用户名和AP_REQ中的用户名是否一致,若一致,则请求被接受,应用服务根据service ticket中的用户组信息分配权限,之后用户可以访问请求的服务。



版权声明:本文为b10d9原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。