OpenLDAP メタバックエンドを介して OpenLDAP と Active Directory を組み合わせる

OpenLDAP メタバックエンドを介して OpenLDAP と Active Directory を組み合わせる

以前は Atlassian Crowd インスタンス経由で認証していたアプリケーションがありましたが、大幅な書き換え後、その認証ソースは利用できなくなりました。現在は、以前は Crowd で処理されていた Active Directory と OpenLDAP サーバーの両方からユーザーを認証するソリューションが必要です。

最も有望なオプションは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 のドキュメントによると、AD にはunicodePwdと の両方が存在しますが、どちらも OpenLDAP サーバー ( を使用) では機能しません。AD でパスワードがどのようにハッシュされるかはわかりませんでしたが、OpenLDAP に保存されているアカウントは、パスワードの古さに応じて MD5 または SSHA でハッシュされると思います。userPassworduserPassword

rebind-as-userOpenLDAP サーバーのオン/オフを試したり、匿名ではなくユーザー名でバインドしてみたりしましたが、もうアイデアがありません。

両方のディレクトリに対して認証するには何が欠けているのでしょうか?

答え1

ようやく機能する構成を見つけました。機能していないのは認証だけであることがわかったので、構成を別の LDAP サーバーからアカウントを保持している LDAP サーバーに移動しました。

olcSubordinate: TRUE既存のデータベースの上位に DN を持つ追加のメタ データベースを追加し、既存のデータベースに属性を追加しました。

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=comOUadと が表示されますhostname。後者はローカル アカウントを保持し、前者は AD からのエントリを表示し、必要な属性は OpenLDAP 内の対応する名前にマップされます。

関連情報