ggxxblog

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  1 随笔 :: 0 文章 :: 0 评论 :: 104 阅读

kerberos(票据认证)

参考链接:详解kerberos认证原理 | Hero

参考链接:详细讲解kerberos认证全过程、黄金、白银票据 - FreeBuf网络安全行业门户

Kerberos 中有以下一些概念需要了解:

kerberos认证有三个角色:客户端(client),服务端(server),DC(域控),DC中有一个密钥分发中心的组件即KDC,它负责处理用户身份验证和授权请求。KDC包含两个主要子组件:认证服务(AS)和票证授予服务(TGS)。

KDC(Key Distribute Center):密钥分发中心,负责存储用户信息,管理发放票据。

第一步:客户端向域控制器(DC)的认证服务(AS)请求

想象一下,您去银行办理业务时需要先通过保安验证身份。在这个场景中,您的电脑就像一个想要进入银行大厅的人,而域控制器(DC)就像是银行的大堂经理,它管理着所有人的访问权限。

  • 客户端发送请求:当您想要使用网络上的某个服务时,您的电脑会向DC发送一个请求,这个请求包含了一些信息,比如您的用户名(principal),以及您想访问的服务名称和主机名。为了证明自己确实是您本人,而不是别人冒充的,您还需要提供一个特殊的“暗号”——加密的时间戳。这个时间戳是用只有您和DC知道的秘密(用户的hash)加密的。
  • 为什么加密时间戳?:这么做是为了确保没人能假冒您。如果不用秘密加密,任何人都可以假装成您。但是有了加密,只有知道秘密的人才能正确地创建或读取这个时间戳,这就大大增加了伪造难度。DC作为管理员,保存了所有用户(包括您)的秘密,所以它可以解密并验证这个时间戳。
  • 时间戳的作用:时间戳是用来防止“重播攻击”的。简单来说,就是防止有人记录下您的请求,然后在之后再次发送相同的请求来欺骗系统。通过检查时间戳是否在合理的时间范围内(例如5分钟内),DC可以判断这个请求是不是最新的、安全的。

第二步:DC的AS回复客户端

  • DC验证并响应:收到请求后,DC会用自己的记录找到您的秘密,并尝试解密您提供的加密时间戳。如果成功解密并且时间戳在合理范围内,说明这个请求是合法且新的。此时,DC会为这次会话生成一个临时的密钥(login session key),并把这个密钥连同一个叫做TGT(Ticket Granting Ticket)的东西一起发回给您。TGT就像是进入不同房间的通行证,它被另一个特殊账户krbtgt的密钥加密,以确保它的安全性。
  • 什么是TGT?:TGT是一张特殊的票证,由DC颁发给用户,允许用户在一定时间内直接向其他服务申请访问权限,而不需要每次都重新向DC请求。
  • 什么是krbtgt?:krbtgt是一个特殊的账户,专门用来管理和保护这些票证。它的密钥非常敏感,因为它用于加密TGT。如果有人获得了这个密钥,他们就可以伪造TGT,这被称为“黄金票据”。
  • 为什么TGT要用krbtgt的密钥加密?:这是因为即使攻击者不知道您的个人秘密,如果没有krbtgt的密钥,他们也无法伪造有效的TGT。这样可以保证TGT的安全性。

第三步:客户端向DC的票据授予服务(TGS)请求

  • 客户端使用TGT:拿到TGT后,您可以将其存储起来,并在接下来的一段时间内重复使用它来请求不同的服务。当您想要访问某项具体的服务时,您会把TGT连同一些新信息(如您想访问的服务名)一起发送给DC的TGS部分。
  • 为什么客户端要发送TGT回去?:这是因为TGS需要验证您确实已经得到了合法的TGT,才会考虑给您发放访问特定服务的许可。
  • 为什么客户端要存储TGT?:因为TGT有有效期,只要没过期,您可以直接用它来快速获取其他服务的访问权限,而不必每次都重新找DC要TGT,这样可以节省时间和资源。

第四步:DC的TGS回复客户端

  • TGS验证并响应:TGS接收到您的请求后,会用krbtgt的密钥解开TGT,取出其中的信息进行验证。如果一切正常,TGS会为这次与目标服务的通信创建一个新的密钥(service session key),并用之前从TGT中提取出的login session key加密这个新密钥,然后将加密后的密钥和一个针对该服务的ST(Service Ticket)一起发回给您。
  • 为什么service session key要用login session key加密?:这是因为只有您拥有login session key,这样才能确保只有您能解密并使用这个新密钥。
  • 为什么要生成service session key?:这个新密钥是为了让您可以安全地与目标服务通信,类似于login session key的作用。
  • 为什么service session key要用服务端的密钥加密?:这是因为最终您和服务之间通信时需要使用这个密钥,但服务端没有login session key,所以需要用服务端自己的密钥来加密service session key,以确保只有指定的服务能够解密并使用它。

第五步:客户端向服务端请求

  • 客户端发送ST和服务信息:现在您已经有了ST,可以把它连同一些额外的信息(如加密的时间戳)一起发送给服务端,要求开始工作。

