OpenLDAP 2.4 Server Replizierung
Kompilation und Installation vom Quelltext
Kompiliere mit Unterstützung für die neue MDB Datenbank, welche die Berkeley DB ersetzen wird. Die neue MDB ist viel schneller und erfordert keine weiteren Anpassungsparameter.
tar -xvzf openldap-2.4.38.tgz cd openldap-2.4.38 ./configure --prefix=/opt/openldap \ --sysconfdir=/etc/opt/openldap \ --localstatedir=/var/opt/openldap \ --with-subdir= \ --enable-slapd --enable-mdb --enable-monitor --enable-overlays --enable-crypt \ --with-tls --with-cyrus-sasl make depend make make install
Konfiguriere LDAP Server
Gemeinsamer Teil für beide Consumer und Provider Replica. Die offizielle OpenLDAP 2.4 Anleitung zeigt alle Beispiele mit der alten Syntax. Es dauerte eine Weile und viel Nachforschung, wie die dasselbe mit der neuen cn=config Syntax aussehen muss.
slapadd -v -F /etc/opt/openldap/slapd.d -n 0 << dn: cn=config objectClass: olcGlobal cn: config olcAttributeOptions: lang- olcConfigFile: /etc/opt/openldap/slapd.conf.bak olcConfigDir: /etc/opt/openldap/slapd.d olcPidFile: /var/opt/openldap/run/slapd.pid olcTLSCACertificateFile: /etc/pki/tls/certs/example_ca.pem olcTLSCertificateFile: /etc/pki/tls/certs/node-cert.pem olcTLSCertificateKeyFile: /etc/pki/tls/private/node-key.pem olcTLSVerifyClient: never olcLogLevel: none olcSecurity: simple_bind=128 olcLocalSSF: 128 dn: cn=schema,cn=config objectClass: olcSchemaConfig cn: schema include: file:///etc/opt/openldap/schema/core.ldif include: file:///etc/opt/openldap/schema/cosine.ldif include: file:///etc/opt/openldap/schema/duaconf.ldif include: file:///etc/opt/openldap/schema/inetorgperson.ldif include: file:///etc/opt/openldap/schema/ppolicy.ldif include: file:///etc/opt/openldap/schema/openldap.ldif include: file:///etc/opt/openldap/schema/java.ldif include: file:///root/schema/rfc2307bis.ldif include: file:///root/schema/printing.ldif include: file:///root/schema/solaris.ldif include: file:///root/schema/cupsprinter.ldif include: file:///root/schema/mozilla.ldif dn: olcDatabase={-1}frontend,cn=config objectClass: olcDatabaseConfig objectClass: olcFrontendConfig olcDatabase: {-1}frontend olcAccess: {0}to attrs=userPassword by self =xw by anonymous auth by * none olcAccess: {1}to * by * read olcSizelimit: size.soft=10000 size.hard=1000000 olcTimelimit: time.soft=300 time.hard=3600 dn: olcDatabase={0}config,cn=config objectClass: olcDatabaseConfig olcDatabase: {0}config olcRootDN: cn=Manager,cn=config olcRootPW: {SSHA}ENCRYPTEDPASSWORD olcMonitoring: FALSE olcAccess: {0}to dn.subtree="cn=schema,cn=config" by users read olcAccess: {1}to * by * none dn: olcDatabase={1}monitor,cn=config objectClass: olcDatabaseConfig olcDatabase: {1}monitor olcAddContentAcl: FALSE olcLastMod: TRUE olcMaxDerefDepth: 15 olcReadOnly: FALSE olcSyncUseSubentry: FALSE olcMonitoring: FALSE olcAccess: {3}to dn.subtree="cn=monitor" by dn.exact="cn=Manager,cn=config" read by dn.exact="cn=Manager,dc=example,dc=com" read by * none dn: olcDatabase={2}mdb,cn=config objectClass: olcDatabaseConfig objectClass: olcMdbConfig olcDatabase: {2}mdb olcMonitoring: TRUE olcSuffix: dc=example,dc=com olcRootDN: cn=Manager,dc=example,dc=com olcRootPW: {SSHA}ENCRYPTEDPASSWORD olcDbDirectory: /var/opt/openldap/example_com olcDbMaxSize: 42949672960 olcDbIndex: objectClass pres,eq olcDbIndex: cn pres,eq,sub olcDbIndex: uid pres,eq olcDbIndex: uidNumber pres,eq olcDbIndex: gidNumber pres,eq olcDbIndex: mail pres,eq,sub olcDbIndex: ou pres,eq olcDbIndex: loginShell pres,eq olcDbIndex: sn pres,eq,sub olcDbIndex: givenName pres,eq,sub olcDbIndex: memberUid pres,eq olcDbIndex: nisMapName pres,eq olcDbIndex: nisMapEntry pres,eq olcDbIndex: entryCSN eq olcDbIndex: entryUUID eq olcAccess: {0}to attrs=userPassword by dn.exact="cn=Manager,dc=example,dc=com" write by dn.exact="cn=Replicator,dc=example,dc=com" read by self =xw by anonymous auth by * none olcAccess: {2}to * by * read olcLimits: {0}dn.exact="cn=Manager,dc=example,dc=com" size.soft=unlimited size.hard=unlimited time.soft=unlimited time.hard=unlimited olcLimits: {1}dn.exact="cn=Replicator,dc=example,dc=com" size.soft=unlimited size.hard=unlimited time.soft=unlimited time.hard=unlimited dn: olcOverlay=ppolicy,olcDatabase={2}mdb,cn=config objectClass: olcOverlayConfig objectClass: olcPPolicyConfig olcOverlay: ppolicy olcPPolicyDefault: cn=default,ou=pwpolicies,dc=example,dc=com olcPPolicyHashCleartext: TRUE olcPPolicyUseLockout: FALSE EOF
Den Prozess slapd im Vordergrund starten mit Debugging-Optionen
/opt/openldap/libexec/slapd -d 0x4100 -F /etc/opt/openldap/slapd.d -h "ldapi:/// ldap:/// ldaps:///"
Rolle als Provider Replica zuweisen
Dieser Schritt muss auf dem LDAP Server ausgeführt werden, der Provider Replica (Master) werden soll.
ldapadd -H ldaps://ldapmaster.example.com -D cn=Manager,cn=config -W <<EOF dn: olcDatabase={3}mdb,cn=config objectClass: olcDatabaseConfig objectClass: olcMdbConfig olcDatabase: {3}mdb olcMonitoring: TRUE olcSuffix: cn=accesslog olcRootDN: cn=accesslog olcDbDirectory: /var/opt/openldap/accesslog olcDbMaxSize: 42949672960 olcDbIndex: default eq olcDbIndex: entryCSN,objectClass,reqEnd,reqResult,reqStart olcAddContentAcl: FALSE olcLastMod: TRUE olcMaxDerefDepth: 15 olcReadOnly: FALSE olcSyncUseSubentry: FALSE olcDbNoSync: TRUE olcAccess: {0}to * by dn.exact="cn=Manager,cn=config" read by dn.exact="cn=Manager,dc=example,dc=com" read by dn.exact="cn=Replicator,dc=example,dc=com" read by * none olcLimits: {0}dn.exact="cn=Manager,dc=example,dc=com" size.soft=unlimited size.hard=unlimited time.soft=unlimited time.hard=unlimited olcLimits: {1}dn.exact="cn=Replicator,dc=example,dc=com" size.soft=unlimited size.hard=unlimited time.soft=unlimited time.hard=unlimited dn: olcOverlay=accesslog,olcDatabase={2}mdb,cn=config objectClass: olcOverlayConfig objectClass: olcAccessLogConfig olcOverlay: accesslog olcAccessLogDB: cn=accesslog olcAccessLogOps: writes olcAccessLogPurge: 7+00:00 1+00:00 olcAccessLogSuccess: TRUE dn: olcOverlay=syncprov,olcDatabase={2}mdb,cn=config objectClass: olcOverlayConfig objectClass: olcSyncProvConfig olcOverlay: syncprov olcSpNoPresent: FALSE olcSpReloadHint: TRUE dn: olcOverlay=syncprov,olcDatabase={3}mdb,cn=config objectClass: olcOverlayConfig objectClass: olcSyncProvConfig olcOverlay: syncprov olcSpNoPresent: TRUE olcSpReloadHint: TRUE EOF
Den Basisbaum für die LDAP Datenbank erstellen.
ldapadd -H ldaps://ldapmaster.example.com -D cn=Manager,dc=example,dc=com -W <<EOF dn: dc=example,dc=com objectClass: top objectClass: dcobject dn: cn=Manager,dc=example,dc=com cn: Manager objectClass: top objectClass: organizationalrole dn: ou=pwpolicies,dc=example,dc=com ou: pwpolicies objectClass: organizationalUnit objectClass: top dn: cn=default,ou=pwpolicies,dc=example,dc=com cn: default sn: Default Password Policy objectClass: pwdPolicyChecker objectClass: pwdPolicy objectClass: person objectClass: top pwdAttribute: userPassword pwdMinAge: 0 pwdMaxAge: 0 pwdInHistory: 0 pwdCheckQuality: 0 pwdMinLength: 6 pwdExpireWarning: 0 pwdGraceAuthNLimit: 0 pwdLockout: TRUE pwdLockoutDuration: 3600 pwdMaxFailure: 10 pwdFailureCountInterval: 300 pwdMustChange: FALSE pwdAllowUserChange: TRUE pwdSafeModify: FALSE dn: cn=Replicator,dc=example,dc=com cn: Replicator sn: LDAP Replication User objectClass: person objectClass: top userPassword: {SSHA}ENCRYPTEDPASSWORD EOF
Rolle als Consumer Replica zuweisen
Dieser Schritt ist auf allen LDAP Servern zu machen, die als Consumer Replica konfiguriert werden solle. Die Replizierung startet sofort nach diesem Befehl.
ldapmodify -v -H ldaps://ldap1.example.com -D cn=Manager,cn=config -W << dn: olcDatabase={2}mdb,cn=config changetype: modify add: olcSyncrepl olcSyncrepl: rid=0 provider="ldaps://ldapmaster.example.com:636" searchbase="dc=example,dc=com" type=refreshAndPersist retry="60 10 300 +" scope=sub schemachecking=on bindmethod=simple binddn="cn=Replicator,dc=example,dc=com" credentials=CLEARTEXTPASSWORD logbase="cn=accesslog" logfilter="(objectClass=*)" syncdata=accesslog tls_cert=/etc/pki/tls/certs/node-cert.pem tls_key=/etc/pki/tls/private/node-key.pem tls_cacert=/etc/pki/tls/certs/example-ca.pem - add: olcUpdateRef olcUpdateRef: ldaps://ldapmaster.example.com:636 - EOF
Replikation überprüfen
Consumer Replicas sind schreibgeschützt und verweisen (Referral) Schreibzugriffe auf den Provider Replica.
ldapmodify -v -H ldaps://ldap1.example.com -D uid=someuser,ou=people,dc=example,dc=com -W <<EOF dn: uid=someuser,ou=people,dc=example,dc=com changetype: modify replace: userPassword userPassword: {SSHA}THENEWENCRYPTEDPASSWORD EOF Enter LDAP Password: modifying entry "uid=someuser,ou=people,dc=example,dc=com" ldap_modify: Referral (10) referrals: ldaps://ldapmaster.example.com:636/uid=someuser,ou=people,dc=example,dc=com
Überprüfe die Datenintegrität auf allen LDAP Servern.
LDAPSERVERS=(ldapmaster.example.com ldap1.example.com ldap2.example.com ldap3.example.com) for server in ${LDAPSERVERS[*]}; do ldapsearch -LLL -H ldaps://$server -b dc=example,dc=com \ -D cn=Manager,dc=example,dc=com -w 'CLEARTEXTPASSWORD' >/tmp/$server.ldif md5sum /tmp/$server.ldif rm -f /tmp/$server.ldif done a9efca26be302f31150e8068df0c192d /tmp/ldapmaster.example.com.ldif a9efca26be302f31150e8068df0c192d /tmp/ldap1.example.com.ldif a9efca26be302f31150e8068df0c192d /tmp/ldap2.example.com.ldif a9efca26be302f31150e8068df0c192d /tmp/ldap3.example.com.ldif
Wiederhole dies, nachdem ein Consumer Replica gestoppt, auf dem Provider Daten geändert und dann wieder gestartet wurde. Sollte ein Consumer Replica nicht mehr synchron sein, einfach stoppen, Datenbankdateien löschen und wieder starten. Eine volle Initialisierung läuft dann durch.