【问题标题】:Kerberos new user credential flowKerberos 新用户凭证流
【发布时间】:2025-12-29 12:45:12
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: active-directory kerberos domaincontroller


    【解决方案1】:

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

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

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

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

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

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


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

    【讨论】:

    • 因此,如果我在 MS AD 的情况下正确理解这一点,则要创建的第一个帐户是安装 AD 时本地发生的管理员。这不会在网络上传输密码,因为安装是本地的。这会在 KDC 数据库中为管理员创建一个带有密钥的条目。如果需要创建更多用户,也许从管理员工作站使用用户管理工具将首先在客户端/服务器之间创建一个会话,管理员将首次在工作站上输入密码。所以它会生成一个与 KDC 匹配的秘密。
    • 是的,但是新用户的 Kerberos 密码是由 KDC 自己根据收到的原始密码生成的,而不是管理员的客户端(不一定知道支持的密钥类型或其他策略)。
    • “所以它生成一个应该与 KDC 匹配的秘密” 是的,所以 KDC 生成密钥并存储它。当远程客户端尝试进行身份验证时,KDC 会使用来自 AUTH 服务器的带有 TGS 详细信息的票证进行响应。这是用共享秘密加密的。客户端需要解密才能读取此信息,因此将使用用户输入的密码来“生成”秘密。如果密码相同,则生成相同的secret,即可解密消息。
    最近更新 更多