Kerberos是怎么工作的?

 Theodore Si      06 July 2019

在希腊神话中,存在一只名叫Kerberos的三头神犬,它守护着地狱之门,防止任何人闯入地狱,改写生死簿(好像剧情不太对。。。)。而在计算机领域,也存在着这样一头看家护院的神犬,不过它的职责是守护各种服务与资源,保证它们不被未经认证的人使用。Kerberos协议被广泛应用在各类场景中(举个栗子,Active Directory),许多人在工作环境中都曾经使用过相关命令,或者隐式地与之打过交道。但是,你是不是只有在发现服务不可用(例如数据库无法访问,NFS文件无法打开)以后,才会想起来跑一下kinit命令解决问题,然后就此了事?而当被问起Kerberos具体的工作流程时却哑口无言?事实上,对于任何软件行业从业者,认识并了解关于Kerberos的秘密都是十分必要的。因此,我希望通过这篇文章,让读者对这只三头神犬不再充满畏惧。

Kerberos

什么是Keberos

在谈论Kerberos的技术细节之前,我希望通过一个故事让你了解Kerberos的本质。如果你把这个故事复述给自己的奶奶,她也能听懂(assert 你的奶奶 is not 严蔚敏),那说明你真正理解了Kerberos。

我要到华盛顿闹革命

特朗普上台以后,你听闻美国人民生活在水深火热之中,华盛顿甚至发生数次暴动。因此你决定远赴美国,传播共产主义精神,解救美帝人民于水火之中。在得知游泳跨越太平洋难度极大,且偷渡属于违法行为之后,你决定做一个遵纪守法的好公民,所以来到美国大使馆办理相关手续。

在美国大使馆,一位和蔼可亲的小姐姐接待了你。在得知你此行的目的后,小姐姐说:“你需要先去当地派出所办理户籍证明,这样我们才能帮你办理后续手续”。于是你前往派出所。

当你来到派出所,告诉民警你要办户籍证明时,民警问:“你有快速通行证吗?”那一刻你以为自己来到了迪士尼。你说,“没有”。于是民警说,“那你去那边,凭你的姓名和身份证号办理”。这里我们假设,每个人都把自己的身份证号妥善保管,只有自己知道。因此只要你能提供这两项信息,派出所就认为你是你所声称的人(这真是一个没有信息泄露的美好社会)。民警用手指了一个方向,你顺着他的手看过去,在一个阴暗的角落里,你看到了他(or它?)

Flash

三个小时以后,你擦干眼中的泪水,终于办好了手续,这是一张蓝色的纸条。你拿着纸条以为自己手续办完可以到大使馆去了,正要出门,民警却把你叫住。你心里一阵慌乱,以为昨天乱闯红绿灯的事情要东窗事发了。谁知他说,“你去哪啊?你不是办证明吗,还没办完怎么就走了?”你挥挥手中的蓝色纸条,说:“这不就是证明吗?”民警笑笑,说:“当然不是了,那个是快速通行证,你呀,要拿着他到另外一个窗口办证明!”五分钟以后,你拿到了一张绿色的证明,同时你被告知,如果下次来派出所办事,记得带着蓝色的快速通行证,省时又省力。而且这种快速通行证只有公安局才能制作,拥有先进的防伪技术,因此每个人出示的快速通行证一定是真的。随后你低头看看那张绿色证明,上面有“美国大使馆”的水印,原来这种纸张是大使馆分发给派出所用来办理此项证明的,无法伪造,因此你拿着这张纸去大使馆,他们就知道你的确是在派出所办理了相关证明。于是你带着证明以及快速通行证离开派出所,前往美国大使馆顺利办理了出国手续。

从美国回来没多久,巴黎圣母院着火了。拥有国际视野的你决定到法国为巴黎圣母院祈福。可是fà国也不是你想去就能去的呀,又需要办理证明。这次你刚刚踏进派出所的门,就听到一声,“来了老弟”,原来又是上次那个民警。你掏出了蓝色通行证,于是5分钟之内手续就办好了。这次你得到了一张红色的,带有“法国大使馆”水印的证明。带着它,你顺利办理了出国手续。

