kerberos(待更新)

Kerberos协议

Kerberos概述

​ Kerberos是一种由MIT(麻省理工大学)提出的一种网络身份验证协议。它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证。

img

Kerberos基本概念

  • Key Distribution Center,or KDC

    在启用Kerberos的环境中进行身份验证的受信任源。

  • Kerberos KDC Server

    作为密钥分发中心(KDC)的计算机或服务器。

  • Kerberos Client

    集群中针对KDC进行身份验证的任何计算机。

  • KDC Admin Account

    Ambari

在Kerberos协议中,主要有以下三个角色:

  • 访问服务的客户端:kerberos客户端是代表需要访问资源的用户进行操作的应用程序,例如打开文件、查询数据库或打印文档。每个Kerberos客户端在访问资源之前都会请求身份验证。
  • 提供服务的服务端:域内提供服务的服务端,服务端都有一个独唯一的SPN。
  • 提供认证服务的KDC:Key Distribution Center,密钥分发中心是一种网络服务,它向活动目录域内的用户和计算机提供会话票据和临时会话密钥,其服务账户为krbtgt。KDC作为活动目录域服务AADS的一部分运行在每个域控制器上。
  • 这里说一下krbtgt账户,该用户是在创建活动目录时系统自动创建的一个账号,其作用是KDC密钥分发中心的服务账号,其密码是系统随机生成的,无法正常登陆主机。

Kerberos是一种基于票据Ticket的认证方式。客户端想要访问服务端的某个服务,首先需要购买服务端认可的ST服务票据(Server Ticket)。也就是说,客户端在访问服务之前需要先买好票,等待服务验票之后才能访问。但是这张票并不能直接购买,需要一张TGT认购权证(Ticket Granting Ticket)。也就是说,客户端在买票之前必须先获得一张TGT认购权证。TGT认购权证ST服务票据均是由KDC发放;因为KDC是运行在域控制器上,所以说TGT认购权证和ST服务票据均是由域控分发。

Kerberos使用TCP/UDP 88端口进行认证,使用TCP/UDP 464端口进行密码重置。

Kerberos中一些名词的简称及含义如表所示:

简称 英文全程 中文名称
DC Domain Controller 域控制器
krbtgt KDC密钥分发中心服务账户
KDC Key Distribution Center 密钥分发中心,由域控担任
AD Active Directory 活动目录,里面包含域内用户数据库
AS Authentication Service 认证服务
TGS Ticket Granting Service 票据授予服务
TGT Ticket Granting Ticket TGT认购权证,由KDC的AS认证服务发放
ST Service Ticket ST服务票据,由KDC的TGS票据授予服务发放

​ Kerberos协议有两个基础认证模块:AS_REQ & AS_REPTGS_REQ & TGS_REP,以及微软扩展的两个认证模块S4UPAC。S4U是微软为了实现委派而扩展的模块,分为S4U2Self和S4U2Proxy。在Kerberos最初设计的流程里只有说明了如何证明客户端的真实身份,但是并没有说明客户端是否有权限访问该服务,因为在域中不同权限的用户能够访问的资源是不同的。因此微软为了解决权限这个问题,引入了PAC(Privilege Attribute Certificate,特权属性证书)的概念。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sequenceDiagram
participant c as 客户端
participant s as 服务器
participant sms as SMS服务器
participant yys as 三大运营商
participant jz as 基站
Title: 基础网络身份验证,Cookie,JWT
c->>s: SMS Request
note over s:生成验证码并保存到服务器
s->>sms: SMS Request
sms-->>yys: SMS Request
yys-->>jz: SMS Code
jz-->>用户手机: SMS Code
note over 用户手机:用户接收验证码
sms->>s:SMS Response
s->>c:SMS Response
c->>s:Login Requst
s->>c:Response

认证过程:

  1. AS_REQ:Client向KDC发起AS_REQ,请求凭据是Client Hash加密的时间戳
  2. AS_RESP:KDC使用Client Hash进行解密,如果结果正确就返回用krbtgt hash加密的TGT票据,TGT里面包含PAC,PAC包含Client的sid、Client所在的组
  3. TGS_REQ:Client凭借TGT票据向KDC发起针对特定服务的TGS_REQ请求
  4. TGS_RESP:KDC使用krbtgt hash进行解密,如果结果正确,就返回用服务hash加密的ST票据(这一步不管用户有没有访问服务的权限,只要TGT正确就返回ST票据)
  5. AP_REQ:Client拿着ST票据去请求服务
  6. AP_RESP:服务使用自己的hash解密ST票据。如果解密正确,就拿着PAC去KDC那边问Client有没有访问权限,域控解密PAC。获取Client的sid,以及所在的组,再根据该服务的ACL,判断Client是否有访问服务的权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sequenceDiagram
Title: Kerberos
participant C as Client
participant AS as Authenticaton Service
participant TGS as Ticket Granting Service
participant SS as Server Service
C->>AS: AS_REQ
Note left of C:ClientHash加密的时间戳
AS->>C:AS_RESP
alt 账密正确
AS-->>C:krbtgt Hash加密的TGT
end
C->>TGS: TGS_REQ
note left of C: Krbtgt hashi加密的TGT
TGS->>C: TGS_RESP
alt 解密正确
TGS-->>C:用服务Hash加密的ST
end
C->>SS: AP_REQ
note left of C:用服务Hash加密的ST
SS->>C: AP_RESP

image-20231209020706062