Kerberos协议详解

介绍

最近工作中经常用到Kerberos认证,虽然一些软件已经实现了Kerberos认证,配置一下就能使用,但是我一直不是很清楚它的具体流程,下面通过分析它的协议(Kerberos V5)进一步加深对Kerberos认证的了解。

角色

Kerberos是一种第三方认证协议,通过使用对称加密技术为客户端/服务器应用程序提供强身份验证。在希腊神话中Kerberos是守护地狱之门的一条三头神犬,而这三个头分别代表着协议的三个角色,如下图所示它们分别是:

  1. 访问服务的Client

  2. 提供服务的Server

  3. KDC,密钥分发中心,该中心里又包含以下两个服务:

    AS,身份验证服务

    TGS,票据授权服务

流程

Kerberos认证主要通过三个子协议来完成,它们分别为:

  • Authentication Service Exchange,身份认证服务交换,是Client与AS之间交互,包含KRB_AS_REQKRB_AS_REP两个包。
  • Ticket-Granting Service (TGS) Exchange,票据授权服务交换,是Client与TGS之间交互,包含KRB_TGS_REQKRB_TGS_REP两个包。
  • Client/Server Authentication Exchange,客户端/服务认证交换,是Client与Server之间交互,包含KRB_AP_REQKRB_AP_REP两个包。

具体流程如下图所示:

下面以用户pixis去访问CIFS服务为例来详细讲解一下这3个交换的过程。

身份认证服务交换

首先当用户在Client输入用户名和密码时,Client将用户密码的hash值作为加密密钥,对时间戳进行加密,同时附上明文的用户名发送给AS,KRB_AS_REQ包的格式如下所示:

AS收到KRB_AS_REQ后会通过用户名查找该用户对应密码的hash值,然后去解时间戳,还要对时间戳的有效性进行验证,时间戳不能和AS的时间相差太大,否则就说明两边时间不同步或者是一个重放的请求,AS会直接拒绝该请求,Kerberos认证强依赖于时钟同步,接下来还会看到它的用处。通过这一步AS就完成了对Client的验证以及时钟同步的验证。

AS会创建一个连接Client和TGS的会话key(Client/TGS Session Key,绿色的钥匙)以及TGT(Ticket Granting Ticket),TGT中包含用户信息,时间戳,超时时间以及Client/TGS Session Key。AS将TGT用TGS密码的hash值加密(红锁),将Client/TGS Session Key用该用户(pixis)密码的hash值加密(蓝锁)。然后AS将这两部分放到KRB_AS_REP中返回给Client。

Client收到AS的响应消息以后,利用自身用户(pixis)密码的hash值对KRB_AS_REP中的上半部分进行解密,这样可以获取到Client/TGS Session Key,Client/TGS Session Key是票据授权服务交换阶段需要用到的密钥,票据授权服务交换不再使用用户(pixis)密码的hash值作为密钥。但由于TGT是使用TGS密码的hash值加密的,所以Client无法对其解密。那么这里就有个疑问了,既然Client无法处理TGT,那AS为什么要把它发给Client呢?它到底是干什么用的呢?这个问题接下来再回答。

票据授权服务交换

Client使用Client/TGS Session Key对用户信息以及当前的时间戳进行加密生成Authenticator,然后再附上AS发送过来的TGT以及自己要申请访问的服务信息CIFS,生成KRB_TGS_REQ后发送给TGS。

TGS收到Client发送来的KRB_TGS_REQ后,其逻辑如下图所示:

  1. TGS使用自己的密码对TGT进行解密,然后拿到TGT中的Client/TGS Session Key。

  2. TGS使用Client/TGS Session Key解开Authenticator,拿到里面的用户名以及时间戳。

  3. TGS根据前两步解析的信息对Client进行认证并授权。实际上TGS这一步要做甚多事情,下面我简单的列一些:

    比较TGT中的用户名和Authenticator中的用户名是否一致

    比较Authenticator中的时间戳和TGS系统时间的差值是否在一定范围内

    TGS缓存最近一段时间内用户的认证时间,TGS要求Authenticator中的时间戳要晚于该用户最近一次认证的时间

    比较包的源IP和TGT中的IP是否一致

    验证pixis用户是否有访问CIFS的权限

