- Abraxas - http://www.effinger.org/blog -

Das kleine OpenLDAP 1×1

Um meine Mailserverkonfiguration auf LDAP umzustellen, musste ich mich mit OpenLDAP beschäftigen. Da OpenLDAP seit Version 2.3 (aktuell ist 2.4) die von der vormaligen Konfigurationsdatei slapd.conf umgestellt hat auf ein LDAP-basiertes Schema, nämlich cn=config, kann man mit vielen Anleitungen und Tutorials nicht mehr wirklich etwas anfangen, da sich Vieles geändert hat. Die folgenden Punkte sollen helfen, trotzdem mit OpenLDAP einigermaßen umgehen zu können. Wenn man jedoch kompletter LDAP-Neuling ist, empfehle ich unbedingt, sich vorher die LDAP Grundlagen [1] (sehr gute Einführung von Stefan Kania [2]) anzueignen. Noch ein kleiner Hinweis alle folgenden Befehle (bis auf diejenigen mit ldapadd) sind als root auszuführen, also am Besten nach einen

sudo bash

oder einem

sudo -s

weiter arbeiten.

Einrichtung unter Ubuntu

Bei der Installation von OpenLDAP mit

apt-get install slapd ldap-utils

kann man schon grundlegende Dinge festlegen (unbedingt das Administrator Passwort merken). Mit einem

dpkg-reconfigure slapd

kann man auch weitergehende Einstellungen vornehmen, allerdings haben mir einige Dinge dabei nicht gefallen:

Aus diesem Grund empfehle ich, die Konfiguration selbst vorzunehmen.

Erzeugte Datenbanken löschen

Eine erstellte Datenbank zu löschen ist gar nicht so einfach. Ich hatte zuerst gedacht es wäre möglich einfach den entsprechenden DN in cn=config zu entfernen (also beispielsweise cn=config,olcDatabase={1}hdb löschen), aber das funktioniert nicht. Stattdessen muss man mit

/etc/init.d/slapd stop

zunächst den OpenLDAP Server stoppen, um dann im Verzeichnis /etc/ldap/slapd.d/cn=config die entsprechende Datei (hier olcDatabase={1}hdb) nach dem Speicherort der Datenbank zu durchforsten:

cat /etc/ldap/slapd.d/cn\=config/olcDatabase\=\{1\}hdb.ldif | grep olcDbDirectory

Durch die Ausgabe (z.B. „olcDbDirectory: /var/lib/ldap“) weiß man nun den Pfad der Datenbank (hier /var/lib/ldap), den man nun zusammen mit der entsprechenden Konfigurationsdatei löscht:

