OpenLDAP 메타 백엔드를 통해 OpenLDAP와 Active Directory 결합

OpenLDAP 메타 백엔드를 통해 OpenLDAP와 Active Directory 결합

Atlassian Crowd 인스턴스를 통해 인증하는 데 사용되는 애플리케이션이 있지만 대대적으로 다시 작성한 후에는 해당 인증 소스를 더 이상 사용할 수 없습니다. 이제 이전에 Crowd에서 처리했던 Active Directory와 OpenLDAP 서버 모두에서 사용자를 인증하는 솔루션이 필요합니다.

가장 유망한 옵션은 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및 둘 다 userPasswordAD에 존재하지만 둘 다 OpenLDAP 서버( 를 사용함 userPassword)에서는 작동하지 않습니다. AD에서 비밀번호가 어떻게 해시되는지 알 수 없었습니다. OpenLDAP에 저장된 계정은 제가 추측하는 비밀번호의 나이에 따라 MD5 또는 SSHA로 해시됩니다.

OpenLDAP 서버를 켜고 끄고 rebind-as-user익명 대신 사용자 이름으로 바인딩을 시도했지만 남은 아이디어가 없습니다.

두 디렉터리 모두에 대해 인증하려면 무엇이 빠졌나요?

답변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=comOU ad및 가 표시됩니다 hostname. 후자는 로컬 계정을 보유하고 전자는 AD의 항목을 표시하며 필요한 속성은 OpenLDAP의 해당 이름에 매핑됩니다.

관련 정보