ktpass 如何以及何时设置盐?

How and when does ktpass set the salt?

用户的密码和 salt 决定了 ktpass 生成的 Kerberos 密钥。我注意到 ktpass 有时会更改用户的盐值,但有时不会。我能够通过捕获 kinit 的数据包跟踪来发现盐。 salt 似乎是基于 Kerberos 领域和 userPrincipalName 生成的。然而,事情并非如此简单。如果稍后手动更新 UPN,则不会更新 salt。 (我怀疑是否指定了/mapop选项可能起作用。)

  1. 什么情况下ktpass设置用户的salt?
  2. 盐分是怎么确定的?
  3. salt 是存储在 AD 中,还是仅存储在 KDC 中?
  4. 是否有直接读取盐的当前值的方法?
  5. 有没有办法手动更改盐?
  1. 在 Microsoft Windows Active Directory 中,自 Windows 2000 年开始使用 Kerberos v5 以来,ktpass 命令会自动设置加盐值。 Kerberos v5 中使用的盐是 always。在 Kerberos v4 中,从未使用过盐。
  2. 完整的主体名称(包括领域)用作盐,例如accountname/somedomain.com@SOMEDOMAIN.COM,然后与密码的加密哈希配对以绝对确保结果在整个 AD 林中都是独一无二的。
  3. 如前所述,盐是完整的主体名称(包括领域)。它存储在 ntds.dit 文件中,该文件是 Active Directory 数据库。 KDC 在由 kdcsvc.dll 生成的进程中启动 - 它与存储在 ntds.dit 中的值相关。因此,虽然 KDC 和 AD 数据库在运行时环境中并不相同,但可以说,它们是 "joined at the hip"。我认为当域控制器关闭时,KDC 中的所有重要元素都保留在 ntds.dit 中。 Microsoft 不提供有关如何完成此操作的确切详细信息。我看的很广,我的部分知识是通过仔细研究和从网络上找到的零碎文章中得出的推论得出的。请注意,ntds.dit 数据库也是 LDAP 数据库。如果 DNS 集成了 AD,它也是 DNS 数据库。所有这些协议一起工作,再加上一些协议,形成 "Active Directory".
  4. 打开 Active Directory 用户和计算机,转到“帐户”选项卡。 "user logon name" 是 "read" 盐最直接的方法。您看不到与它连接的领域名称,但它是隐含的。 SPN(如果也已定义)以直接的方式列出,就像您在“属性编辑器”选项卡下寻找的那样(寻找 servicePrincipalName)。确保您已选择“查看”>“高级功能”以显示此选项卡。相应的 UPN 也将在同一部分的下方列出,其方式与以下内容完全相同:accountname/somedomain.com@SOMEDOMAIN.COM.
  5. 当您在 AD 帐户选项卡上更改帐户名称时,您只是更改了盐。请注意,如果有一个与此 AD 帐户相关联的密钥表,您将刚刚使它无效,因为它内部的秘密密钥是密码哈希和盐的组合。当 salt 或密码更改时,AD 帐户和密钥表中的密钥将不再匹配。此时您将不得不重新生成它。

有道理吗?这真是一个现场解释。要了解与 AD 相关的 Kerberos 的更多信息,请从这里开始:Kerberos Survival Guide