通过上面TGS的处理逻辑可以看出,TGT实际上是给TGS用的,TGS需要对它进行解密并获取Client/TGS Session Key以及Client信息。有了Client/TGS Session Key,TGS才能用它解开KRB_TGS_REQ中的Authenticator信息,并对Client进行验证。也就是说在第一阶段AS认证完Client后本来应该把KRB_AS_REP拆成两部分,一部分Client/TGS Session Key发给Client,另一部分TGT发给TGS,但是AS没有这样做,而是把这两部分都发给了Client,这是为什么呢?首先网络传输有延时,AS没法保证TGS在收到KRB_TGS_REQ之前必须收到TGT,AS和TGS是两个独立的服务,除了AS里面存有TGS的密码外它们之间没有太多的联系,既然这样还不如让Client代为发送TGT。其次如果AS直接发送TGT给TGS,TGS势必要缓存TGT里面的信息,这就增加的TGS的复杂度。

验证通过后,TGS会创建一个连接Client和Server之间的会话key(Client/Server Session Key,紫色的钥匙)以及ST(Service Ticket),ST中包含用户信息,Service信息以及Client/Server Session Key。TGS将ST用Server密码的hash值加密(黄锁),将Client/Server Session Key用Client/TGS Session Key加密(绿锁)。然后TGS将这两部分放到KRB_TGS_REP中返回给Client。

有没有觉得KRB_TGS_REP和身份认证服务交换阶段的KRB_AS_REP很像,只不过Client/TGS Session Key变成了Client/Server Session Key,TGT变成了ST。

客户端/服务认证交换

接下来的逻辑就跟票据授权服务交换阶段很像了。Client使用Client/Server Session Key对用户信息以及当前的时间戳进行加密生成Authenticator,然后再附上TGS发送过来的ST,生成KRB_AP_REQ后发送给Server。

Server端的处理逻辑也跟票据授权服务交换阶段的TGS服务很像,这里就不赘述了,现在我们看看Server端返回什么。为了防止Server是个假的Server,Client要求Server将Authenticator字段中的Timestamp用Client/Server Session Key加密后发回来,通过上图我们知道,Server要想得到Client/Server Session Key,必须要有密码来解开ST才行,只有真的Server才有密码解开ST,而假的Server是拿不到Client/Server Session Key的。

Client收到KRB_AP_REP后用Client/Server Session Key对其解密,得到Timestamp后然后跟之前发送的Timestamp对比,信息一致就说明对端是真的Server,这样就完成了Client和Server间的双向认证。

TGS服务

看完上面的流程后总感觉有些麻烦,2,3和4,5干的事情很像,有点多余。Client访问完AS后直接得到Client/Server Session Key和TGS,然后Client拿着这些直接访问Server不香吗?就像下图这样:

总觉得Client/TGS Session Key和TGT是多余的,后来才明白Kerberos是要实现单点登录的,按上图的方案,Client访问每个服务都要输入一次用户名密码,当Kerberos管理的服务很多时这是无法接收的。另外Client/TGS Session Key是有过期时间的,即使被破解了也会因为过期而不带来太大的风险,如果一直使用用户的密码就不好说了,因为用户密码的更新时间是不确定的,如果经常用它来加密一些数据放在公网上传输,时间久了是不安全的。从上面的流程我们可以看出,Kerberos认证依赖于只有用户自己和AS知道用户的密码,如果有第三方知道了用户的密码整个认证就失效了。所以最好是一次登录,接下来的交互都使用Client/TGS Session Key和TGT。就像下图所示的一样:

总结

以上只是简要的概述了整个协议的流程,但实际的逻辑以及交互包的格式远比上面介绍的复杂,有兴趣的朋友可以去研究一下它的说明书rfc1510。

参考

https://tools.ietf.org/html/rfc1510

https://blog.csdn.net/wannuoge4766/article/details/106303372/

https://en.hackndo.com/kerberos/

http://www.nosqlnotes.com/technotes/kerberos-protocol/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • 这篇文章以由浅入深、层层深入的方式讲述基于Kerberos的Windows Network Authenticat...
    readilen阅读 3,854评论 0 2
  • 学习整理: 理解kerberos在spark/hadoop体系下的应用: 说道安全,可能是整个大数据体系中最晦涩难...
    大佛爱读书阅读 839评论 0 0
  • 前言 内网渗透大多数为域渗透。学习域渗透kerberos协议就是绕不过的一个难点,白银票据、黄金票据、攻击域控都离...
    CSeroad阅读 4,367评论 0 5
  • Kerberos的特点 Kerberos是一个Authentication协议,也就是说它的目的是判断某个clie...
    睡不醒的大橘阅读 5,796评论 0 3
  • Kerberos Kerberos是一种计算机网络认证协议,它允许某实体在非安全网络环境下通信,向另一个实体以一种...
    todd5167阅读 1,545评论 1 0