Kerberos原理

1. 什么是 Kerberos

kerberos  是 Active Directory 网络中域帐户的首选身份验证协议(它不能在工作组中使用),它由 kerberos  SSP 实现。Kerberos 的细节在 RFC 4120 中进行了描述,在 Active Directory 中使用的扩展记录在 MS-KILE文档中。Kerberos 侧重于使用称为“票据”的令牌,它允许根据主体对用户进行身份验证。

Kerberos 也是一种基于票据的无状态认证协议。它有效分离了用户凭证与对可用资源的请求,确保密码不会在网络上传输。该协议本质上采用对称密钥认证机制,并支持可选的非对称特性(如 PKINIT)。Kerberos 密钥分发中心(KDC)负责维护用户密钥信息、票据有效期等数据,但不会记录过往交易历史。相反,Kerberos 的 TGS 依赖于有效的 TGT。其设计基于一个前提:若用户持有有效的票据授予票据(TGT),则表明其身份已通过验证

1.1. 为什么要用Kerberos

简单高效:它使用 centralize authentication ,能避免所有服务都必须知道每个用户的凭证。这在用户经常更新的情况下(无论是由于密码更改、新用户的添加,还是用户的停用或删除)极为实用。如果所有服务都必须了解所有用户的状态,这会变得十分复杂。相反,他只需要 KDC拥有现有用户的最新列表即可。

防止中间人攻击:此协议允许用户在不发送密码的情况下向服务进行身份验证。这种方式有效防止中间人攻击

2. Kerberos 相关

2.1. 传输层:

Kerberos 使用 UDP 或 TCP 作为传输协议,以明文形式发送数据;因此,Kerberos 负责提供加密

  • Kerberos 使用的端口是UDP/88和TCP/88,
  • Kerberos 密钥分发中心 (KDC) 在该端口上侦听票证请求。

2.2. 代理

几个代理一起在Kerberos中提供身份验证:

  • 希望访问服务的客户端或用户
  • AP(Application Server)它提供用户所需的服务
  • KDC  (Key Distribution Center),是Kerberos的主要服务,负责发行票据,安装在DC(域控制器)上;它由颁发 TGT 的 AS(身份验证服务)支持(Key Distribution Center),是Kerberos的主要服务

在 Kerberos 环境中,当用户想要访问一项服务时,存在三个实体: user 、 service 以及认证服务器,也称为 Key Distribution Center 或 KDC。
Pasted image 20260305115728.png
KDC是掌握所用账号凭证的实体

3. Kerberos 认证过程中的票据

3.1. TGT(Ticket Granting Ticket)

用途:TGT 是用户在登录时首先从 Kerberos 认证服务器(KDC)获取的票据。它是用户的认证凭证,允许用户向 TGS(票据授予服务)请求服务票据(ST)。
加密方式:TGT 使用 KDC 的密钥加密,KDC(即 Kerberos 认证服务器)是受信任的,并持有加密 TGT 的密钥。
生命周期:TGT 通常有一定的有效期(例如 10 小时),在此期间,用户不需要重新输入密码即可请求服务票据。

3.2. TGS(Ticket Granting Service)

用途:TGS 是 Kerberos 的一个服务,它根据用户的 TGT 向用户提供具体的服务票据(ST)。如果用户想要访问某个特定的服务(例如文件共享、Web 服务等),他会使用 TGT 向 TGS 请求 ST。
加密方式:TGS 使用特定服务的密钥加密服务票据(ST),确保只有该服务才能解密并使用这个票据进行身份验证。

Ticket Granting Service (TGS) 是密钥分发中心(KDC)的组成部分,专门负责发放服务票据。

3.3. ST(Service Ticket):

用途:ST 是用户请求访问特定服务时,TGS 返回给用户的票据。用户通过将 ST 发送给目标服务来证明其身份,服务可以解密 ST 以验证用户的身份。
加密方式:ST 使用目标服务的密钥加密。服务可以使用自己的密钥来解密 ST 并验证用户的身份。

