Kerberos认证步骤

Kerberos的特点

Kerberos是一个Authentication协议,也就是说它的目的是判断某个client/server是否就是它声称的client/server。

Kerberos协议避免了用户的密码以明文的形式被传输,避免了密码被截获的危险。而且使用的是一种短期的Key,由于这种Key只在一段时间内有效,即使加密的数据包被恶意的网络监听者截获,等他把Key计算出来的时候,这个Key早就已经过期了。

Kerberos中的角色除了client和server,还引入了一个第三方:KDC(Kerberos Distribution Center)。从逻辑上KDC分成三部分:数据库,认证服务器(Authentication Server)和票据分发服务器(Ticket Granting Server)。后面将会进行更详细的介绍。

一旦Client从KDC获得用于访问某个Server的Ticket,之后该Server就能根据这个Ticket实现对Client的验证,而无须KDC的再次参与。

Kerberos 认证步骤

Kerberos认证步骤

1. Authentication Service Exchange

步骤1.

Client向KDC的Authentication Service发送Authentication Service Request(KRB_AS_REQ)。内容包含:

  • Pre-authentication data:包含用以证明自己身份的信息。就是证明自己知道自己声称的那个account的Password。一般地,它的内容是一个被Client的Master key加密过的Timestamp。
  • Client name & realm
  • KDC的Ticket Granting Service的Server Name。

步骤2.

AS(Authentication Service)通过它接收到的KRB_AS_REQ验证发送方的是否是在Client name & realm中声称的那个人,也就是说要验证发送放是否知道Client的Password。所以AS只需从Account Database中提取Client对应的Master Key对Pre-authentication data进行解密,如果是一个合法的Timestamp,则可以证明发送方提供的是正确无误的密码。

验证通过之后,AS将一份Authentication Service Response(KRB_AS_REP)发送给Client。KRB_AS_REQ主要包含两个部分:

  • 被Client的Master Key加密过的Logon Session Key
  • 被自己(KDC)的Key加密过的TGT。TGT主要包含三部分内容:

(1)Logon Session Key(2)Client name & realm (3)End Time:TGT的到期时间

Client通过自己的Master Key对第一部分解密获得Logon Session Key之后,携带着TGT便可以进入下一步:TGS(Ticket Granting Service)Exchange。

2. TGS(Ticket Granting Service)Exchange

步骤3.

Client向KDC中的TGS(Ticket Granting Service)发送Ticket Granting Service Request(KRB_TGS_REQ),内容包括:

  • TGT:Client通过AS Exchange获得的被KDC Key加密的Ticket Granting Ticket。
  • Authenticator:用以证明当初TGT的拥有者是否就是自己,所以它用Logon Session Key来进行加密。内容包括:
    (1)Client Info (2)Timestamp
  • Client name & realm
  • Server name & realm:这是Client试图访问的那个Server

步骤4.

TGS先通过自己的Master Key对Client提供的TGT进行解密,从而获得这个Logon Session Key。再通过这个Logon Session Key解密Authenticator进行验证。

验证通过向对方发送Ticket Granting Service Response(KRB_TGS_REP)。内容包括:

  • 使用Logon Session Key加密过的Session Key。该Session Key 将被用于Client和Server的认证
  • 使用Server的Master Key进行加密的Ticket。该Ticket大体包含:

(1)Session Key (2)Client name & realm(3)End Time:Ticket的到期时间

Client收到KRB_TGS_REP,使用Logon Session Key解密第一部分后获得Session Key。有了Session Key和Ticket,Client就可以之间和Server进行交互,而无须在通过KDC作中间人了。所以我们说Kerberos是一种高效的认证方式,它可以直接通过Client和Server双方来完成。

3. CS(Client/Server )Exchange

步骤5.

Client向Server发送KRB_AP_REQ,内容包括:

  • Ticket:Client 通过TGS Exchange获得的被Server Key加密的Ticket
  • Authenticator:用以证明Ticket的拥有者是否就是自己,所以用Session Key进行加密。内容包括:(1)Client Info(2)Timestamp
  • Flag:用于表示Client是否需要进行双向验证

步骤6.

Server接收到KRB_AP_REQ之后,通过自己的Master Key解密Ticket,从而获得Session Key(SServer-Client)。通过Session Key(SServer-Client)解密Authenticator,进而验证对方的身份。验证成功,让Client访问需要访问的资源,否则直接拒绝对方的请求。

对于需要进行双向验证,Server从Authenticator提取Timestamp,使用Session Key(SServer-Client)进行加密,并将其发送给Client用于Client验证Server的身份。

Kerberos协议的一些术语

Principal:

Principal是用来表示参加认证实体,相当于用户名,用来来表示一个client或server唯一的身份。Principal是由三个部分组成:名字(name),实例(instance,这部分可选),REALM(域)。格式是:name/instance@REALM 。

  • name:

可以是任意的字符串,比如说可能是操作系统下的用户名等。

  • instance

定义了用户在不同的role下使用的priciple,或者是在host在不同的service上运行时使用的principle。

  • realm

realm从逻辑上定义了一组object。每个realm可以有私有的配置,包括KDC的地址和加密算法等。大型公司会给公司内不同的团队创建不同的realm。

KDC数据库

KDC数据库存储了它所有用户(包括client和server)的entry。我们用principal来引用一个entry,。每个entry包括以下的信息:

  1. 与entry相关联的principal
  2. principlal的master key
  3. 与这个principal相关联的ticket最长可用时间
  4. 与这个principal相关联的ticket的最长的renew时间(译注:是指这个ticket通过renew机制累计可55. 用的时间)(只在kerberos 5中可用)
  5. 决定这个ticket的具体行为的属性和标志位。
  6. Master key过期时间
  7. 这个principal的过期时间,在此之后就不为这个principal分发ticket了。

为了使得窃取数据库中的密钥更加因难,Kerberos的实现们使用master key来对数据库进行加密,master key被关联在K/M@REALM这个principal上。即使是数据库的dump,备份和master KDC到salve KDC的propagation也会被用这个密钥加密,因此,如果想要重新加载它们,就必须知道这个密钥。

Keytab

Keytab是一个存储于client或server端的文本文件,包含了kerberos principle和该principle的master key。所以这个文件需要很小心地保存。

下一节将会安装并配置一个kerberos KDC和client,来帮助更好地理解kerberos,熟悉kerberos的基本命令。

你可能感兴趣的:(Kerberos认证步骤)