刚从巴黎回来,你又要去日本(羡慕你这样有钱又有闲的人)。这次到了派出所,还没等人家问你,你就掏出了蓝色通行证。结果民警问你:“你这是啥玩意?”,你说,“这是你们的快速通行证啊”。“哦,这样啊。可是我们前两天刚刚换成彩色通行证了,你这个啊,过期了!那边排队去吧!”说着,他把手指向了那个阴暗的角落。

泪水从你的眼中奔涌而出。

Cry

Story is cheap, show me the protocol!

此刻你也许会说,“故事我听懂了。在这个故事里,我想要到大使馆办理出国手续,也就是使用大使馆的服务,那么就先要到派出所办理身份证明,也就是进行认证。可是如果别人面试的时候我给他讲这么一个故事,恐怕是会被轰出去吧?!”

好,那我下面就来讲讲Kerberos协议的技术细节。Kerberos是一种网络认证协议,它通过对称密钥加密算法,为客户/服务器应用提供认证,而且还能提供Single Sign-on(SSO)。它由MIT开发,并且被广泛应用于多种商业产品中。

在Kerberos协议中,主要涉及三方:

  1. Client
  2. Key Distribution Center(KDC)
  3. Server

在Kerberos协议中,Client和Server均被称为Principal。Client为了使用某台Server,首先要向其表明自己的身份。可是如果把自己的用户名密码直接通过未加密的网络发送过去,可是一件太过危险的事了!因为你永远不知道谁在监视你的网络。因此,我们必须对发送的数据进行加密。

Client会首先向KDC发送自己的身份信息。发送的数据包是部分加密的,其中的重点在于Client的用户名是明文,而其他信息则通过Client的密码加密。当数据包到达KDC后,由于KDC储存了网络上所有Principal的密码,因此它会根据用户名找到其密码,然后对数据包进行解密(对称加密算法)。如果成功,则KDC相信Client是自己所声称的身份,因为它拥有正确的密码。此时,KDC会向Client发送一个Ticket Granting Ticket(TGT)。TGT是一个被KDC用自己的秘钥加密过的数据包。Client在收到TGT后,会将其存储在自己的内存中。Client无需关心TGT中被加密的内容是什么,事实上它也无从得知,因为KDC的秘钥只有KDC自己知道,Client无法解密。

现在Client需要使用某项网络上的服务,例如访问数据库。于是Client告知KDC自己希望访问的资源,同时把先前得到的TGT一同发送过去。KDC在得到TGT后,用自己的秘钥对其解密。由于这个TGT是KDC自己生成的,而且也只能由KDC生成,所以一旦解密成功,KDC就会向Client发送一个可用来访问数据库服务器的Ticket。由于数据库服务器也是KDC所知的一个Principal,所以KDC也知道其秘钥,因此这个Ticket是KDC用Server的秘钥加密过的,里面保存了Client的相关信息。Client在得到这个Ticket以后,会将其发送到数据库服务器,服务器马上用自己的秘钥对其进行解密。如果解密成功,Server就知道,这个数据包一定是KDC加密过的合法数据包,因为除自己以外,只有KDC知道自己的秘钥。于是Server给予Client访问权限。

如果你把Kerberos协议和上面的故事进行对比,你就会发现“你”就是Client,派出所就是KDC,而各个大使馆就是Server。你希望使用大使馆提供的服务,就要向他们证明你是自己所声称的那个人,因此就需要首先向KDC(派出所),提供自己的用户名和密码(也就是你的姓名和身份证号码)。派出所根据你提供的姓名找到对应的身份证号码,发现和你提供的一致,也就证实了你的身份。而蓝色的快速通行证其实就是TGT,(TGT具有实效性,所以才会出现后来换了彩色通行证蓝色的就不被承认了)。而绿色、红色的大使馆证明,就是Ticket,你带着Ticket使用相关服务,Server看到正确的Ticket就知道你认证过了,因此也就会为你提供服务。

总结

读完本文,你是不是发现这只三头神犬也没有那么神秘呢?当然这里我们只是非常浅显地介绍了Kerberos的认证过程,许多技术细节并没有深入探讨,更多详细内容就留在未来吧!(TODO)

Lie

参考资料

Designing an Authentication System: a Dialogue in Four Scenes

How Kerberos Works