Kerberos原理

What

Kerberos(/ˈkərbərəs/)是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。 采用客户端/服务器结构,并且能够进行相互认证,即客户端和服务器端均可对对方进行身份认证。

认证原理

基本原理

Authentication解决的是“如何证明某个人就是他自称的那个人”的问题。也就是说,有一个秘密仅存在于A和B,那么有个人对B自称是A,B通过这个秘密让A证明自己是A。 在实际应用中,我们用KServer-Client表示这个秘密,Client采用对称加密的方式进行加密,将KServer-Client与自身Id一起提供给Server,让Server进行验证。 基本原理

Kerberos大体上按照这样的原理来进行认证。

进化:KDC

新的概念:KDC(Kerberos Distribution Center),作为Client和Server共同信任的第三方,分发KServer-Client。 ps:Kerberos采用的是Session Key而非Master Key,以防止存活时间过长导致黑客有时间破解。因此以下可以称为SServer-Client。 pss:Kerberos在希腊神话里是地狱三头犬的意思,我们可以简单理解为3个头:Client,Server,KDC psss:魔卡少女樱里的小可(可鲁贝洛斯)理论上也是…… KDC分发SServer-Client的过程:

  1. Client发送请求给KDC:我是小C,我需要一个Session Key来访问小S
  2. KDC:生成一个Session Key(SClient-Server),并Copy两份,通过db中提取的C和S的Master Key对两个Copy进行对称加密,并在小S的Session Key中存放关于小C的相关信息。然后把这两个Copy一起发送给Client
  3. Client将属于Server的那份Copy以及ClientInfo打包一并发送给Server KDC

Q:为什么不直接把属于Server的Copy发给Server? A:由于一个Server会面对若干不同的Client, 而每个Client都具有一个不同的Session Key。那么Server就会为所有的Client维护这样一个Session Key的列表,这样做对于Server来说是比较麻烦而低效的。 由于网络传输的不确定性,可能出现这样一种情况:Client很快获得Session Key,并将这个Session Key作为Credential随同访问请求发送到Server,但是用于Server的Session Key确还没有收到,并且很有可能承载这个Session Key的永远也到不了Server端,Client将永远得不到认证。

进化:TGT

在上图我们可以将SClient-Server+ClientInfo封装作为一张Session Ticket,可以理解为Client通往Server的门票,由KDC颁发。 那么,Client需要有资格(认购权证)才能通过KDC获取Ticket才对,这个认购权证在Kerberos被称为TGT:Ticket Granting Ticket,由KDC分发。 在Client申请一张通往Server的Ticket之前,需要有一张TGT。 Client:KDC,我想要有获取Ticket的权限TGT KDC:生成一个Session Key(SKDC-Server),并Copy两份,通过db中提取的C和KDC的Master Key对两个Copy进行对称加密,并在KDC的Session Key中存放关于小C的相关信息。然后把属于Client的Copy一起发送给Client(这里的步骤其实与发送Server的Key相同,只是把Server变成了自己) 同样的,KDC也不会保留自己的那份Copy,而是由Client再次发送过来 TGT

获取TGT后,Client才有权限获取Ticket,KDC验证TGT后,步骤和前面介绍过的一样 KDC&TGT

进化:Timestamp

到这里,很多人认为已经足够,小C只要把Session Ticket发送给小S就够了。但是试想:Client向Server发送的数据包被某个恶意网络监听者截获,该监听者随后将数据包座位自己的Credential冒充该Client对Server进行访问,在这种情况下,依然可以很顺利地获得Server的成功认证。为了解决这个问题,Client在Authenticator中会加入一个当前时间的Timestamp。在Server对Authenticator中的Client Info和Session Ticket中的Client Info进行比较之前,会先提取Authenticator中的Timestamp,并同当前的时间进行比较,如果他们之间的偏差超出一个可以接受的时间范围(一般是5mins),Server会直接拒绝该Client的请求。 Timestamp

获取Ticket后,Client再与Server交互

整个Authentication

通过以上的介绍,我们基本上了解了整个Kerberos authentication的整个流程:整个流程大体上包含以下3个子过程:

  1. Client向KDC申请TGT(Ticket Granting Ticket)。
  2. Client通过获得TGT向DKC申请用于访问Server的Ticket。
  3. Client最终向为了Server对自己的认证向其提交Ticket。 不过上面的介绍离真正的Kerberos Authentication还是有一点出入。Kerberos整个认证过程通过3个sub-protocol来完成。这个3个Sub-Protocol分别完成上面列出的3个子过程。这3个sub-protocol分别为:
  4. Authentication Service Exchange
  5. Ticket Granting Service Exchange
  6. Client/Server Exchange 下图简单展示了完成这个3个Sub-protocol所进行Message Exchange。
Table of Contents