KDC处理密钥的5种方式 — Kerberos安全的核心

“两人知道的秘密,就不是秘密。”

— 但如果数千名用户需要相互信任呢?

KDC让这种不可能变为可能。

<

>>

本文涵盖内容

  • 什么是KDC(密钥分发中心)以及为什么需要它
  • 构成KDC的两个核心模块:ASTGS的作用
  • KDC管理的三种密钥(主密钥、会话密钥、票据)的区别
  • 5步完全掌握基于票据的密钥分发流程
  • 实践中常见的KDC陷阱和安全原则

引言 — 我们为什么需要KDC?

假设一家公司有1,000名员工。所有员工要安全地相互通信,需要多少个秘密密钥?答案大约是499,500个(n×(n-1)/2)。如何发放、更新和废弃这些密钥?想想就令人叹息。

解决这个问题的最优雅方案就是KDC(密钥分发中心)。KDC充当“所有人都信任的中央秘密存储库”,即使在两个实体首次相遇时,也能为它们建立安全的通信通道。这正是我们常听说的Kerberos认证系统的核心,是Active Directory内部运行的机制,也是云和大数据平台(Hadoop、Spark等)认证的标准。


什么是KDC — 信任的中心

KDC顾名思义,是“分发密钥的中央服务器”。所有用户和服务都会在KDC预先注册自己的秘密密钥(主密钥),每当需要与其他人通信时,就向KDC请求:“请让我能安全地与他/她交谈。”

KDC由两个主要服务组成:

组成部分 英文 作用
认证服务器 AS (Authentication Server) 验证用户身份并颁发第一个票据(TGT)
票据授予服务器 TGS (Ticket Granting Server) 颁发用于实际服务访问的服务票据

将认证和票据颁发分离的原因很简单:为了尽可能少地使用用户的密码(主密钥)。其理念是密码每天只使用一次,之后用临时身份证明(TGT)代替。


️ KDC处理的三种密钥

要理解KDC的密钥管理,必须明确区分密钥的种类。

1. 主密钥 (Master Key / Long-term Key)

这是用户或服务在KDC注册时创建的永久秘密密钥。通常由用户密码的哈希值生成。

  • 寿命: 在密码更改前有效(数月至数年)
  • 存储位置: KDC的数据库 + 用户本人记忆中
  • 重要原则: 绝不通过网络传输。主密钥仅用于“加密其他密钥”。

2. 会话密钥 (Session Key)

这是两个实体在短时间内通信时使用的一次性对称密钥。KDC会即时生成新的。

  • 寿命: 通常8-10小时(可根据策略调整)
  • 特点: 每次都重新生成,因此即使一次泄露,影响也有限
  • 优点: 无需直接暴露主密钥,即可让两个实体安全通信

3. 票据 (Ticket)

这是KDC颁发的加密通行证。其中包含会话密钥、用户信息和有效期。

  • TGT (Ticket Granting Ticket): 提交给TGS的票据。由AS颁发。
  • Service Ticket: 提交给实际服务服务器的票据。由TGS颁发。

打个比方,TGT是“游乐园门票”,Service Ticket是“各游乐设施的乘车券”。只要拿到一张门票,当天就可以无需重复认证地享受各种游乐设施。


KDC的密钥分发流程 — 5步完全掌握

现在是真正有趣的部分。当用户访问某个服务时,KDC之间会发生什么?让我们跟着下面的图表来看。(图表在正文下方。)

[第1步] 用户 → AS:认证请求 用户(Alice)将自己的ID以明文形式发送给AS。她发送密码。从这一刻起,KDC的精妙设计开始闪耀。

[第2步] AS → 用户:TGT + 会话密钥 AS创建两样东西作为响应:

  • TGT:用TGS的主密钥加密,只有TGS能解密。
  • 会话密钥(Alice ↔ TGS用):用Alice的主密钥加密并附带。

Alice用自己的密码生成主密钥并解密响应。如果解密成功,则认证成功。此时,密码从未在网络上流传过一次。

[第3步] 用户 → TGS:服务票据请求 现在Alice将TGT和“她想访问哪个服务”发送给TGS。由于只有TGS能解密TGT,因此无法篡改。

[第4步] TGS → 用户:Service Ticket + 新会话密钥 TGS再次创建两样东西:

  • Service Ticket:用该服务服务器的主密钥加密。
  • 新会话密钥(Alice ↔ 服务用):用现有会话密钥加密。

[第5步] 用户 → 服务服务器:访问 Alice向服务服务器出示Service Ticket。服务服务器用自己的主密钥解密票据,获取Alice的会话密钥,现在两人可以安全通信了。

核心内容可以一句话概括:

“KDC利用自己的主密钥,安全地为两个从未谋面的实体植入共同的会话密钥。”


️ KDC密钥管理的安全原则

KDC能存活30多年是有原因的。这得益于以下原则:

  • 主密钥不传输原则:主密钥绝不会在KDC和客户端之间传输。它仅用于加密其他密钥。
  • 会话密钥的短期性:会话密钥寿命短,到期后自动废弃。这最大限度地减少了密钥泄露的影响范围。
  • 基于时间戳的重放攻击防御:所有消息都包含时间戳(Authenticator),以防止有人截获并重发数据包。
  • 票据的自给自足性:服务服务器无需每次都询问KDC,仅凭自己的主密钥即可验证票据。这分散了KDC的负载。
  • 基于对称密钥的效率:使用AES-256等对称密钥算法,可以实现快速加密/解密。

⚠️ 注意事项 — 运营KDC时容易陷入的陷阱

在实际运营KDC(特别是Kerberos/AD环境)时,必然会遇到以下问题:

  • 单点故障(SPOF)陷阱:KDC宕机将导致整个认证系统瘫痪。必须配置主KDC + 从KDC进行冗余。
  • 时钟同步(Clock Skew)问题:由于时间戳验证,如果客户端和KDC的时间误差超过5分钟(默认值),认证将失败。NTP服务器同步是必需的。
  • 离线字典攻击的可能性:弱密码的主密钥可能通过截获的响应进行离线猜测。需要强大的密码策略 + 启用预认证
  • Kerberoasting攻击:针对服务账户弱密码的攻击在实际中非常常见。建议服务账户使用30位以上的随机密码gMSA(组管理服务账户)
  • 票据生命周期管理:TGT寿命设置过长会增加被盗时的风险。通常建议限制在10小时以内

✅ 总结 — KDC,最终需要记住什么

KDC的密钥管理最终可以总结为三句话:“隐藏主密钥,频繁更换会话密钥,通过票据进行委托。” 这是一种精妙的设计,它在用户密码从未在网络上暴露的情况下,让两个从未谋面的实体能够立即开始安全通信。

下一步学习,推荐以下主题:

  • 通读Kerberos 5 RFC 4120 — 其中包含了协议的所有细节。
  • 分析Active Directory中的KDC实现 — 这是实践环境中最常见的。
  • PKINIT扩展 — 使用证书而非密码进行AS认证的方式。
  • 云环境中的Kerberos — AWS Managed AD、Azure AD DS的工作方式。

下次,一个很好的延续主题将是“Kerberoasting和黄金票据攻击 — 针对KDC的实际攻击场景。”


Comments

发表回复

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