3.4. 票据保护

每个用户都有一个密码或者密钥,他用于充当加密/解密密钥。 KDC知道所有用户的密钥,为了保护票据,会使用如下的方式来保护票据

  • KDC 发送给用户的 TGT 是使用 the secret key of the KDC 加密的,只有 KDC 知道。因此,用户无法读取或修改关于他们自己的信息。KDC 本身会保护它。
  • KDC 发送给用户的 TGS ticket 是使用 the service's secret key 加密的。同样,由于用户不知道服务密钥,他们无法修改 TGS ticket 中的信息。另一方面,当他们将此 TGS ticket 发送给服务时,服务可以解密票据内容并读取用户信息。
    Pasted image 20260305122257.png

4. Kerveros认证流程

4.1. 总体流程

Pasted image 20260305121604.png

5. 认证阶段

  • KRB_AS_REQ:用于向 KDC 请求 TGT
  • KRB_AS_REP:用于通过 KDC 交付 TGT
  • KRB_TGS_REQ:用于使用 TGT 向 KDC 请求 TGS
  • KRB_TGS_REP:用于通过 KDC 交付 TGS
  • KRB_AP_REQ:用于使用 TGS 针对服务对用户进行身份验证
  • KRB_AP_REP:(可选)服务用于向用户标识自己
  • KRB_ERROR:用于传达错误情况的消息

此外,即使它不是 Kerberos 的一部分,而是 NRPC的一部分,AP 也可以选择使用 KERB_VERIFY_PAC_REQUEST 消息向 KDC 发送 PAC 的签名,并验证它是否正确

5.1. KRB_AS_REQ:

首先,用户会发起一个 TGT(或身份卡)请求。该请求被称为 AS-REQ 。但是,为了获取 TGT,他们必须能够证明自己的身份。这个请求是发送给 KDC(在 Active Directory 环境中,它就是域控制器)的。KDC 保存着所有用户的密钥。

为证明其身份,用户还会发送一个 authenticator。这是用户将用自己的密钥加密的当前时间戳。用户名也会以明文形式发送,以便 KDC 知道它正在与谁打交道,
Pasted image 20260305122944.png

然后收到请求后,KDC将会检索用户名目录关联目录中的密钥,尝试解密此验证器,如果在数据库中发现了相同的密钥则认证成功,反之则失败

这一步,称为 pre-authentication ,并非强制性的,但所有账户都必须执行 by default ,如果管理员未开启预认证,那么客户端便不再需要发送验证器。无论发生什么,KDC 都会发送 TGT。 这种情况下很容易搜到AS-REPRoasting攻击

5.2. AS-REP

当KDC 收到了客户端请求 TGT 的请求。如果 KDC 成功解密了验证器(或者关闭了pre-authentication),它会向用户发送一个名为 AS-REP 的响应

为了保护其余的交换过程,KDC 会在回复用户之前生成一个 temporary session key 。客户端将使用此密钥进行后续交换。避免使用用户密钥对所有信息进行加密。我们之前提到过,Kerberos 是一个无状态的协议,因此 KDC 不会将此会话密钥存储在任何地方

在AS-REP中包含两个元素:

  • 用户的TGT:包含用户信息、并使用KDC的密钥进行加密保护,所以用户无法篡改,还包含generated session key
  • 还有session key ,但这次是由用户的密钥进行保护的
    Pasted image 20260305125635.png
    所以这里的有两个版本的会话密钥, 一个是用户密钥加密,一个是KDC密钥加密的

5.3. TGS-REQ

客户端现在从服务器获得了对其 TGT 请求的响应。此响应包含由 KDC 密钥保护 TGT,以及由客户端/用户密钥保护的会话密钥。然后,它可以解密此信息以提取此临时会话密钥。

