Kerberos古已有之,是由MIT开发,对三方进行验证鉴权的服务安全管理系统,很好的体现了西方三权分立的思想。名字来源于希腊神话地狱三个脑袋的看门狗,这只狗在哈利波特中也路过脸。


harry_kerberos.png


对,跳吧,跳进坑里去吧。一入K坑深似海,从此作者不早起。






系统设计上采⽤用客户端/服务器器结构与DES加密技术,并且能够进⾏行行相互认证,即客户端和服务器器端均可对对⽅方进⾏行行身份认证。可以⽤用于防⽌止窃听、防⽌止replay击、保护数据完整性等场合,是⼀一种应⽤用对称密钥体制进⾏行行密钥管理理的系统。百度百科






哪怕是一个最基本的用户登录验证体系,都会包含三个部分,验证,授权,请求服务。Kerberos也不例外,同样分为这三个阶段。

Kerberos有几个关键的服务或者是功能我们必须了解,其中KDC是核心,全称叫做Key Distributed Center,我们可以把它想象成银行的数据库。所有初始的验证授权工作都是在这里进行的。然后你可以把ATM提供钞票这个事作为服务来看待(Desired Network Service)。

kerberos1.png

Kerberos有几个关键的服务或者是功能我们必须了解,其中KDC是核心,全称叫做Key Distributed Center,我们可以把它想象成银行的数据库。所有初始的验证授权工作都是在这里进行的。然后你可以把ATM提供钞票这个事作为服务来看待(Desired Network Service)。

第一步是验证(Authentication),你必须证明自己是自己,这会需要你提供一个认证主体,这就是Kerberos里面的Principal,你可以把它想象成银行卡,如果你没有Principal,那么就相当于你去银行取钱没有带卡一样。当然ATM取钱是不需要×××的,所以你必须确保你的银行卡及密码不会落入劫匪的手里,显然不在朋友圈炫富是你需要注意的事,不是Kerberos的事。

那么Principal就相当于是你的银行卡,带卡之后需要做什么呢,当然你要给出银行卡的密码,如同现实世界一样,无论是你,还是你的亲属只要他有你的银行卡,有你的密码,就可以从ATM取钱。Kerberos也是这样,每一个Principal都有其对应的密码,这是这个Principal在创建时必须要做的一件事,同时你要保护好自己的密码。不过这里有一点不同的地方,Kerberos的Principal的密码并不是用来做用户身份识别用的,密码是用来加密传输票据来用的,所以密码是不会在网络上传输的。

kerberos2.png

客户端,也就是你,给出了银行卡,输入了密码,然后客户端Kerberos会用你给出的密码用DES算法加密一段数据,我们称之为TGT(Ticket-Granting Ticket),这个TGT会发送给KDC的AS服务,也就是Authentication Service。然后AS会用本地的Kerberos用户数据库中的数据对客户端给过来的TGT进行比对,如果结果一致,则发还一个验证通过的TGT给client,如果不一致,则拒绝提供下一步的服务。

kerberos3.png

假设ATM通过银行的数据库认可了你的身份,那么接下来就要看你是要取钱,还是要转账,在这里我们需要把取钱和转账的权限分开以便做说明,而现实世界里,ATM既能取钱也能转账。

接下来,客户端需要发送第二个假面TGT给KDC的票据批准服务(Ticket Granting Service),看看当前这张银行卡是不是具有转账的权力。

kerberos4.png

如果这张银行卡具有转账的权力,则TGS会发还给Client一个新的TGT,告诉Client,你的身份确认无误,具备转账的权力,你可以操作转账选项了(Desired Network Service)

kerberos5.png

然后Client会拿这这张票据去请求转账。而转账操作当然也会对KDC发起请求,类似Client,在这里不再赘述


大致的流程是这样的,不过我想,对于初次接触Kerberos的人来说,一个值得区别理解的概念是,Kerberos并不是用来保护服务器或者操作系统的,那是SSH干的事。Kerberos更多的是用来保护基于操作系统的应用服务的,比如MySQL,PostgreSQL,Hadoop,HBase这样的服务请求。换句话说,SSH做的工作是询问你是谁。而Kerberos的工作是验证你要干什么?


接下来,我们需要知道Kerberos中的一些关键性的名词定义以方便我们的理解。

KDC,我们已经知道了,kerberos的核心服务。

Principal,身份认证主体,如果仍然理解困难,那么把它想象成你的SSH用户名吧。

Keytab,基于Principal生成的密钥文件,如果不明白,把它想象成SSH的免密码登录的私钥。

TGT,使用密码或者keytab作为密钥生成的加密数据,作为请求KDC服务的票据数据包,但并不包含密码或者密钥。

SPNEGO,并不包含在Kerberos的标准服务中,是微软扩展的一个插件,主要用来作基于Kerberos的HTTP服务的保护,全称是Simple Protected GSSAPI Negotiation。换句话说,是用Kerberos来保护HTTP服务请求,比如Rest服务。


Kerberos第一篇的最后,我们来拆解一个Principal来了解这张银行卡的构成。


xianglei/dmp-master1.hadoop@HADOOP.COM


一个完整的Principal由3个部分构成。

用户名/FQDN(Full Quafilied Domain Name)的主机名@REALM(受保护的域,全大写)

  1. 当然这个用户名需要是Linux下存在的用户

  2. FQDN全限定域名,就是一定要带上hostname.domain这种形式,当然,如果你的主机并没有给出domain,那么不写域名也可以。反正就是要全部的主机名加域名(如果存在域名的话)。但实际上,在Kerberos里面,这个并不称之为主机名,而是叫做Instance,实例名,他可以不是任何服务器的主机名称,但是便于理解和认识,我们还是先把他当初主机名来看待吧。

  3. REALM,受到Kerberos保护的域名称,就是一类或一组受到Kerberos保护服务的服务器集合,你可以想象成Windows里面的域。由于一个KDC可以同时保护多个域,比如你可以在一个KDC上既保护HADOOP服务器组,也保护MYSQL服务器组,所以我们通常会使用域名来进行区别。

如果你的hostname里面使用了domain name,那么你必须在Principal的第二部分写完整,否则KDC将无法验证主机的合法性,加密的tgt是要带着主机名信息的。

还有,特别需要注意的是,这里面第二部分的domain(域名),第三部分的realm(域),在中文里的字是一样,但是英文单词完全不同,他们所表达的含义也完全不同。由于通常Kerberos的Realm部分也会写成域名的形式,所以就会让人迷惑,而实际上,你把realm部分理解成windows里面的workgroup或者home这种域也是可以的。名称可以随便起,不一定用你的真实域名。只是个区分不同服务集合的代号。


下一篇写安装配置?