官网:https://www.kerberos.org/
官方文档:http://web.mit.edu/kerberos/krb5-current/doc/
为TCP/IP网络系统设计的可信的第三方身份认证协议。网络上的Keberos服务基于DES对称加密算法,但也可以用其他算法替代。因此,Keberos是一个在许多系统(尤其是大数据生态)中获得广泛应用的身份认证协议。
适用场景:
Kerberos采用客户端/服务器(CS)结构与DES加密技术,并且能够进行相互认证,即客户端和服务器端均可对对方进行身份认证,是一种应用对称密钥体制进行密钥管理的系统。可以用于防止窃听、防止replay攻击、保护数据完整性等场合。
Kerberos是一种基于加密Ticket的身份认证协议,主要由三个部分组成:即KDC、Client和Service。
KDC,Key Distribution Center,主要由三个部分组成:
Realm:Kerberos管理领域的标识
principal:Kerberos下的用户,当每添加一个用户或服务时,都需要向KDC添加一条principal,形式为:主名称/实例名@领域名。
主名称:可以是用户名或服务名,表示是用于提供各种网络服务(如HDFS、yarn、hive)的主体。
实例名:简单理解为主机名
keytab文件:存储用户的加密密码。常用这种方式认证。
Ticket分两种:
principal有两类:
用户principal:形如Name[/Instance]@REALM
其中Instance是可选的,通常用于更好地限定用户的类型。比如,一个管理员用户通常会有admin instance,即Name/admin@REALM
。
服务principal:形如Service/Hostname@REALM
第一部分是service的名字,如imap,AFS,FTP。通常host
这个名字被用于指明对一台机器的通用的访问(telnet,rsh,ssh)。
第二个component是提供这个服务的机器的全限定域名(FQDN)。这个component跟DNS对应用服务器的IP地址进行逆向解析后得到的主机名。
关于Kerberos的一些理论知识储备:
客户端会先访问两次KDC,然后再访问目标Service,如:HTTP服务。
大体来说是3次请求与响应:
通过这个Sub-protocol,KDC中的Authentication Service实现对Client身份的确认,并颁发给该Client一个TGT
Client向KDC的AS发送Authentication Service Request(AS_REQ),为了确保AS_REQ仅限于自己和KDC知道,Client使用自己的Master Key对AS_REQ的主体部分进行加密(KDC可以通过Domain的Account Database获得该Client的Master Key)。AS_REQ的大体包含以下的内容:
AS通过它接收到的AS_REQ验证发送方的是否是在Client name & realm中声称的那个人,也就是说要验证发送放是否知道Client的Password。所以AS只需从Account Database中提取Client对应的Master Key对Pre-authentication data进行解密,如果是一个合法的Timestamp,则可以证明发送放提供的是正确无误的密码。验证通过之后,AS将一份Authentication Service Response(AS_REP)发送给Client。AS_REQ主要包含两个部分:本Client的Master Key加密过的Session Key(SKDC-Client:Logon Session Key)和被自己(KDC)加密的TGT。而TGT大体又包含以下的内容:
Client通过自己的Master Key对第一部分解密获得Session Key(SKDC-Client:Logon Session Key)之后,携带着TGT便可以进入下一步:TGS Exchange。
TGS Exchange通过Client向KDC中的TGS发送TGS Request(TGS_REQ)开始。TGS_REQ大体包含以下的内容:
TGS收到TGS_REQ在发给Client真正的Ticket之前,先得整个Client提供的那个TGT是否是AS颁发给它的。于是它不得不通过Client提供的Authenticator来证明。但是Authentication是通过Logon Session Key进行加密的,而自己并没有保存这个Session Key。所以TGS先得通过自己的Master Key对Client提供的TGT进行解密,从而获得这个Logon Session Key,再通过这个Logon Session Key解密Authenticator进行验证。验证通过向对方发送Ticket Granting Service Response(TGS_REP)。TGS_REP有两部分组成:使用Logon Session Key加密过用于Client和Server的Session Key(SServer-Client)和使用Server的Master Key进行加密的Ticket。该Ticket大体包含以下一些内容:
Client收到TGS_REP,使用Logon Session Key解密第一部分后获得Session Key(SServer-Client)。有了Session Key和Ticket,Client就可以之间和Server进行交互,而无须在通过KDC作中间人。因此Kerberos是一种高效的认证方式,它可以直接通过Client和Server双方来完成,不像Windows NT 4下的NTLM认证方式,每次认证都要通过一个双方信任的第3方来完成。
Authenticator - 为有效的证明自己提供证据
通过上面的过程,Client实际上获得两组信息:一个通过自己Master Key加密的Session Key,另一个被Sever的Master Key加密的数据包,包含Session Key和关于自己的一些确认信息。一般而言,只要通过一个双方知晓的Key就可以对对方进行有效的认证,但是在一个网络的环境中,这种简单的做法是具有安全漏洞,为此,Client需要提供更多的证明信息,我们把这种证明信息称为Authenticator,在Kerberos的Authenticator实际上就是关于Client的一些信息和当前时间的一个Timestamp。
Client通过TGS Exchange获得Client和Server的Session Key(SServer-Client),随后创建用于证明自己就是Ticket的真正所有者的Authenticator,并使用Session Key进行加密。最后将这个被加密过的Authenticator和Ticket作为Application Service Request(AP_REQ)发送给Server。AP_REQ还包含一个Flag用于表示Client是否需要进行双向验证(Mutual Authentication)。
Server接收到AP_REQ之后,通过自己的Master Key解密Ticket,从而获得Session Key。通过Session Key解密Authenticator,进而验证对方的身份。验证成功,让Client访问需要访问的资源,否则直接拒绝对方的请求。
对于需要进行双向验证,Server从Authenticator提取Timestamp,使用Session Key进行加密,并将其发送给Client用于Client验证Server的身份。
为何要用Timestamp
试想这样的现象:Client向Server发送的数据包被某个恶意网络监听者截获,该监听者随后将数据包座位自己的Credential冒充该Client对Server进行访问,在这种情况下,依然可以很顺利地获得Server的成功认证。为了解决这个问题,Client在Authenticator中会加入一个当前时间的Timestamp。
在Server对Authenticator中的Client Info和Session Ticket中的Client Info进行比较之前,会先提取Authenticator中的Timestamp,并同当前时间进行比较,如果他们之间的偏差超出一个可以接受的时间范围(如5min),Server会直接拒绝该Client的请求。Server维护着一个列表,这个列表记录着在这个可接受的时间范围内所有进行认证的Client和认证的时间。对于时间偏差在这个可接受的范围中的Client,Server会从这个这个列表中获得最近一个该Client的认证时间,只有当Authenticator中的Timestamp晚于通过一个Client的最近的认证时间的情况下,Server采用进行后续的认证流程。
分为Server和Client安装:
Server:
配置文件:
client