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
而未同时指定 -SetUPN
,ktpass
将更改相关帐户的 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 上观察到)。
我只是有一个关于 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
而未同时指定 -SetUPN
,ktpass
将更改相关帐户的 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 上观察到)。