ktpass如何和何时设置盐?

问题描述:

用户的密码和salt决定了由ktpass生成的Kerberos密钥。我注意到ktpass有时会改变用户的盐分,但有时候不会。通过捕获kinit的包迹,我能够发现盐。盐似乎是基于Kerberos领域和userPrincipalName生成的。但是,这并不简单。如果以后手动更新UPN,盐不会更新。 (我怀疑是否/mapop选项指定可以起到一定的作用。)ktpass如何和何时设置盐?

  1. 在什么情况下ktpass设置用户的盐?
  2. 盐是如何确定的?
  3. 盐是储存在AD中,还是存储在KDC中?
  4. 是否有直接的方法来读取盐的当前值?
  5. 有没有办法手动改变盐?

  1. 在Microsoft Windows Active Directory中,因为它在Windows 2000年成立以来已使用使用Kerberos v5,该ktpass命令自动设置盐。在Kerberos v5中使用的盐总是。在Kerberos v4中,从未使用盐。
  2. 完整的主体名称(包括领域)用作salt,例如accountname/[email protected],然后将其与密码的加密哈希配对,以绝对确保结果在整个AD森林。
  3. 如上所述,盐是完整的主要名称(包括领域)。它存储在ntds.dit文件中,该文件是Active Directory数据库。 KDC在由kdcsvc.dll产生的进程中得到启动 - 并且它与存储在ntds.dit中的值有关。因此,尽管KDC和AD数据库在运行时环境中不是一个完全相同,但它们可以说是“随时加入”的。我认为,当域控制器关闭时,KDC内的所有重要元素都会在ntds.dit内部持续存在。微软并没有提供如何完成的确切细节。我已经广泛地研究过,而且我的部分知识来源于仔细研究和推论,这些推理是从网络上发现的文章中得到的。请注意,ntds.dit数据库也是LDAP数据库。如果DNS是AD集成的,它也是DNS数据库。所有这些协议一起工作,再加上一些,形成“Active Directory”。
  4. 打开Active Directory用户和计算机,转到帐户选项卡。 “用户登录名”是“阅读”盐的最直接的方式。你没有看到领域名称与它连接在一起,但它是隐含的。如果还定义了SPN,则以直观的方式列出,如您在“属性编辑器”选项卡(查找servicePrincipalName)下查找的那样。确保您选择了“查看”>“高级功能”以公开此选项卡。相应的UPN也将在同一部分中以较低的顺序列出,形式如下:accountname/[email protected]
  5. 当您更改AD帐户选项卡上的帐户名称时,您刚刚更改了盐。请注意,如果有与此AD帐户关联的密钥表,您将刚刚使其失效,因为其中的密钥是密码哈希和salt的结合。当盐或密码更改时,密钥将不再在AD帐户和密钥表中的密钥之间匹配。此时您将不得不重新生成它。

有意义吗?这实际上是一个现场解释。要了解有关Kerberos与AD有关的更多信息,请从这里开始:Kerberos Survival Guide

+0

根据我的经验,ktpass仅在它更改_userPrincipalName_时才更改salt。如果使用'-setupn'选项运行'ktpass',例如使用已知盐(与'/ rawsalt'结合)生成keytab,则AD中的salt不会更新。如果userPrincipalName手动更新(不使用'ktpass'),那么salt并不总是被更新。我们认为这可能是一个错误。 – mlowry

+0

我们知道salt并不总是被更新,因为有几个用户的salt基于_userPrincipalName_的先前(不是当前)值。 – mlowry

+0

这是一个很好的讨论,我会回来讨论这个问题,并在今天晚些时候发表评论。必须跑掉atm ... –