【问题标题】:How to translate a domain name to LDAP DC when working in a Active Directory forest in Java?在 Java 中的 Active Directory 林中工作时,如何将域名转换为 LDAP DC?
【发布时间】:2011-06-29 06:39:39
【问题描述】:

我正在努力解决无法找到精简通用解决方案的问题。这是我的情况:

我在一个巨大的 AD 森林中,有超过 20 个子域在数百个服务器上进行复制。假设主域和 Kerberos 领域是 COMPANY.COM,我在 D1.COMPANY.COM 工作。 我确实从 Java 连接到全局目录,并且能够访问整个 forrest 以支持所有公司用户。

我的连接网址是这样的:ldap://mycompany.com:3268/DC=company,DC=com

整个东西都在一个 webapp 中运行,使用 SPNEGO 对用户进行身份验证,效果非常好。即,成功登录后,我确实收到了用户 UPN/Kerberos 主体。由于某些原因,林中的所有 UPN 字段都已更改为匹配用户的电子邮件地址,而不是保持 UPN 值不变。这意味着我无法通过 krb princ 进行搜索,但我必须删除用户名并通过 sAMAccountName 进行搜索。 我认为sAMAccountName 在整个森林中是唯一的,直到用户昨天登录失败。经过一些 LDAP 查询魔术后,我发现两个用户在两个不同的域中具有相同的 sAMAccountName。我的搜索失败了。

所以问题是,我如何确定基于 Kerberos 领域的领域/子域的基本 DN/DC?

我想出了几种使用剥离领域字符串的方法:

  1. 构造一个 LDAP URL 并连接到并读取 defaultNamingContext
  2. 将域名重新格式化为 DC=d1,DC...

目前,我正在使用方法 2,这似乎是最简单的方法。尽管这里有一些关于堆栈溢出的 C# 帖子说这可能由于不相交的空格而失败。

有人知道安全的解决方案吗?最好的办法实际上是将 Kerberos 主体转换为用户主体名称。

【问题讨论】:

  • samAccountName 在整个森林中是唯一的。否则你的服务器有一些严重的问题。可能这两台服务器上的 GC 不同步?
  • @kalyan 实际上不是。它必须根据this 文章。看来管理人员真的很马虎。我仔细检查了 ti,他们的帐户创建脚本仅针对域进行验证。这是皮塔饼。多年前创建且上次更改时间已过时的帐户。

标签: java active-directory ldap kerberos


【解决方案1】:

登录后,您会收到 UPN,这是一封电子邮件。它的用户名部分可以使用,因为它不是唯一的。域部分不能使用,因为它需要与命名上下文相同。您可能有 dc=mydomain,dc=com,但电子邮件的域可以是 myemaildomain.com。我也可以将其添加为额外的 UPN,我想这就是您的情况。

不要采取第二种方法。拿第一个。 做一个 dns srv 查找 _ldap._tcp.domain.com 阅读 DnsQueryConfig 获取配置的域名 获取服务器名称。 执行 rootDse 搜索请求命名上下文。 并构造 ldapurls

进一步.., 看起来您域中的 emailid 在整个森林中是唯一的 (?) 如果是这样,您可能可以将电子邮件 ID 标记为 PAS 属性,以便每个 GC 都有它的副本,并在 GC 端口上进行 ldap 搜索以查找 emailid。但这是一个非常糟糕的选择,因为这需要对超过 20 个子域的架构进行更改。

【讨论】:

  • 感谢您的回复。我花了一些时间进行调查。我导出了所有 sAMAcountNames 和 userPrincipalNames 并在前一个中导出了 > ​​5000 次重复,在后者中导出了 3000 次。大多数 UPN 是重复的 UPN 服务不正确。电子邮件 ID (UPN) 不是唯一的 :-( 更重要的是,我无法控制森林。您的猜测绝对正确,这令人头疼。
  • 我也倾向于第一个,但我不完全明白我必须做什么。第一步,我会做this,但我该怎么做第二个?
  • 绑定到动态映射到具体复制者的 kerberos 领域然后检索 defaultNamingContent 不是省事吗?这种方法可以避免 DNS 查找。
  • 我不知道如何绑定 kerberos 领域并检索 defaultNamingContext。如果你在谈论一些现有的 API,那我就迷路了。
  • 不幸的是,两者都不是独一无二的。我将在此处提交有关工作脚本的票证。我严重怀疑管理员是否会修复已创建的帐户,除非可以轻松重命名帐户(如果有的话)。恕我直言,唯一独特的方法是使用 sAMAccountName 在一个域中唯一的保证,因此我将从 KRB 主体中提取 Kerberos 领域,并将进行 DNS 查找或绑定,检索默认命名上下文,然后我将执行我的实际搜索以 ne 为基础的 dn。
【解决方案2】:

Kaylan,oVirt 项目 (www.ovirt.org) 包含 Spring-Ldap 代码,该代码向您展示如何使用 Kerberos 针对 Active-Directory、RHDS、ipa 和 Tivoli-DS 进行身份验证。我们仍然需要继续并实现森林功能(刚刚问了一个关于 Java 中 CLdap 实现的问题)。为了获得 defaultNamingContext,您必须向所需域发出 RootDSE 查询(我们在 oVirt 中也有一些代码)。 您可以通过执行 git clone 下载源代码,也可以使用http://gerrit.ovirt.org 浏览它们

请看engine\backend\manager\modules\bll\src\main\java\org\ovirt\engine\core\bll\adbroker下的代码

你会在那里看到你需要的一切。

【讨论】:

  • 我已经检查了源压缩包。这个包中有太多代码需要阅读。你能把范围缩小到任何特定的类吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
相关资源
最近更新 更多