Kerberos初探
Kerberos是什么
Kerberos简单来说就是一个身份认证协议,让我们在网络通信中证明自己的身份以保证通信安全。
Kerberos认证流程
组成角色
在Kerberos的认证过程中,参与者分为三个角色
- 客户端
- 服务端
密钥分发中心(KDC)
而KDC又可以分为两个部分
- 身份验证服务器(AS):认证客户端的身份并发放客户端用于访问TGS的票据授予票据(TGT)
- 票据授予服务器(TGS):发放认证过程中和客户端访问服务端所需要的服务授予票据(Ticket)
认证流程
当一个客户端想访问到服务端的服务时,需要经过以下认证流程
第一次认证
第一次认证的目的是让KDC确认客户端身份,确定其是一个可靠且有权限访问KDC的客户端,大致流程如下
- 客户端以明文方式向KDC发起请求,请求中携带了自己的用户名,IP和当前时间戳
- KDC中的身份验证服务器即AS,接受请求后,去kerberos认证数据库中查找是否有该用户名
如果用户名不存在,则第一次认证不通过,拒绝客户端的访问要求。如果用户名存在,则返回响应给客户端,相应包括以下两部分
- TGT,即票据授予票据,是客户端访问TGS的凭证。TGT中包含用户名,ip,当前时间戳,客户端后续访问的TGS的name,TGT的有效时间,用于客户端和TGS之间进行通信的SESSION_KEY(CT_SK)。注意:整个TGT使用TGS的密钥进行加密,客户端无法对其进行解密。
- 使用客户端密钥加密的以下内容:CT_SK,后续访问的TGS的name,TGT的有效时间,当前时间戳。因为是使用客户端密钥加密了,所以如果是个假的客户端,就算拿到这部分内容也解密不了。
第二次认证
客户端拿到AS返回的响应后,就会使用自己的密钥对第二部分进行解密,获取其中的信息。客户端会对解密出的时间戳进行验证,如果解密出的时间戳与自己发送请求时发送的时间戳差值大于5分钟,那么客户端就认为AS是伪造的,认证直接失败。如果时间戳合理,则向TGS发送请求
本次认证的目的就是为了获取访问目标服务的服务授予票据(Ticket),大致流程如下
- 客户端将用CT_SK加密的客户端名,ip,时间戳发送给KDC
- 客户端将想访问的目标服务以明文形式发送给KDC
- 客户端将第一次认证收到的TGT发送给KDC
- TGS收到客户端的请求后,先用自己的密钥解密TGT,获取到客户端信息和CT_SK以及时间戳,此时判断时间是否超出时延,超出时延则认证失败。
- 然后用获取到的CT_SK解密客户端发送的第一部分内容,获取到客户端信息和时间戳,再次判断时间是否超出时延,超出则认证失败。将这里获取到的用户信息与从TGT中获取到的用户信息进行比较,看是否相同,如果不相同则认证失败。
最后判断用户是否有权限访问服务端,如果有权限则认证成功,TGS返回响应
- 用服务端密钥加密的客户端用于访问目标服务的
Server Ticket
(ST),其中包括客户端的用户名,ip,目标服务的ip,ST的有效时间,当前时间戳及用于客户端于服务端之间通信的Session Key
(CS_SK) - 使用CT_SK加密的CS_SK,当前时间戳,ST的有效时间
- 用服务端密钥加密的客户端用于访问目标服务的
第三次认证
第三次认证也是最后一次认证,发生在客户端与服务端之间。客户端收到TGS返回的响应后,先使用CT_SK解密第二部分内容,获取到CS_SK,时间戳等。然后还是先检查一下时间戳,如果没问题就准备向服务端发送请求
- 客户端用CS_SK加密自身信息和当前时间戳,作为第一部分,将TGS返回的ST作为第二部分,然后发送给服务端
- 服务端收到客户端的请求之后,先用自身的密钥解密ST,核对时间戳后取出CS_SK。然后使用CS_SK将第一部分内容解密。然后对比ST中取出的用户信息和客户端发送的用户信息,如果相同则认证成功。服务端返回一个使用CS_SK加密一个表示接收到了请求的响应发送给客户端,客户端用CS_SK解密该响应后也确认了服务端身份
至此,整个认证流程也就结束了,之后就可以进行正常的网络通信了。
借一张流程图
各参数的内容
()表示包含的内容
{}表示用什么加密
AS_REQ: Client_info
AS_REP: TGT(Krbtgt_ntlm{Client_info,CT_SK,TGS_name,TGT_time,timestamp})
Client_ntlm{CT_SK,TGS_name,TGT_time,timestamp}
TGS_REQ:CT_SK{Client_info,timestamp}
Server_info
TGT
TGS_REP: ST(Server_ntlm{Client_info,timestamp,ST_time,CS_SK})
CT_SK{timestamp,ST_time,CS_SK}
SE_REQ: CS_SK{Client_info,timestamp}
ST
SE_REP: CS_SK{xx}
域内的Kerberos认证
先了解一下PAC
PAC
PAC全称 Privilege Attribute Certficate
,即特权属性证书,是为了用来区分不同权限,进行访问控制。PAC中包含的是用户的SID,用户所在的组等信息。
KDC在向客户端返回AS_REP时会将PAC放在TGT中,然后客户端又将TGT发给TGS,TGT就根据其来验证客户端请求的服务。
在 PAC 中包含有两个数字签名 PAC_SERVER_CHECKSUM 和 PAC_PRIVSVR_CHECKSUM,这两个数字签名分别由服务端的NTLM和Krbtgt用户的NTLM加密。
TGS解密TGT后验证PAC的签名是否正确,然后重新构造新的PAC放在 Server Ticket
中。最后服务端从ST中解密出PAC,然后用其向DC询问该用户是否具有访问权限,DC对PAC解密后,判断其中的SID等信息,并将结果返回给服务端。服务端再将此信息与用户请求的服务资源的 ACL 进行对比,最后决定是否给用户提供相关的服务。
注意:有些服务没有验证PAC这一步,这也是白银票据能够成功的前提
krbtgt用户
该用户是创建域时系统自动生成的一个账号,作用就是作为KDC的服务账号,其密码是系统随机生成的,不能正常登录主机。