我们有一个用于通过 Atlassian Crowd 实例进行身份验证的应用程序,但经过重大重写后,该身份验证源不再可用。现在我需要一个解决方案来对来自 Active Directory 和 OpenLDAP 服务器的用户进行身份验证,该解决方案之前由 Crowd 处理。
最有前途的选项似乎是 OpenLDAP 元后端,我现在有一个配置,可以使用 查找两个目录中的用户ldapsearch
,但身份验证仅适用于 AD 用户。我发现了几个这样的问题,这非常有帮助,但 ultimatley 对我不起作用。
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 文档, 和 都unicodePwd
存在userPassword
于 AD 中,但两者都不适用于 OpenLDAP 服务器(使用userPassword
)。我无法了解 AD 中的密码是如何散列的,存储在 OpenLDAP 中的帐户是使用 MD5 或 SSHA 进行散列的,具体取决于我猜测的密码的年龄。
我尝试rebind-as-user
打开和关闭 OpenLDAP 服务器,我尝试使用用户名而不是匿名进行绑定,我没有任何想法了。
能够针对两个目录进行身份验证缺少什么?
我终于找到了一个工作配置。在意识到唯一不起作用的是授权之后,我将配置从单独的 LDAP 服务器移至保存帐户的 LDAP 服务器。
我在现有数据库上方添加了一个带有 DN 的附加元数据库,并将属性添加
olcSubordinate: TRUE
到现有数据库中。现在,
dc=example,dc=com
我在下面得到 OUad
和hostname
,后者保存本地帐户,前者显示来自 AD 的条目,并将我需要映射到 OpenLDAP 中相应名称的属性。