Kerberos协议深度解析
Kerberos协议深度解析

Kerberos协议深度解析

概述

Kerberos是一种计算机网络认证协议,它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份。麻省理工实现此协议,并发布的一套免费软件。它的设计主要针对客户-服务器模型,并提供了一系列交互认证——用户和服务器都能验证对方的身份。Kerberos协议可以保护网络实体免受窃听和重放攻击。Kerberos协议基于对称密码学,并需要一个值得信赖的第三方。Kerberos协议的扩展可以为认证的某些阶段提供公钥密码学支持。

Kerberos协议中的三个主体分别是:Client/Server/KDC[密钥分发中心]
其中KDC由AS[Authentication Server]认证服务,TGS[Ticket-Granting Server]票据授予中心和AD[Account Database]账户数据库组成

Kerberos的核心思想是:提供一个安全的身份验证机制,允许在不安全的网络环境中两个通信实体能够相互验证对方的身份,并且确保它们之间的通信是加密和安全的。

Kerberos身份认证的本质是一种挑战—应答机制(Challenge-Response Protocol)

kerberos解决了如下两个问题:
1.服务端如何信任客户端有权限访问服务
2.客户端如何信任服务端服务不是恶意服务

下面开始聊kerberos的完整认证流程

前置知识

其中涉及如下几组密钥:
1.Client Hash (这是客户端用户密码通过NTML算法得到的一个hash值),Client Hash被作为密钥加密 Client 与 KDC之间的通信,也起到了认证的功能
2.Server Hash (这是服务端端用户密码通过NTML算法得到的一个hash值),Server Hash被作为密钥加密 票据(Ticket),保护Server Session Key的功能以及避免票据被滥用的功能
3.KDC Hash (这是一个只有KDC知道的密钥,本质是KDC中一个特殊用户的用户密码生成的Hash), KDC Hash被用来加密TGT (Ticket-Granting Ticket 票据授予票据) 保护在传输过程中TGT不被篡改
4.Session key(是一个通过AS_REP这一步协商得来的密钥,本质上是一个十六位的随机数),Session key用来加密 Client 与 TGS之间的通信
5.Server Session key(是一个通过TGS_REP这一步协商得来的密钥,本质上是一个十六位的随机数),Server Session key用来加密后续所有Client与Server之间的通信

KDC包括如下三个部分:

  1. 认证服务器(Authentication Server,AS)
    • 负责对用户进行初步认证。
    • 一旦用户认证成功,AS会发放 票据授权票据(Ticket-Granting Ticket,TGT)和相应的票据授权服务(Ticket-Granting Service,TGS)的会话密钥。
  2. 票据授权服务器(Ticket-Granting Server,TGS)
    • 负责发放针对特定服务的服务票据(Service Ticket,ST)。
    • 当客户端使用TGT请求特定服务的票据时,TGS会验证TGT的有效性,并发放相应的服务票据。
  3. 账户数据库(Account Database,AD):
    • 存储着用户信息包括NTML-Hash(这是一个通过用户密码生成的Hash,一个NTML-Hash对应一个用户)
    • NTML-Hash在kerberos中用来作为密钥加密通信,也把加密内容作为挑战,如果客户端能解密出内容并返回结果,则认证通过。

