如何使用 Kerberos 身份验证从 Linux 中的 Samba AD DC 查询用户属性?

如何使用 Kerberos 身份验证从 Linux 中的 Samba AD DC 查询用户属性?

一个回答存在用于使用密码身份验证查询 AD 的功能,该功能在本地运行良好。Kerberos 身份验证呢?使用 GSSAPI 身份验证运行 ldapsearch 会产生以下错误:

$ ldapsearch -ZZ -Y GSSAPI -H ldap://ad.server.fqdn/ -b "CN=Caleb,CN=Users,DC=samdom,DC=example,DC=com" cn
SASL/GSSAPI authentication started
ldap_sasl_interactive_bind: Local error (-2)
    additional info: SASL(-1): generic failure: GSSAPI Error: Unspecified GSS failure.  Minor code may provide more information (Server not found in Kerberos database)
$

在 Samba AD DC 上,日志文件中显示以下内容:

...
Kerberos: TGS-REQ [email protected] from ipv4:<client IP address>:48092 for ldap/<server IP>@SAMDOM.EXAMPLE.COM [canonicalize, renewable]
...

该票务请求针对的是 DC知识产权而不是服务器的 FQDN,这显然是不正确的;服务器的 FQDN 显示在 SPN 条目中,这是应该的。但我该如何纠正它?

我看到这个问题,即使是最小的krb5.conf

[libdefaults]
    default_realm = SAMDOM.EXAMPLE.COM

答案1

您将无法检索共享ad.server.fqdn别名的 Kerberos 票证 - Kerberos KDC 只知道单个 DC FQDN,并且它们不可互换(每个都有自己的 Kerberos 密钥)。因此,通常您需要一个两步过程:首先通过 DNS SRV 记录查找 DC 名称,然后告诉 ldapsearch 查询具体的顾名思义,就是 DC。

例如:

  1. dig +short -t srv _ldap._tcp.ad.example.com
  2. ldapsearch -H ldaps://dc01.ad.example.com -Y GSS-SPNEGO

(...我承认我不太记得 Active Directory 是否_ldap._tcp默认创建 SRV 记录 - 尽管我确实在这里使用 Samba 创建了它们 - 或者您是否必须查看_kerberos._udp。)

使用共享别名可能有时由于 Unix Kerberos 通过反向 DNS 执行规范化,因此可以正常工作,但这并不是可以依赖的 —— 当别名背后有多个 DC 时,libldap 可能经常连接到服务器 A,但请求服务器 B 的票证。(每当发生这种情况时,您都会收到神秘的“KRB_AP_ERR_MODIFIED”错误,在这种情况下实际上只是意味着“密钥不匹配”。)

除此之外,Windows 根本不进行基于 rDNS 的规范化,并且 Linux 发行版也已开始禁用它(尽管 libldap 强制重新启用它...),并且日志中基于 IP 的 TGS-REQ 表明您没有有效的 rDNS。

请注意,在大多数发行版中,系统范围的 Kerberos 库由 MIT Kerberos 提供,而 Samba 的工具(例如“ldbsearch”)则是针对 Heimdal Kerberos [其销售的副本] 构建的,因此两者在名称规范化方面的行为可能略有不同。

答案2

为了完整性,在此汇总解决方案。感谢 Rowland Penny 和 user1686 的帮助!

  1. 使用ldbsearch。示例调用:
ldbsearch -H dap://ad.server.fqdn/ -b "CN=Caleb,CN=Users,DC=samdom,DC=example,DC=com" cn
  1. 修复反向 DNS 查找(在我的情况下是 IPv6 rDNS)并继续使用ldapsearch。不需要 TLS 或 SASL 会抱怨:
ldapsearch -Y GSSAPI -H ldap://ad.server.fqdn/ -b "CN=Caleb,CN=Users,DC=samdom,DC=example,DC=com" cn

相关内容