第六步:服务端验证客户端的身份

  • 服务端验证ST:服务端收到您的请求后,会用自己的密钥解密ST中的service session key,再用这个密钥解密您发送过来的信息,检查时间戳是否有效,从而确认您的身份。
  • PAC验证:此外,服务端还会通过KDC验证PAC(Privilege Attribute Certificate),以确保您确实有权访问这项服务。PAC包含了您的授权信息和其他属性,服务端会将这些信息与KDC存储的数据对比,以验证其真实性。

第七步:DC的KDC验证PAC并向服务端响应

  • KDC验证PAC:KDC会检查PAC中的签名是否正确、是否过期等,然后比对PAC中的信息与自身记录的一致性。如果一致,KDC会告诉服务端,这个PAC是有效的。
  • 什么是PAC?
    PAC是一个包含了客户端属性信息的数据结构,它包括了客户端的授权信息、组成员资格和其他相关属性。服务端在收到客户端的票据后,会从票据中提取出PAC,并将其发送给KDC进行验证。
    验证过程是什么?
    1.服务端从客户端的票据中提取出PAC。
    2.服务端将PAC发送给KDC,请求对客户端的属性信息进行验证。
    3.KDC收到PAC后,会验证其中的属性信息是否与KDC中存储的客户端属性信息一致。
    4.如果属性信息一致,KDC将返回一个验证成功的响应给服务端。
    5.服务端根据KDC的响应,判断客户端的属性信息是否有效,并根据需要进行授权或其他操作。

第八步:服务端向客户端响应

  • 服务端发送服务票据:最后,服务端会用之前获得的service session key加密一份票据,这份票据包含了双方的身份信息,并发送给您。您可以用service session key解密这份票据,然后正式开始使用服务

通俗解释

  1. 客户端请求TGT(Ticket Granting Ticket)

    想象一下,您想要进入一个大型商场的不同店铺购物。首先,您需要到入口处(AS, Authentication Service)获得一张通用入场券(TGT),这张票可以让您在接下来的一段时间内直接去各个店铺而不需要每次都重新排队验证身份。

客户端发送请求:您的电脑向域控制器(DC)上的AS发送请求,提供用户名和其他必要信息。
AS生成响应:AS验证您的身份后,为这次会话生成一个临时密钥(login session key),并创建TGT。TGT是用krbtgt账户的密钥加密的,以保证其安全性。
AS发送响应:AS将加密后的login session key和TGT一起发回给客户端。客户端保存这两个信息,准备后续使用。

  1. 客户端存储TGT并准备访问服务

    有了TGT之后,您可以在这个有效期内随时访问其他服务,而不必每次都回到AS重新获取新的TGT。这不仅提高了效率,也减少了重复认证的需求。(也就相当于不用重新到商场的入口去验证身份了)

  2. 客户端向TGS(Ticket Granting Service)请求服务票据(Service Ticket, ST)

    当您决定访问某个特定的服务时,比如某家店铺,您会拿着TGT去找商场内的服务中心(TGS)。服务中心会检查您的TGT,并根据需要发放一张专门用于这家店铺的入场券(ST)。

客户端发送请求:客户端将TGT连同欲访问的服务名等信息发送给TGS。
TGS验证TGT:TGS使用krbtgt的密钥解密TGT,验证其有效性,并确认客户端的身份。
TGS生成ST:如果一切正常,TGS会为客户端和服务之间的通信生成一个新的临时密钥(service session key),并创建ST。ST包含了客户端的身份信息和服务端的密钥加密过的service session key。
TGS发送响应:TGS将service session key用之前从TGT中提取出的login session key加密,并与ST一同打包发送回客户端。

  1. 客户端与服务端通信

    拿到ST后,您可以直接去找那家店铺(服务端),出示ST并开始享受服务。

客户端发送ST:客户端用service session key加密时间戳和其他相关信息,连同ST一起发送给服务端。
服务端验证ST:服务端用自己的密钥解密ST中的service session key,再用这个密钥解密客户端发送过来的信息,验证时间戳是否有效,从而确认客户端的身份。

  1. PAC验证(Privilege Attribute Certificate)

    为了进一步确保安全性,服务端还会通过KDC(Key Distribution Center)验证PAC,这是一个包含客户端属性信息的数据结构,如组成员资格等。这样可以确保客户端确实有权访问这项服务。

黄金票据和白银票据
黄金票据(Golden Ticket):是由krbtgt账户的密钥加密的TGT。因为krbtgt账户是系统级别的,且它的密钥非常敏感,所以一旦攻击者获得了krbtgt的密钥,他们就可以伪造TGT,即所谓的“黄金票据”。拥有黄金票据意味着可以在一段时间内冒充任何用户获取几乎所有的服务访问权限。
白银票据(Silver Ticket):是指由具体服务端的密钥加密的ST。如果攻击者获得了某个服务端的密钥,他们可以伪造针对该服务的ST,这就是“白银票据”。虽然白银票据的影响范围比黄金票据小,但它仍然允许攻击者非法访问特定的服务。

posted on   赟希  阅读(104)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示