认证流程如下:

  1. AS_REQ(Authentication Service Request):客户端向认证服务器(AS)发送一个认证请求,希望获得对某个服务的访问权限。AS_REQ中包含:
    • 1.Client Info(用于告诉AS自己是谁)
    • 2.Client Hash加密的时间戳(用时间戳来判断是否遭受中间人攻击,如果时间间隔超过设定阈值则认定为遭受中间人攻击)
  2. AS_REP(Authentication Service Response):AS收到AS_REQ后会做如下几件事:
    • 认证服务器(AS)验证客户端的请求:通过Client Info 去账户数据库(AD)中查找对应用户的NTML-Hash(这里称作Client Hash),由于使用的是对称加密,如果Client Hash可以解密加密的内容,也就表明了发送者的密钥就是Client Hash,也就认为发送者就是Client Info所述的用户
    • AS根据解密出来的时间戳判断是否遭受攻击
    • 如果都通过,AS会发放一个包会包含如下内容:
      A.KDC Hash加密的TGT:1.Session Key(作为Client与TGS通信的密钥) 2.Client Info 3.END Time(票据有效截至时间)
      B.Client Hash 加密的 Session key
    • Q&A:
      TGT中的Session Key 与 Client Hash 加密的 Session Key是相同的,那为什么要传输两个Session Key 呢?
      A.TGT中的session key是给TGS的,TGS知道KDC Hash可以解密出Session Key,确保只有TGS可以拿到
      B.Client Hash 加密的 session key是给Client的,确保只有 Client可以拿到
      C.Client拿到Session key后会用来加密与TGS的通信,TGS因为可以解密出Session Key 和TGT中的Client Info,所以验证了Client的身份
  3. TGS_REQ(Ticket-Granting Service Request):客户端使用TGT向票据授权服务器(TGS)请求服务票据(Service Ticket, ST)。请求中包含了客户端希望访问的服务的信息。
    • Client收到 加密的TGT 和 加密的Session Key 后,只能解密出Session key(因为TGT是KDC Hash加密的)
    • 向TGS发送出:
      A.Session key加密的时间戳
      B.原封不动的TGT+SPN(一个对服务的唯一标识,告诉TGS要访问哪个服务)
  4. TGS_REP(Ticket-Granting Service Response):TGS验证TGT的有效性,如果TGT有效,TGS发放一个服务票据(ST)和一个与该服务相关的会话密钥给客户端。
    • KDC Hash解密出TGT中的Session key,client info,END Time
    • Session key去解密时间戳,并判断中间人攻击(由于TGT中拿到的Session key可以解密出时间戳,所以也验证了Client的身份)
    • 在账户数据库(AD)中查找client是否有权限访问请求的服务
    • 通过则发送出:
      A.Session key 加密的 Server Session Key
      B.Server Hash 加密的 ST[Server Ticket 服务票据]:其中包含 1. Server Session key 2.请求的服务信息SPN 3.Client Info
  5. AP_REQ(Application Request):客户端使用服务票据(ST)向目标服务发起请求,请求中包含服务票据和客户端生成的认证器(Authenticator),后者使用与服务相关的会话密钥加密。
    • Client 收到 Session key 加密的 Server Session Key后解密出Server Session Key
    • 向server发送出:
      A.用Server Session Key加密时间戳
      B.原封不动的服务票据[Server Ticket ST]
  6. Option PAC Valid Request:这步是进行权限验证,验证Client是否有权限访问指定服务,AS会验证Client info 中的用户名主机名和IP是否有权限访问SPN指定的服务
  7. Option PAC Valid Response:返回验证结果
  8. AP_REP(Application Response):服务端使用其密钥解密服务票据,验证Client info是否和向自己发出请求的客户端主机名和IP一致,并根据Option PAC Valid Response 确定client是否有权限访问,如果都通过则返回AP_REP以完成相互认证。
    • Server解密出ST,获得其中的Server Session Key,Client Info,请求的服务信息
    • Server Session Key 解密时间戳并验证是否遭受中间人攻击
    • 发出Server Session Key 加密的响应
  9. Session Establishment
    • 一旦客户端和服务器相互认证成功,它们就可以使用之前协商的Server Session Key来加密它们之间的通信

信任关系:

TGS信任链:
1.KDC Hash 解密 TGT出来的信息,包括其中的Session Key
2.Session key 解密出来的信息

Client 信任链:
1.Client Hash解密出来的信息
2.Session key 解密出的信息
3.Server Session key 解密出来的信息

Server 信任链:
1.Server Hash解密出来ST[Server Ticket]的信息,其中就有Server Session Key
2.Server Session key 解密出来的信息

Q:AS如何认证Client身份的?

A:
1.先检查Client是否在AD中,如果在就去解密时间戳,如果时间戳可以被解密出来代表对方具有正确的Client Hash
2.另外会用Client Hash加密Session key,只有Client 有正确的Client Hash才能解密出Session Key,才能完成后面的步骤
3.所以认证的方式本质就是挑战-应答机制

Q:kerberos如何解决的如下两个问题:
1.服务端如何信任客户端有权限访问服务?
2.客户端如何信任服务端服务不是恶意服务?

A:通过信任链,最开始两者都是只信任自己的NTML Hash,但是由于KDC知道所有人的NTML Hash,就可以利用这点传递一个两者都信任的密钥来加密通信

白银票据攻击

白银票据攻击前提:拥有Server Hash

在AP_REQ中发送了Server Hash加密的Ticket,其中Server Session Key又是在Ticket中的,所以是不是表明如果我们有Server Hash就可以伪造任意服务票据(ST)访问Server Hash的服务了,而且不用经过KDC

黄金票据攻击

黄金票据攻击前提:
1.拥有krbtgt Hash[krbtgt 用户的NTML Hash]也就是前面的KDC Hash,用于签发TGT的
2.能与KDC通信

在TGS_REQ中发送了krbtgt hash加密的TGT,其中Session Key又是在TGT中的,所以是不是表明如果我们有krbtgt hash就可以伪造任意Session key,利用TGS对Session key的信任,让其信任攻击者(因为TGS对client的信任来自于AS签发的Session Key)。这样只要攻击者拥有krbtgt hash就能让TGS给攻击者签发可以访问任何服务端任何访问的票据。

白银票据和黄金票据的区别:

  1. 白银票据欺骗的是Server,而且一个 Server Hash 只能访问一个Server
  2. 黄金票据欺骗的是TGS,服务票据(ST)还是由TGS签发,同时利用Server对TGS的信任访问Server。拥有krbtgt hash可以伪造任何TGT,利用TGS签发的 服务票据(ST)可以访问域内任何服务
  3. 但是黄金票据需要能够与KDC通信才能访问Server,而白银票据不需要与KDC通信也能访问对应服务

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注