然后使用 TGS-REQ 消息向KDC请求一个服务票据 ST 或 TGS ticket
这里需要传3个东西:

  • 希望访问的服务名称(采用SPN形式)
  • 之前收到的TGT,其中包含他们的信息和一个会话密码的副本
  • 一个认证器,使用此会话密钥进行加密
    Pasted image 20260305130749.png

5.4. TGS-REP

KDC收到请求后会先验证认证器是否用了正确的会话密钥进行加密,以此来判断TGS请求是否有效。
成功后,KDC会获取请求的服务,然后向用户发送一个TGS-REP的消息,这里用户与服务之间的交换会生成一个新的会话密钥(和AS过程一样)。这个会话密钥会出现在KDC发送给用户响应的两个位置:

TGS 票据保护以下内容:

  • 请求服务器的SPN
  • TGT中存在的用户信息的副本,服务用此来判断是否有权使用它
  • 会话密码的副本
    所有信息都使用用户/KDC 会话密钥进行加密。在加密响应过程中,用户信息和用户/服务会话密钥的副本也会使用服务密钥进行加密
    Pasted image 20260305131235.png

5.5. AP-REQ

然后用户可以解密此响应以提取用户/服务会话密钥和 TGS 票据

TGS 票据受服务密钥保护。用户无法修改此 TGS 票据,因此他们无法修改其权限,就像 TGT 一样

用户将此 TGS 票据发给给服务,并且与 TGS 请求一样,会向其添加一个用用户/服务会话密码加密的身份验证器
Pasted image 20260305131542.png

5.6. AP-REP

服务最终会收到 TGS 票据以及一个由 KDC 生成的、使用用户/服务会话密钥加密的验证器。这个 TGS 票据受到服务密钥的保护,因此服务可以解密它。
用户/服务会话密钥的副本嵌入在 TGS 票据中,服务也可以提取它,并使用此会话密钥检查验证器的有效性。

最终,服务可以读取有关用户的信息,包括他们所属的组,并根据其访问规则,授予或拒绝他们访问服务的权限。如果认证成功,服务会通过使用提取的会话密钥加密时间戳,向客户端返回一个 AP-REP 消息。然后,客户端可以验证该消息确实来自服务,并开始发出服务请求

6. 什么是PAC

在 Windows 环境下,Kerberos 身份验证不仅仅验证用户的身份,还涉及用户的授权信息。PAC 就是存储用户权限信息的容器,它包含了用户所属的组、访问权限等数据。

6.1. PAC 结构

PAC 作为 Kerberos 服务票据TGS)的一部分,由 KDC(Key Distribution Center) 生成并附加到服务票据(ST)中。PAC 主要包括以下内容

  • 用户的组成员信息(Group Membership)
  • 用户的权限信息(User Permissions)
  • 用户的 SID(Security Identifier)
  • 用户账户的其它信息

6.2. PAC 的生成与传递

  • 当用户首次请求访问服务时,Kerberos 认证服务器会为用户生成一个 TGT,并在后续的请求中附加 PAC
  • 用户在凭借有效的 TGT 请求 TGS 时,TGS 会将 PAC 附加到 ST(服务票据)中返回给用户。
  • 用户凭借 ST 向目标服务发起请求时,目标服务会从 ST 中提取 PAC,并解析其中的权限信息,来验证用户是否具备访问目标资源的权限。

6.3. PAC 的安全性

  • 签名:PAC 被 KDC 用其密钥进行签名,以确保其未被篡改。目标服务使用 KDC 公钥进行验证,确保 PAC 中的内容是可信的。
  • 完整性:为了防止 PAC 在传输过程中被篡改,通常会使用加密保护 PAC 的完整性

几个用于验证 PAC 和票证数据完整性的签名
服务器签名:使用用于加密票证的相同密钥创建的 PAC 内容签名
KDC 签名:使用 KDC 密钥创建的服务器签名的签名,可用于检查 PAC 是否由 KDC 创建并防止票据击
票据签名:使用 KDC 密钥创建的票据内容的签名,最近引入了此签名以防止青铜位攻击(CVE-2020-17049)

7. References: