我正在尝试对 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