![Active Directory 和 OpenLDAP 同步](https://linux22.com/image/563616/Active%20Directory%20%E5%92%8C%20OpenLDAP%20%E5%90%8C%E6%AD%A5.png)
我一直在 Google 上搜索,以找到在 AD 和 OpenLDAP 之间同步用户数据库的最佳方法。我想要实现的是,在 AD 中拥有用户数据库,然后将这些用户传播到 OpenLDAP,以便这些用户可以访问我的所有应用程序(电子邮件、vpn、文件服务器、打印服务器几乎所有的开源应用程序)。我想创建一个单点登录数据库,以便所有用户都可以使用相同的密码来访问基于 Windows 和 Linux 的应用程序。我还想确保密码是双向更新的。如果有人能分享他关于如何做到这一点的经验,我将不胜感激。谢谢!!
答案1
我曾经为一个项目做过一次这样的事——祝你好运!你有 AD 服务器的管理权限吗?你可能需要它。和你的 AD 管理员交朋友 :-)
您能否进一步详细说明您的项目内容?
问题是您是否只需要您的用户/应用程序根据 ActiveDirectory 或 LDAP 进行身份验证,或者您是否需要您的应用程序访问存储在 ActiveDirectory 中的数据,并可能增加或修改条目。
如果您只需要进行身份验证,那么正如 Justin 指出的那样,ActiveDirectory 服务器上的匿名或受密码保护的绑定帐户(在我看来没有太多额外的价值)就是您所需要的。请咨询您的 ActiveDirectory 管理员。
如果您想使用 ActiveDirectory 的内容作为您自己的用户记录的基础,并且可能增加或修改数据,则可能需要设置您自己的 LDAP 服务器(因为您的 IT 部门可能不会对您修改“他们的”记录的想法感到兴奋......)
ActiveDirectory 看起来与 LDAP 类似,但主要在模式上有差异。
你会遇到几个问题:
- AD 模式和属性与 LDAP 标准有很大不同
- 特别是,据我所知,AD 模式在某种程度上是预先定义和固定的,因为所有 Micro$oft 应用程序都需要特定的模式……
- AD 可能没有默认设置匿名访问,因为它是为 LDAP 设置的(这使得在命令行上执行 LDAP 查询来测试变得很困难),你可能需要让你的 AD 管理员为你设置一个
- 访问 AD 的经过身份验证的用户可能没有权限查看所有 AD 记录和/或架构
我记得我在 AD 中发现了大量不一致的记录,例如错误的组织结构,人员记录与机器、设备、软件记录混合在一起 - 呃!!并且人员记录散布在整个模式中(并非所有人员记录都只在一棵子树中,就像您在 LDAP 模式中所期望的那样)
... 要完成的 ...
如果您只需要人员或应用程序根据目录进行身份验证,那么可能不值得经历所有这些麻烦 - 最好直接通过绑定帐户使用 AD。
使用 openldap 命令行工具尝试在 UNIX 命令行上针对 ActiveDirectory 进行身份验证。这将帮助您了解该过程和返回的数据。
让我看看我以前的项目笔记,我会更新这个
我希望这可以帮助你
要通过 OpenLDAP 进行身份验证,您需要知道组织的“专有名称”(dn)、“组织单位”(ou)、身份验证人员的“通用名称”(cn)等的值。但我无法在这里给您完整的介绍……
最好阅读此处的 OpenLDAP 文档: http://www.openldap.org/doc/admin24/
最好在命令行上运行“ldapsearch”来尝试并验证您是否可以绑定/访问 LDAP。 http://www.openldap.org/software/man.cgi?query=ldapsearch&apropos=0&sektion=0&manpath=OpenLDAP+2.0-Release&format=html
或者在 IBM 网站上: http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzahy%2Frzahyunderdn.htm
答案2
一个值得研究的选项可能是使用 Active Directory 进行身份验证并使用现有的 OpenLDAP 进行授权:
http://www.openldap.org/doc/admin24/security.html#Pass-Through%20authentication
如上述文档所述,您可以将用户名/密码验证委托给 Kerberos。事实上,给出的示例(参见 14.5.2)展示了如何设置它以对 AD 域进行身份验证。您需要在 Active Directory 中设置一个可以绑定到 DC 的用户帐户,以便运行 LDAP 查询。此用户帐户不应具有访问任何 Windows 服务器的权限,也不应属于任何敏感安全组。
希望有所帮助。
答案3
必须为我的公司解决同样的问题。
以 Linux 为中心,密码必须在以下系统之间同步:
- OpenLDAP shadowAccount 用户密码(传统 PAM/LDAP 身份验证)
- OpenLDAP sambaSamAccount sambaLMPassword 和 sambaNTPassword(传统 NTLM/Samba 身份验证)
- OpenLDAP krbPrincipalAux krbPrincipalKey(实际的 PAM/MIT-Kerberos-V 身份验证)
- Microsoft Active Directory(卫星 Windows 域)
现在,您面临的主要问题是:
- 密码(理应如此!)经过加密散列;无法从 OpenLDAP 或 Microsoft Active Directory 中存储的内容中恢复原始明文密码
- 这意味着您无法从一个存储后端同步到另一个存储后端(编辑:每个后端都有自己的哈希函数,没有一个与其他后端兼容)
- 这意味着你必须在用户更改密码时同步更改所有后端的所有密码,这是你唯一可以方便地获得明文密码的时候
- 了解每个后端都有自己的应对密码更改的突发事件和复杂性
- 这意味着您确实应该让每个后端“本地”处理密码更改:让 Kerberos 创建相应的密钥(其中许多,取决于您的 Kerberos 领域支持哪些算法),让 Active Directory 以自己的方式更改密码(它不是开源的并且每当 Microsoft 认为有必要时就会不透明地更改)等等。
所以我想出了这个:https://github.com/cedric-dufour/upwdchg;简而言之:
- 不安全的用户可访问的前端(客户端),让用户要求密码更改
- 安全加工后端(服务器)- 具有适当的管理权限 - 使用自己的“本机”方法在所有后端执行密码更改
我所说的“本机”方法是指:
- shadowAccount 用户密码的 OpenLDAP 密码修改 (RFC 3062) 操作
- OpenLDAP‘smbk5pwd’覆盖 sambaSamAccount sambaLMPassword 和 sambaNTPassword(不适用于 Kerberos;‘smbk5pwd’仅支持 Heimdal Kerberos)
- MIT Kerberos V 管理服务器及其“kadmin”和“password_change”操作
- 微软记录了更改 AD“unicodePwd”的方法,如下:http://support.microsoft.com/kb/263991
答案4
我两年前做过类似的项目,当时我处于类似的境地,不知道从哪里开始,也不知道如何将各个部分结合起来。
步骤 1:弄清楚您想要完成什么并写下来。步骤 2:看看这些要求是否切合实际并且可以全部完成。如果不切合实际,您愿意牺牲哪些项目。(这是需要很长时间的地方)。步骤 3:为 LDAP 选择一个平台。就您而言,您已经有一个现有的平台。步骤 4:记录和测试。步骤 5:切换计划最为关键,因为无论您是否完成了所有想要完成的任务,都要确保顺利过渡,这都很重要。就我而言,我们必须分阶段进行。
从上面的评论来看,您似乎已经在生产中使用 Openldap。您的要求如下:
A)允许用户在 AD 上使用相同的密码策略。
b)用户帐户自动传播到 LDAP。
答案a)您可以在 LDAP 中设置 PAM 直通模块,通过 kerberos 将密码身份验证委托给 DC。这样,您就不必为在两个地方维护密码而头疼了。我在 389-DS LDAP 上这样做了,文档链接应该足够了。当用户进行身份验证时,PAM 模块会检查 LDAP 中是否存在用户帐户,如果存在,则使用 krb5.so 将密码传递给 PAM 堆栈进行身份验证。查看 389-DS 文档,它也适用于此处。
答案 b)我竭尽全力想出一种方法来使用现成的解决方案,但没有什么成功。这是因为你必须调整帐户和组的架构。所以我在同事的帮助下用 perl 编写了一个脚本,将用户和组从 AD 同步到 LDAP。代码片段如下这里。