通过 OpenLDAP 元后端结合 OpenLDAP 和 Active Directory

通过 OpenLDAP 元后端结合 OpenLDAP 和 Active Directory

我们有一个应用程序,以前通过 Atlassian Crowd 实例进行身份验证,但在进行重大重写后,该身份验证源不再可用。现在我需要一个解决方案来从我们的 Active Directory 和 OpenLDAP 服务器(以前由 Crowd 处理)对用户进行身份验证。

最有希望的选项似乎是 OpenLDAP 元后端,我现在有一个配置,我可以使用 找到来自两个目录的用户ldapsearch,但身份验证仅适用于 AD 用户。我找到了一个有几个这样的问题,它们非常有帮助,但最终对我来说没用。

           Application
         OpenLDAP (meta)
             │   │
             │   │
 OpenLDAP ◄──┘   └─►  Active Directory

这是我当前的配置:

moduleload back_meta.la
moduleload back_ldap.la
moduleload rwm

include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/msuser.schema

database meta

suffix "dc=openldap,dc=Example,dc=com"
uri "ldap://openldap.example.com/dc=openldap,dc=Example,dc=com"
map objectclass user inetOrgPerson
map attribute sAMAccountName uid
#map attribute unicodePwd userPassword
map attribute objectGUID entryUUID
map objectclass group groupOfUniqueNames
map attribute member uniqueMember
protocol-version 3
#rebind-as-user yes
idassert-authzFrom "dn.regex:.*"

suffix "DC=ad,DC=Example,DC=com"
uri "ldap://dc01.ad.example.com/DC=ad,DC=Example,DC=com"
rebind-as-user yes
chase-referrals no
readonly yes
protocol-version 3
idassert-bind
  bindmethod=simple
  binddn="CN=username,OU=Service-Accounts,DC=ad,DC=Example,DC=com"
  credentials="PASSWORD"
  flags=override
  mode=none
norefs yes
sizelimit 999
idassert-authzFrom "dn.regex:.*"

suffix "dc=Example,dc=com"
rootdn "cn=admin,dc=Example,dc=com"
rootpw PASSWORD

看来剩下的唯一问题就是密码字段。根据 MS 文档,unicodePwduserPassword都存在于 AD 中,但都不适用于 OpenLDAP 服务器(使用userPassword)。我无法找出 AD 中密码是如何散列的,我猜 OpenLDAP 中存储的帐户使用 MD5 或 SSHA 进行散列,这取决于密码的年龄。

我尝试rebind-as-user打开和关闭 OpenLDAP 服务器,尝试使用用户名而不是匿名进行绑定,但我没有任何主意。

要针对两个目录进行身份验证,还缺少什么?

答案1

我终于找到了一个可行的配置。在意识到唯一不起作用的是授权后,我将配置从单独的 LDAP 服务器移至保存帐户的 LDAP 服务器。

我在现有数据库上方添加了一个具有 DN 的附加元数据库,并将属性添加olcSubordinate: TRUE到现有数据库。

dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib/ldap
olcModuleLoad: {0}back_hdb.la
olcModuleLoad: {1}back_meta.la
olcModuleLoad: {2}back_ldap
olcModuleLoad: {3}rwm

dn: olcDatabase={1}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=hostname,dc=example,dc=com
structuralObjectClass: olcHdbConfig
olcSubordinate: TRUE

dn: olcDatabase={2}meta,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMetaConfig
olcDatabase: {2}meta
olcSuffix: dc=example,dc=com
olcDbOnErr: continue
olcDbCancel: abandon
olcDbTFSupport: no
structuralObjectClass: olcMetaConfig

dn: olcMetaSub={0}ad,olcDatabase={2}meta,cn=config
objectClass: olcMetaTargetConfig
olcMetaSub: {0}ad
olcDbURI: ldaps://dc.example.com/DC=ad,DC=example,DC=
 com
olcDbIDAssertAuthzFrom: {0}dn.regex:.*
olcDbIDAssertBind: bindmethod=simple binddn="CN=user,OU=service user
 s,DC=ad,dc=example,dc=com" credentials="XXXXXXXXXXXXXXXXXXXXXXXX
 XXXXX" flags=override mode=none
olcDbMap: {0}objectclass inetOrgPerson user
olcDbMap: {1}attribute uid sAMAccountName
olcDbMap: {2}attribute entryUUID objectGUID
olcDbMap: {3}objectclass groupOfUniqueNames group
olcDbMap: {4}attribute uniqueMember member
olcDbChaseReferrals: FALSE
olcDbNoRefs: TRUE
olcDbProtocolVersion: 3
olcDbRebindAsUser: TRUE
structuralObjectClass: olcMetaTargetConfig

现在dc=example,dc=com我得到了 OUadhostname,后者保存本地帐户,前者显示来自 AD 的条目,其中我需要的属性映射到 OpenLDAP 中的相应名称。

相关内容