欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

kerberos协议认证详细过程

程序员文章站 2024-02-28 11:36:58
...

本文假设已经对kerberos有一定的了解基础上。

kerberos认证涉及到三方: client,KDC(kerberos databse center),server(client需要访问的服务,hdfs等)。

一、kerberos中的key

一种是Long-term Key/Master Key:Master Key是基于密码经过一定规则派生的,对于Long-term Key有这样的原则:被Long-term Key加密的数据不应该在网络上传输。原因很简单,一旦这些被Long-term Key加密的数据包被恶意的网络监听者截获,在原则上,只要有充足的时间,他是可以通过计算获得你用于加密的Long-term Key的——任何加密算法都不可能做到绝对保密。

一种是Short-term Key/Session Key:由于被Long-term Key加密的数据包不能用于网络传送,所以我们使用另一种Short-term Key来加密需要进行网络传输的数据。由于这种Key只在一段时间内有效,即使被加密的数据包被黑客截获,等他把Key计算出来的时候,这个Key早就已经过期了

在kerberos中,KDC保存所有client和server的master key,但不保存和维护session key(KDC会生成session key交给对应的客户端保存维护),每个client和server保存自己的master key和自己作为客户端(server有时也是客户端)时的session key。

二、认证过程:

认证过程共包含4个Sub-protocol:
1、Authentication Service Exchange(AS Exchange):
通过这个Sub-protocol,KDC(确切地说是KDC中的Authentication Service)实现对Client身份的确认,并颁发给该Client一个TGT。具体过程如下:
client将client info 使用client master key加密扔给KDC,KDC从Account Database中提取Client对应的Master Key对发过来的信息进行解密,验证client身份,若验证成功,向client返回一个使用KDC master key加密的TGT和使用client 的master key加密的Session Key(SKDC-Client:Logon Session Key),TGT包含以下内容:

.Session Key: SKDC-Client:Logon Session Key
.Client name & realm: 简单地说就是Domain name\Client
.End time: TGT到期的时间。

client使用自己的master key对第二部分解密得到Session Key(SKDC-Client:Logon Session Key)。

2、User2User Protocol
Client向server申请Server和KDC的Session Key(SKDC-Server)和封装了该Session Key的属于Server的TGT,如果该TGT存在于Server的缓存中,则Server会直接将其返回给Client。否则通过AS Exchange从KDC获取(同上一步骤,只不过此时Server作为client)

3、TGS(Ticket Granting Service)Exchange
Client通过向KDC提供自己的TGT,Server的TGT以及Authenticator向KDC中的TGS(Ticket Granting Service)申请用于访问Server的Ticket。请求内容如下:

.Client TGT: Client通过AS Exchange获得的Ticket Granting Ticket,TGT被KDC的Master Key加密
.Server TGT: Server通过AS Exchange获得的Ticket Granting Ticket,TGT被KDC的Master Key进行加密,该TGT包含了Server和KDC的Session Key(SKDC-Server)
.Authenticator:用以证明当初Client TGT的拥有者是否就是自己,其中包含了Client info,使用SKDC-Client进行加密
.Client name & realm: 简单地说就是Domain name\Client。
.Server name & realm: 简单地说就是Domain name\Server,这回是Client试图访问的那个Server

TGS收到Client申请Ticket的请求之后,先得验证Client提供的那个Client TGT是否是AS颁发给它的。于是它不得不通过Client提供的Authenticator来证明。但是Authentication是通过Logon Session Key(SKDC-Client)进行加密的,而自己并没有保存这个Session Key。所以TGS先得使用自己的Master Key对Client提供的Client TGT进行解密,从而获得这个Logon Session Key(SKDC-Client),再通过这个Logon Session Key(SKDC-Client)解密Authenticator进行验证。验证通过后,TGS再次使用自己的Master Key对Server TGT进行解密,得到Session Key(SKDC-Server)。
验证通过向Client发送Ticket Granting Service Response(KRB_TGS_REP)。这个KRB_TGS_REP有两部分组成:使用Logon Session Key(SKDC-Client)加密过的用于Client和Server的Session Key(SServer-Client)和使用Session Key(SKDC-Server)进行加密的Ticket。该Ticket包含以下内容:

.Session Key:SServer-Client。
.Client name & realm: 简单地说就是Domain name\Client
.End time: Ticket的到期时间

Client收到KRB_TGS_REP,使用Logon Session Key(SKDC-Client)解密第一部分后获得Session Key(SServer-Client)。有了Session Key和Ticket,Client就可以直接和Server进行交互,而无须再通过KDC作中间人了。

4、CS(Client/Server )Exchange
Client创建用于证明自己就是Ticket的真正所有者的Authenticator,并使用Session Key(SServer-Client)进行加密,Client将Authenticator和Session Key(SKDC-Server)加密过得的Ticket发送给Server,Server使用Session Key(SKDC-Server)解密Ticket,得到Session Key (SServer-Client),然后使用Session Key (SServer-Client)解密Authenticator实现对client的认证。至此,kerberos认证完成,Client可以直接访问Server.

相关标签: Kerberos