运行 ktpass.exe 后,仅 30 分钟内可登录 Kerberos 服务

运行 ktpass.exe 后,仅 30 分钟内可登录 Kerberos 服务

我正在尝试对 Apache 服务器进行 Kerberize,并允许创建的服务器主体登录到 Active Directory。我按照网上提供的众多教程之一进行操作,似乎运行良好。我在项目的 Linux 端,而企业 IT 在 Windows 端。

IT 部门为我提供了一个服务帐户和服务主体。在此示例中,我将其称为 HTTP/[电子邮件保护]他们为我提供了该主体的 keytab 文件,其中涉及在 AD 服务器上运行一个名为 ktpass.exe 的工具。

我已经验证了 AD/KDC 和 keytab 文件的 KVNO 是否匹配。一切正常。

主机名有正确的 DNS A 记录,IP 有正确的 PTR 记录。两个服务器的时间同步。

我可以使用已发布的 keytab 文件从 AD/KDC 为上述服务主体请求票证,如下所示:

kinit -k -t http.keytab HTTP/[email protected]

这很有效。我获得了一张票,我能够用这张票来查询 AD/LDAP 目录等。keytab 还非常适合运行单点登录 Apache 站点,这也是本次练习的部分目标。

半小时过去了。

现在尝试使用上述 kinit 命令登录会失败并显示以下消息:

Client not found in Kerberos database

我无法以服务主体的身份进行身份验证,就像主体在 AD 服务器上被删除一样。

现在事情变得很奇怪,至少对我来说:

根据请求,AD 管理员再次运行 ktpass.exe 工具,为我的服务构建一个新的 keytab 文件。服务器上的 KVNO(密钥版本号)递增,导致我们的 Apache 测试服务器停止验证 Kerberos 单点登录。这是我目前的配置所预期的。令我们所有人都感到惊讶的是,现在 kinit 命令又可以正常工作了。我们又等了半个小时,然后它又停止工作了。

我们的 IT 部门对此感到很困惑,他们猜测这是 AD 服务器本身的问题。我认为是配置问题,但据他们说,他们的设置中没有任何半小时限制。

我已经关注http://www.grolmsnet.de/kerbtut/(参见第 7 节)但我找到的所有文档中的方法似乎都是一样的。我没有找到任何关于服务主体时间限制的参考资料。

编辑:这似乎是复制问题。虽然复制过程中没有报告任何错误,但服务帐户的 SPN 值已从“HTTP/[电子邮件保护]“ 到 ”[电子邮件保护]“30分钟后。

答案1

谢谢大家的反馈。我们得到了 Microsoft 的帮助,他们帮助我们调试 AD 端的身份验证过程。一切按预期运行,但三十分钟后失败了。

当我们正在进行远程调试会话时,其中一位参与者注意到服务帐户的 UPN/SPN 突然从HTTP/[电子邮件保护][电子邮件保护]经过大量的挖掘,包括调试 AD 复制,我们找到了罪魁祸首:

有人编写了一个定期运行的脚本(或者可能是按事件运行,因为它是在运行 ktpass.exe 后恰好三十分钟运行的),该脚本将 UPN/PSN 更新为“确保云连接”. 关于这样做的原因,我没有任何补充信息。

脚本已更改为允许以以下结尾的现有 UPN/SPN 值@mycorp.com,有效解决问题。

调试此类问题的提示:

  • 确保所有参与身份验证的人都支持相同的加密类型。避免使用 DES - 它已经过时且不安全。
  • 确保在服务帐户上启用 AES-128 和 AES-256 加密
  • 请注意,在服务帐户上启用 DES 意味着“此帐户仅使用 DES”,即使您启用了任何 AES 加密。搜索UF_USE_DES_KEY_ONLY了解详情。
  • 确保 UPN/SPN 值正确并且与颁发的 keytab 文件中的值匹配(即通过 LDAP 查找)
  • 确保 keytab 文件中的 KVNO(密钥版本号)与服务器上的匹配
  • 检查服务器和客户端之间的流量(例如使用 tcpdump 和/或 WireShark)
  • 启用 AD 端身份验证调试 - 检查日志
  • 在 AD 端启用复制调试 - 检查日志

再次感谢您的意见。

答案2

我还从 Achim Grolms 的mod_auth_kerb教程开始学习了 Kerberos,这确实是一份很好的文档。

keytab文件仅替代密码身份验证。密码在文件中编码,这些字节用于与 KDC 进行身份验证质询。服务帐户上的任何密码更改都将使 keytab 身份验证无效,并且会增加 kvno 编号。

为了确认服务帐户 SPN 是否可用,我经常使用服务帐户密码进行身份验证:

kinit HTTP/[email protected]

如果失败,为了确认服务帐户没有被禁用,请尝试基本身份验证:

kinit account

如果验证失败,只需删除该帐户并使用其他登录名创建一个新帐户,以避免麻烦。

很有可能另一个软件(例如具有为同一 SPN 生成的旧密钥表的另一个系统)尝试对此服务帐户进行身份验证,并由于密码无效而禁用该帐户。

设置 Kerberos SSO 时,操作太快可能会导致 Active Directory 不一致。在配置过程中遇到困难时,我的一般指导原则是遵循以下步骤:

  • 删除测试和生产系统的“旧”或“失败”的服务帐户
  • 检查kvno您希望配置的 SPN 是否在领域中不再存在
  • 检查setspn -X多个账户上的 SPN 是否存在冲突
  • 每个系统创建一个服务帐户,专用于单个完全合格的 SPN,并使用全新的登录名
  • 防止服务帐户的密码更改和密码过期
  • 让我们等待一段时间,以便 DC 同步
  • ktpass生成 keytab 时将密码设置为选项
  • 检查 FQDN SPN 和别名setspn -l account

以下是在 DC 上配置服务账户的一组命令:

ktpass -princ HTTP/[email protected] -mapuser [email protected]
  -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL
  -pass long!$longp2ass3word -out c:\temp\http-mysite-mycorp-com.keytab
setspn -a HTTP/mysite mysiteAccount
setspn -l mysiteAccount

如果在 MMC 和在管理命令行中运行 ktpass 生成密钥表之间对不同的 DC 执行操作太快,那么 DC 同步可能会导致您描述的意外结果。因此,让我们在创建帐户和执行ktpass任何其他setspn命令之间等待一段时间。

在 Linux 上运行命令来检查一切是否正常:

kinit [email protected]
kinit HTTP/[email protected]
kinit -k -t http-mysite-mycorp-com.keytab HTTP/[email protected]
kvno HTTP/mysite.mycorp.com
kvno HTTP/mysite

相关内容