今天抽时间初略学习了一下kerberos网络认证过程,作为笔记整理如下,希望与大家分享。
一、Kerberos初步定义:
Kerberos这一名词来源于希腊神话“三个头的狗——地狱之门守护者”。Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。
Kerberos 服务是单点登录系统,这意味着您对于每个会话只需向服务进行一次自我验证,即可自动保护该会话过程中所有后续事务的安全。服务对您进行验证后,即无需在每次使用基于 Kerberos 的命令(如ftp 或 rsh)或访问 NFS 文件系统上数据时都进行自我验证。因此,无需在每次使用这些服务时都在网络上发送口令(口令在网络上可能会被拦截)。
二、Kerberos认证工作过程:
主要分要两大步骤,见图进行说明:
步骤一:申请并获取TGT,具体步骤如下
1.Client向KDC发送自己的身份信息(Info C)
2. KDC收到Client的身份信息后,从Ticket Granting Service得到TGT(ticket-granting ticket)
3. KDC用协议开始前产生的Client与KDC之间的密钥(Key A)将TGT加密回复给Client。
4. Client使用Key A把加密后的TGT解密得到非加密的TGT。由于此密钥是Client与KDC之间的密钥,所以此时只有真正的Client才能利用它与KDC之间的密钥将加密后的TGT解密,从而获得TGT。(此过程避免了Client直接向KDC发送密码,以求通过验证的不安全方式)
步骤二: Client利用之前获得的TGT向KDC请求其他Service的Ticket,从而通过其他Service的身份鉴别。具体步骤如下:
5. Client将之前获得TGT和要请求的服务信息(Info CS )发送给KDC
6. KDC中的Ticket Granting Service将为Client和Service之间生成一个Session Key用于Service对Client的身份鉴别。
7. KDC将这个Session Key和用户名,用户地址(IP),服务名,有效期, 时间戳一起包装成一个Ticket--(Service Tictket) (这些信息最终用于Service对Client的身份鉴别)发送给Service, 不过Kerberos协议并没有直接将Ticket发送给Service,而是通过Client转发给Service.所以有了第8-11步。
8. 此时KDC将刚才的Ticket转发给Client。由于这个Ticket是要给Service的,不能让Client看到,所以KDC用协议开始前KDC与Service之间的密钥(Key C)将Ticket加密后再发送给Client。同时为了让Client和Service之间共享那个秘密(KDC在第一步为它们创建的Session Key), KDC用Client与它之间的密钥将Session Key加密随加密的Ticket一起返回给Client。也即是说:Client与Service之间的Session Key(Key B)发出了两个副本,一个是发给Client的,一个是发给Service的,发给Client的可由Client解密取出使用,但发给Service的由于是由Key C加密,经由Client转发给Service,所以,Client不能取出,到了Service端后可由Service端取出。
9. 为了完成Ticket的传递,Client将刚才收到的Service Ticket转发到Service. 由于Client不知道KDC与Service之间的密钥,所以它无法算改Ticket中的信息,只能老老实实地完成转发任务。
10.Client将收到的Session Key解密出来(用Key A解密)
11.Client将自己的用户名,用户地址(IP)打包成Authenticator用前面得到的Session Key(Key B)加密后也发送给Service。
12.Service 收到Ticket后利用它与KDC之间的密钥(Key C)将Ticket中的信息解密出来,从而获得Session Key和用户名,用户地址(IP),服务名,有效期。然后再用Session Key(Key B)将Authenticator解密从而获得用户名,用户地址(IP)将其与之前Ticket中解密出来的用户名,用户地址(IP)做比较从而验证Client的身份。
13. 如果Service有返回结果,将其返回给Client。