Kerberos 新用户凭据流程

Kerberos new user credential flow

我了解 Kerberos 的原理是允许在不安全的网络上的用户和服务之间进行身份验证。身份验证和票证授予服务生成的票证支持安全通信,不需要密码即可通过网络传输。

该流程依赖于 KDC (s) 中的身份验证服务器与客户端 (c) 共享密钥。

然而,在某些时候,用户本身必须已经创建,并且通常,用户是从客户端计算机创建的(您通常不会登录到域控制器来创建用户)

如果 password/secret 从未通过网络发送,那么首先如何创建用户和密钥 (Kac) 并将其存储在 KDC 数据库中?

KDC 数据库中主体的管理 超出了正常 Kerberos 协议的范围。通常它是使用一些辅助协议完成的,每个KDC可以以任何它想要的方式实现它。

例如,MIT Kerberos 有(基于 SunRPC)kadmin 协议,kadmin 客户端确实将实际管理员指定的密码发送到 kadmind 服务运行 在 KDC 上。 (当然,RPC 消息是使用 Kerberos 会话密钥加密的。)Heimdal 有自己的 kadmin 协议,大部分与 MIT 不兼容,但工作方式相同。

(两者都有“本地”版本的 kadmin 工具,它直接访问 KDC 数据库后端——这就是初始管理员帐户的创建方式,通常由 运行 kadmin.local 在服务器控制台或通过 SSH。)

Microsoft Active Directory 有几个 用户管理协议,其中一些可以追溯到 AD 之前的时代,但主要机制是 LDAP(通常通过 GSSAPI/Kerberos-encrypted 会话,但偶尔会进行 TLS 加密)。

要在 MS AD 中创建一个新帐户,管理员会创建一个具有纯文本 'userPassword' 属性的 LDAP 'User' 或 'Computer' 条目,并且域控制器会自动转换它属性转换为 Kerberos 密钥(而不是将其原始存储)。常用的“AD 用户和计算机”小程序 (dsa.msc) 实际上是 LDAP 目录的接口。

上述所有实现还支持第二个管理协议,即 kpasswd 协议,其唯一目的是允许现有用户更改其密码。如您所料,它还可以通过网络传输用户的新密码来工作,再次使用 Kerberos 身份验证和加密。 (也可以通过 AD 的 LDAP 或 MIT/Heimdal 的 kadmin 更改密码,但 kpasswd 的优点是三者都支持。)


作为最后的旁注,PKINIT 扩展使用 X.509 证书来验证 AS-REQ——在这种情况下,客户端不知道他们自己的共享秘密,因此 KDC 实际上发送了整个 Kc 通过网络发送给客户端(使用通过 DH 协商的会话密钥加密,有点像 TLS)。这主要用于具有“智能卡”身份验证的 Active Directory 环境。