Im folgenden möchte ich beschreiben, wie ich in OpenLDAP 2.4 eine Replikation eingerichtet habe.
Für eine Dovecot / Postfix Installation welche die Benutzer in einem LDAP sichert nutzen wir OpenLDAP zur Ablage der Benutzerobjekte. Damit die Umgebung auch beim Ausfall des LDAP Servers weiter funktioniert, benötigen wir eine Replikation aller Objekte im LDAP von einem Server zu einer zweiten OpenLDAP Instanz. Darum soll es in diesem Artikel gehen.
Die Instanzen laufen auf einem Ubuntu 14.04, das LDAP ist auf beiden Servern entsprechend dieser Anleitung
vorbereitet worden https://wiki.ubuntuusers.de/OpenLDAP_ab_Precise
Anmerkung: Dieser Artikel kommt original von hier. Ich habe diesen übersetzt, stellenweise ergänzt und
angepasst und für mich als Erinnerung aufgeschrieben.
Voraussetzungen an OpenLDAP und die Systeme
Bei einer Replikation im LDAP Umfeld redet man von „Master“ und „Consumer“, daher werden wir auch hier diese Bezeichnungen nutzen.
In älteren OpenLDAP Versionen wurde die Konfiguration noch in eigenen Konfigurationsdateien gespeichert, mittlerweile wird dies direkt im LDAP abgelegt. Daher müssen wir für die Replikation diese Einstellungen per
ldif Dateien in die config Partition einspielen.
Meine Beispiele gehen davon aus, das die Domäne eine Base von „dc=domain,dc=local“ hat. Der Hauptbenutzer bei mir ist „cn=admin,dc=domain,dc=local“.
Unser Masterserver ist „ldap1.domain.local“ (IP 10.0.0.4), und der aktuell einzige Consumer ist „ldap2.domain.local“ (IP 10.0.0.5).
Weiterhin ist das Schema auf beiden Hosts identisch.
Um zu starten ist es sinnvoll, auf dem Masterserver einmal einen Export zu machen und den resultierende Dump auf dem Consumer wieder einzuspielen. Dies geht mit OpenLDAP z.B. so:
[email protected]:~# ldapsearch -Wx -D "cn=admin,dc=domain,dc=local" -b "dc=domain,dc=local" -H ldap://master.domain.local-LLL > ldap_dump.ldif [email protected]:~# ldapadd -Wx -D "cn=admin,dc=domain,dc=local" -H ldap://localhost -f ldap_dump.ldif
Die nötigen LDIF Scripte
Als allererstes benötigen wir auf dem Master OpenLDAP Server einen Benutzer, der alles im LDAP lesen darf.
Dieser Benutzer sollte ein userPassword erhalten, dieses erzeugen wir mit slappasswd und sollte einigermaßen „stark“ sein, da der Benutzer sehr weitreichende Rechte im LDAP erhält.
[email protected]:~# slappasswd New password: Re-enter new password: {SSHA}LHiMKOP5hNN5pmafvzrQ57lSBKQZZcck
Ich habe hier das Passwort „replication“ genutzt, wie gesagt sollte dies in einer Produktionsumgebung natürlich ein stärkeres sein.
Dann legen wir die Datei „create_repl_user.ldif“ an mit folgendem Inhalt an:
dn: cn=ldapsync,dc=domain,dc=local objectClass: simpleSecurityObject objectClass: organizationalRole cn: ldapsync userPassword: {SSHA}LHiMKOP5hNN5pmafvzrQ57lSBKQZZcck description: LDAP replication user
Im zweiten Schritt müssen wir den Provider Service auf dem Master Server aktivieren und dem ldapsync Benutzer Lesezugriff auf das gesamte Verzeichnis geben. Hierzu legen wir die Datei „enable_sync_prov.ldif“ mit folgendem Inhalt an:
dn: olcDatabase={1}hdb,cn=config changetype: modify delete: olcAccess olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by dn="cn=admin,dc=domain,dc=local write by * none - add: olcAccess olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by dn="cn=admin,dc=domain,dc=local" write by dn="cn=ldapsync,dc=domain,dc=local" read by anonymous auth by * none - add: olcDbIndex olcDbIndex: entryUUID eq - add: olcDbIndex olcDbIndex: entryCSN eq dn: cn=module{0},cn=config changetype: modify add: olcModuleLoad olcModuleLoad: {1}syncprov dn: cn=config changeType: modify add: olcServerID olcServerID: 0 dn: olcOverlay=syncprov,olcDatabase={1}hdb,cn=config changetype: add objectClass: olcOverlayConfig objectClass: olcSyncProvConfig olcOverlay: {0}syncprov olcSpCheckpoint: 100 10 olcSpSessionlog: 100
Im dritten und letzten Schritt erzeugen wir auf dem Consumer Server die Datei „enable_sync_consumer.ldif„. Bitte darauf achten, die Zeile „provider=“ und „credentials=“ entsprechend der eigenen Umgebung anzupassen.
dn: cn=config changetype: modify replace: olcLogLevel olcLogLevel: stats - add: olcServerID olcServerID: 1 dn: olcDatabase={1}hdb,cn=config changetype: modify delete: olcAccess olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by dn="cn=admin,dc=domain,dc=local" write by * none - add: olcAccess olcAccess: {0}to attrs=userPassword,shadowLastChange by anonymous auth by * none - delete: olcAccess olcAccess: {2}to * by self write by dn="cn=admin,dc=domain,dc=local" write by * read - add: olcAccess olcAccess: {2}to * by * read - replace: olcRootDN olcRootDN: cn=manager - delete: olcRootPW - add: olcDbIndex olcDbIndex: entryCSN eq - add: olcDbIndex olcDbIndex: entryUUID eq - add: olcDbIndex olcDbIndex: uid eq - add: olcDbIndex olcDbIndex: cn eq - add: olcDbIndex olcDbIndex: ou eq - add: olcDbIndex olcDbIndex: dc eq - add: olcSyncrepl olcSyncrepl: rid=123 provider="ldap://master.domain.local:389/" type=refreshAndPersist retry="60 30 300 +" searchbase="dc=domain,dc=local" bindmethod=simple binddn="cn=ldapsync,dc=domain,dc=local" credentials=replication schemachecking=on - add: olcMirrorMode olcMirrorMode: TRUE
Alles ins OpenLDAP importieren
Nachdem alle Konfigurationsdateien erzeugt sind, können wir diese nun gegen das LDAP laufen lassen.
Auf dem Master Server starten wir die ersten beiden Scripte:
[email protected]:~# ldapadd -x -W -D cn=admin,dc=domain,dc=local -f create_repl_user.ldif Enter LDAP Password: adding new entry "cn=ldapsync,dc=domain,dc=local"
Da wir für die nächste Konfiguration alle Partitionen „anfassen“ müssen, für wir diese mit SASL/EXTERNAL Authentifizierung durch. Diese sollte bei einer Standard Debian/Ubuntu Installation aktiv sein.
[email protected]:~# ldapmodify -Y EXTERNAL -H ldapi:/// -f enable_sync_prov.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={1}hdb,cn=config" modifying entry "cn=module{0},cn=config" adding new entry "olcOverlay=syncprov,olcDatabase={1}hdb,cn=config"
Hiermit sollte nun der frisch angelegt Benutzer ldapsync Zugriff haben, das syncprov Modul geladen werden sowie die Grundeinstellungen für dieses Modul vorgenommen sein.
Jetzt wird auf dem Consumer Server das enable_sync_consumer.ldif Script ausgeführt, um die Replikation zu starten.
[email protected]:~# ldapadd -Y EXTERNAL -H ldapi:/// -f enable_sync_consumer.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "cn=config" modifying entry "olcDatabase={1}hdb,cn=config" modifying entry "cn=config"
Wenn alles sauber durchgelaufen ist sollten die Objektänderungen sowie Anlagen und Löschungen direkt auf dem zweiten LDAP Host sichtbar werden.
Wenn ich den Befehl:
ldapmodify -Y EXTERNAL -H ldapi:/// -f enable_sync_prov.ldif
ausführe erhalte ich eine error Meldung
modifying entry „olcDatabase={1}hdb,cn=config“
ldap_modify: No such attribute (16)
additional info: modify/delete: olcAccess: no such value
ich habe die Datei folgendermaßen angepasst:
dn: olcDatabase={1}hdb,cn=config
changetype: modify
delete: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange
by self write
by anonymous auth
by dn=“cn=admin,dc=domain,dc=local“ write
by * none
–
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange
by self write
by dn=“cn=admin,dc=com“ write
by dn=“cn=ldapsync,dc=com“ read
by anonymous auth
by * none
–
add: olcDbIndex
olcDbIndex: entryUUID eq
–
add: olcDbIndex
olcDbIndex: entryCSN eq
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: {1}syncprov
dn: cn=config
changeType: modify
add: olcServerID
olcServerID: 0
dn: olcOverlay=syncprov,olcDatabase={1}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: {0}syncprov
olcSpCheckpoint: 100 10
olcSpSessionlog: 100
Ich hoffe mir kann weitergeholfen werden.
Mit freundlichen Grüßen
Ajdar