ktpass 命令是否禁用密码验证

Is the ktpass command disable password authentication

我只是有一个关于 ktpass 命令的小问题。 我有一个用户 my-test-user,密码 myPassword!。我可以通过用户名和密码使用此帐户登录。 但是当我使用下面的命令生成一个keytab文件时,我就可以用这个keytab文件登录(例如kinit)。

ktpass /out test.keytab /princ HTTP/test.example.com@MY.REALM /pass * /mapuser my-test-user@MY.REALM /ptype KRB5_NT_PRINCIPAL /crypto RC4-HMAC-NT

如果我尝试连接 username/password,badPwdCount 属性 会增加。

我的问题是:ktpass 命令是否禁用密码验证?

非常感谢。

简答:没有。

/pass *选项表示提示输入密码。 /mapuser 选项表示在 AD 中查找详细信息。如果通过 /pass 传入的值与存储在 AD 中的值不匹配,则 /mapuser 调用会将 AD 中的密码设置为传入的任何值。

你 运行 Windows 是什么版本? Windows 2012 中发布的 ktpass 构建在 /pass 参数处理中存在错误,该错误将回车键转义字符附加到发送到 AD 的字符串中,因此它会错误地重置它。这在后来的操作系统中得到修复。

不,但有几个可能的因素在起作用:

一个是,如果指定 /mapuser 而未同时指定 -SetUPNktpass 将更改相关帐户的 UPN 以匹配使用 [=] 指定的任何 SPN命令中的 13=] 参数(在任何一种情况下,/mapuser 都会将请求的 SPN 注册到指定用户,但如果 -SetUPN 不存在,它只会更改该帐户的 UPN)。

这显然是为了让 Linux 客户端可以使用此密钥表成功获得票证(因为从使用 kinit 的 Linux 客户端,如果我们尝试使用以下方式获得 Kerberos 票证作为 SPN 注册到帐户的 SPN,但与任何帐户的 UPN 不匹配,kinit 将告诉我们委托人不存在)。 Windows 客户可以获得刚刚注册为 SPN 的 SPN 的票证,而无需服务帐户的 UPN 与所请求的 SPN 相匹配。

因此,如果我们尝试使用帐户的“常规”UPN(它在 运行ning ktpass 之前拥有的 UPN,例如 user@domain.com)进行身份验证,则生成未指定 -SetUPN 的密钥表,则身份验证将失败,因为该 UPN 不再有效。

另一个问题是 ktpass 似乎确实“破坏”了使用 /Pass * 参数强制提示输入密码时输入的密码。 ktpass 要么将密码设置为我们指定的密码(如果 -SetPass 未包括在内),要么它只会使用我们指定的密码创建密钥表,并相信它是正确的(但当然如果给出的密码无效,生成的 keytab 将不起作用。

根据我的测试,如果我们在命令本身中输入密码(例如 /Pass P@ssw0rd),keytab 将正常工作(假设密码正确)并且密码身份验证也应该有效,但前提是由于上述 UPN 问题,我们要么以 DOMAIN\username 格式指定用户名,要么在 ktpass 命令中包含 -SetUPN

然而,当我们尝试使用/Pass *参数来避免必须在命令行中以明文形式输入密码时,问题就来了。在这种情况下,ktpass 提示我们输入密码,但它显然会修改我们以某种方式(在幕后)输入的任何值。这将产生两种可能的结果,具体取决于我们在命令中指定的选项:

  • 生成的 keytab 文件将无效且无法工作 - 如果我们包含 -SetPass 参数(告诉 ktpass 不要更改帐户密码),就会发生这种情况,因为然后 ktpass 使用损坏的密码生成密钥表,即使帐户上的“真实”密码是我们在提示时输入的值。
  • 或者,帐户上生成的密码将被设置为一个未知值(而不是我们期望的值)——即我们输入的密码的损坏版本——如果我们不包括 -SetPass,在这种情况下 ktpass 将帐户的密码更改为它破坏我们输入的任何值。在这种情况下,keytab 将起作用,但是当我们尝试使用密码对该帐户进行身份验证时,我们将收到无效密码错误(因为帐户上的密码不是我们认为的密码 - 它不是我们输入的值在提示符处)。

我在 2008R2、2012 和 2012R2 上测试并确认了这种行为 - 我无法测试任何更新的东西。

总结-如果你需要知道账户的密码,以便在生成密钥表后可以使用任何一种方法(密码或密钥表)进行身份验证,那么你需要输入在 ktpass 命令本身中输入密码,而不是让 ktpass 提示输入密码(即使用 /Pass P@ssw0rd 而不是 /Pass *)。请确保您在安全的环境中执行此操作,这样就不可能有人偷看​​您的肩膀或静静地监视您的屏幕(幸运的是 Windows 默认情况下不会持续记录 cmd 历史记录)。

另一方面,如果您在密钥表创建后不需要知道帐户的密码,那么最好只使用 +rndPass - 这将强制 ktpass 生成帐户的随机密码和密钥表就可以正常工作。

*EDIT/UPDATE: 我在测试时发现的另一个怪癖是,如果使用已知密码创建新帐户,ktpass 是 运行 为该帐户创建一个密钥表,如上所述在命令中指定密码,但是使用 -SetPass 参数,生成的密钥表将不起作用。如果我们 运行 ktpass 并在没有 -SetPass 的情况下指定密码,让 ktpass “重置”密码(到它已经存在的相同值 - 我们在创建时设置的值帐户),生成的密钥表工作正常,密码身份验证也是如此。从那时起创建的任何后续密钥表都将起作用(即使使用 -SetPass 创建)。我没有对此行为的解释(在 Server 2012 和 2012R2 上观察到)。