0x01 kerberos协议的角色组成
Kerberos协议中存在三个角色:
-
客户端
(Client):发送请求的一方 -
服务端
(Server):接收请求的一方 -
密钥分发中心
(Key distribution KDC)
密钥分发中心分为两个部分:
-
AS
(Authentication Server):认证服务器,专门用来认证客户端的身份并发放客户用于访问TGS的TGT(票据授予票据) -
TGS
(Ticket Granting ticket):票据授予服务器,用来发放整个认证过程以及客户端访问服务端时所需的服务授予票据(ticket)
Kerberos认证过程简化描述:
-
客户端向KDC请求获取想要访问的目标服务的服务授予票据(Ticket)。
-
客户端拿着从KDC获取的服务授予票据(Ticket)访问相应的网络服务。
kerberos认证的两步分别解决了以下两个问题:
KDC怎么知道客户端没有伪造身份。
服务端怎么知道服务授予票据(ticket)就是没有伪造。
0x02 Kerberos认证流程
上面将认证流程简化成两步,实际上第一步包含了两件事。所以可以将整个Kerberos认证过程可以细化为三个阶段,也就是三次通信。
2.1 第一次通信
客户端需要获取用于访问服务器的票据,首先需要向KDC请求服务授予票据。由于KDC不确定客户端的身份,第一次通信的目的是对客户端进行身份认证,以确认其是可信的且拥有访问KDC的权限。
第一次通信过程:
- 客户端发送明文请求到KDC,包括
用户名
、主机IP
和时间戳
。 - KDC中的AS(Authentication Server)接收请求并在Kerberos认证数据库中查找该用户名是否存在(不会判断身份的可靠性)。
- 如果存在该用户名,则AS返回认证成功的消息给客户端,否则认证失败,服务结束。
AS返回数据包内容:
-
第一部分是TGT(票据授予票据),客户端需要使用它去KDC中的TGS获取访问网络服务所需的Ticket。TGT包含客户端的
用户名
、IP地址
、时间戳
、即将访问的TGS的名称
、TGT的有效时间
以及用于客户端和TGS间通信的Session_key(CT_SK,client-TGS session key)
。TGT使用TGS密钥加密,客户端无法解密,而且密钥从未在网络中传输,因此不存在密钥被劫持破解的情况。 -
第二部分内容使用客户端密钥加密,包括用于客户端和TGS间通信的
Session_key(CT_SK)
、即将访问的TGS的名称
、TGT的有效时间
和一个当前时间戳
。客户端可以使用自己的密钥解密该内容。如果是假客户端则没有真正客户端的密钥,无法解密该内容,因此认证不通过。这也同时认证了客户端的身份。
2.2 第二次通信
客户端用密钥解密第二部分内容,得到时间戳、将要访问的TGS信息和用于与TGS通信的密钥CT_SK。如果客户端检测到时间戳与请求发出时的时间差大于5分钟则认为AS是伪造的,认证失败。如果时间戳合理,客户端向TGS发起请求获取服务授予票据。
第二次通信过程:
-
客户端向KDC发送请求,请求包括以下数据:
-
使用CT_SK加密客户端信息,包括
客户端名
、IP
、时间戳
。 -
明文形式的Server信息。
-
原封不动的TGT。
-
-
TGS收到客户端请求后,根据明文传输的ServerIP检查服务是否存在且是否可被用户访问,如果不行则认证失败,否则继续认证。
-
TGS使用自己的密钥解密TGT,获取AS认证后记录的
用户信息
、Session_Key
和时间戳
信息。然后,TGS会根据时间戳判断通信是否可靠,以及是否超时。 -
如果时间戳未超时,TGS会使用CT_SK解密客户端的第一部分内容,获取
用户信息
和TGT中的用户信息
进行比对。如果完全相同,则认为客户端身份正确,可以继续认证流程。
TGS返回数据包内容:
-
第一部分是用Server密钥加密的
ST(Server Ticket)
,包括客户端的Name
、IP
、要访问的Server IP
、ST的有效时间
、时间戳
以及用于客户端和服务端之间通信的CS_SK(Session Key)
。 -
第二部分是使用CT_SK加密的内容,包括
CS_SK
、时间戳
和ST的有效时间
。由于AS已经通过客户端密码加密将CT_SK传递给了客户端,并且客户端解密并缓存了CT_SK,因此客户端可以自己解密第二部分内容。
2.3 第三次通信
客户端收到TGS的响应,使用本地缓存的CT_SK解密第二部分内容。由于第一部分的ST是由Server密码加密的,客户端无法解密它。客户端检查时间戳无误后,取出第二部分内容中的CS_SK,准备向服务端发起最后的请求。
第三次通信过程:
-
客户端收到TGS的响应后使用CK_SK将自己的
主机信息
和时间戳
等信息加密,作为交给服务端的第一部分内容,并将ST(服务授予票据)
作为第二部分内容一起发送给服务端。 -
服务端用自己的密钥解密第二部分内容并验证
时间戳
,取出CS_SK
。使用CS_SK解密第一部分内容,获取经过TGS认证过后的客户端信息。然后,服务器将这部分信息与第二部分内容中的服务器信息进行比对,确认是否为客户端身份。如果是则服务端使用CS_SK加密响应发送给客户端。客户端使用CS_ST解密响应,确认服务端身份。服务端还可以使用数字证书证明自己的身份,至此认证完成。
0x03 总结
Kerberos认证过程复杂,使用多个密钥,且密钥种类不断变换,以防止网络拦截。使用临时生成的Session key,只在当前会话中使用,保证安全性。即使密钥被劫持,也只能在当前会话中起作用。
0x04 参考文章
Kerberos协议详解_李火火的安全圈的博客-CSDN博客