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.