rm /etc/ldap/slapd.d/cn\=config/olcDatabase\=\{1\}hdb.ldif && rm /var/lib/ldap/*

Im Anschluss starten wir den OpenLDAP Server wieder:

/etc/init.d/slapd start

Neue Datenbank erzeugen

Um eine neue Datenbank zu erzeugen, habe ich mir die Vorlage unter /usr/share/slapd/slapd.init.ldif zum Vorbild genommen (siehe auch OpenLDAP Admin Guide [3]) und angepasst. Herausgekommen ist dabei meine database.ldif:

# Database settings
dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: hdb
# The base of your directory
olcSuffix: o=effinger
# rootdn directive for specifying a superuser on the database. This is needed
# for syncrepl.
olcRootDN: cn=admin,o=effinger
# Superuser Password for the database
# {SSHA}pEvotN6PmSjx0JV/mZl5BWeSVOKR1Ejt equals "test"
# CHANGE this for your installation!!!
olcRootPW: {SSHA}pEvotN6PmSjx0JV/mZl5BWeSVOKR1Ejt
# Where the database file are physically stored
olcDbDirectory: /var/lib/ldap
# The dbconfig settings are used to generate a DB_CONFIG file the first
# time slapd starts.  They do NOT override existing an existing DB_CONFIG
# file.  You should therefore change these settings in DB_CONFIG directly
# or remove DB_CONFIG and restart slapd for changes to take effect.
# For the Debian package we use 2MB as default but be sure to update this
# value if you have plenty of RAM

olcDbConfig: set_cachesize 0 2097152 0
# Sven Hartge reported that he had to set this value incredibly high
# to get slapd running at all. See http://bugs.debian.org/303057 for more
# information.
# Number of objects that can be locked at the same time.
olcDbConfig: set_lk_max_objects 1500
# Number of locks (both requested and granted)
olcDbConfig: set_lk_max_locks 1500
# Number of lockers
olcDbConfig: set_lk_max_lockers 1500
# Indexing options
olcDbIndex: objectClass eq
# Save the time that the entry gets modified
olcLastMod: TRUE
# Checkpoint the BerkeleyDB database periodically in case of system
# failure and to speed slapd shutdown.
olcDbCheckpoint: 512 30
# The userPassword by default can be changed
# by the entry owning it if they are authenticated.
# Others should not be able to see it, except the
# admin entry below
# These access lines apply to database #1 only
olcAccess: to attrs=userPassword,shadowLastChange by dn="cn=admin,o=effinger" write by anonymous auth by self write by * none
# Ensure read access to the base for things like
# supportedSASLMechanisms.  Without this you may
# have problems with SASL not knowing what
# mechanisms are available and the like.
# Note that this is covered by the 'access to *'
# ACL below too but if you change that as people
# are wont to do you'll still need this if you
# want SASL (and possible other things) to work
# happily.
olcAccess: to dn.base="" by * read
# The admin dn has full write access, everyone else
# can read everything.
olcAccess: to * by dn="cn=admin,o=effinger" write by * read
# For Netscape Roaming support, each user gets a roaming
# profile for which they have write access to
#olcAccess: to dn=".*,ou=Roaming,o=morsnet" by dn="cn=admin,o=effinger" write by dnattr=owner write

Bitte unbedingt das Passwort (olcRootPW) ändern. Den entsprechenden String erhält man durch Ausführen von slappasswd. Dann kann man durch ein

ldapadd -f database.ldif -x -D "cn=admin,cn=config" -W

die entsprechende Datenbank erzeugen, wobei man nach dem Passwort gefragt wird, das man bei der Installation von slapd angegeben hat (also nicht das soeben mit slappasswd erzeugte). Was jetzt noch fehlt, sind entsprechende Einträge in der Datenbank. Dazu erzeugen wir eine neue Datei namens database-content.ldif mit diesem Inhalt:

dn: o=effinger
objectclass: organization
objectclass: top
o: effinger

Die wir analog an OpenLDAP mit

ldapadd -f database-content.ldif -x -D "cn=admin,o=effinger" -W

übergeben. Hierbei muss das Passwort eingegeben werden, das oben mit slappasswd erzeugt wurde.

Schema-Dateien mit cn=config

Um die weit verbreiteten Schema-Dateien in das neue Konfigurationsschema cn=config von OpenLDAP zu übernehmen, habe ich in eine Anleitung in der Ubuntu-Server Guide [4] gefunden. Bei Gelegenheit werde ich diese mal ausprobieren und meine Erfahrungen dazu schildern.

Die nächsten Schritte mit LDAP

Jetzt kann man loslegen und mit den ldap-utils weiter an dem Verzeichnis arbeiten oder noch besser, man verwendet dazu grafische Programme wie JXplorer [5] oder LDAP Browser/Editor [6], zwei wirklich empfehlenswerte, Java-basierte Tools. Um sie zu benutzen habe ich mit einem

apt-get install sun-java6-jre

das Sun Java Runtime Environment installiert. Das Shell-Skript jxplorer.sh von JXplorer musste ich noch leicht anpassen, da ich folgenden Fehler beim starten erhielt: Unrecognized option: -Xdock:name=JXplorer Could not create the Java virtual machine. Die Anpassungen hier als diff:

--- jxplorer.sh.old	2008-09-07 01:28:40.000000000 +0200
+++ jxplorer.sh	2008-12-13 14:56:51.402593159 +0100
@@ -38,14 +38,14 @@
 echo
 FAIL=0
 if [ "$1" = "console" ] ; then
-    $JAVAV -Xdock:name="JXplorer" -Dcom.apple.macos.useScreenMenuBar=true -cp .:jars/jxplorer.jar:jars/help.jar:jars/jhall.jar:jars/junit.jar:jars/ldapsec.jar:jars/log4j.jar:jars/dsml/activation.jar:jars/dsml/commons-logging.jar:jars/dsml/dom4j.jar:jars/dsml/jxext.jar:jars/dsml/mail.jar:jars/dsml/providerutil.jar:jars/dsml/saaj-api.jar:jars/dsml/saaj-ri.jar com.ca.directory.jxplorer.JXplorer
+    $JAVAV -cp .:jars/jxplorer.jar:jars/help.jar:jars/jhall.jar:jars/junit.jar:jars/ldapsec.jar:jars/log4j.jar:jars/dsml/activation.jar:jars/dsml/commons-logging.jar:jars/dsml/dom4j.jar:jars/dsml/jxext.jar:jars/dsml/mail.jar:jars/dsml/providerutil.jar:jars/dsml/saaj-api.jar:jars/dsml/saaj-ri.jar com.ca.directory.jxplorer.JXplorer

     if [ "$?" != "0" ]; then
         FAIL=1
     fi
 else
     echo "Use \"jxstart.sh console\" if you want logging to the console"
-    $JAVAV -Xdock:name="JXplorer" -Dcom.apple.macos.useScreenMenuBar=true -cp .:jars/jxplorer.jar:jars/help.jar:jars/jhall.jar:jars/junit.jar:jars/ldapsec.jar:jars/log4j.jar:jars/dsml/activation.jar:jars/dsml/commons-logging.jar:jars/dsml/dom4j.jar:jars/dsml/jxext.jar:jars/dsml/mail.jar:jars/dsml/providerutil.jar:jars/dsml/saaj-api.jar:jars/dsml/saaj-ri.jar com.ca.directory.jxplorer.JXplorer  >/dev/null 2>&1
+    $JAVAV -cp .:jars/jxplorer.jar:jars/help.jar:jars/jhall.jar:jars/junit.jar:jars/ldapsec.jar:jars/log4j.jar:jars/dsml/activation.jar:jars/dsml/commons-logging.jar:jars/dsml/dom4j.jar:jars/dsml/jxext.jar:jars/dsml/mail.jar:jars/dsml/providerutil.jar:jars/dsml/saaj-api.jar:jars/dsml/saaj-ri.jar com.ca.directory.jxplorer.JXplorer  >/dev/null 2>&1

     if [ "$?" != "0" ]; then
         FAIL=1

Um die Änderungen vorzunehmen einfach den obigen Inhalt als patch.diff im selben Verzeichnis wie die jxplorer.sh speichern und dann ein

patch -p0 < patch.diff

ausführen.

Happy LDAPing!