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 (sehr gute Einführung von Stefan Kania) 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:
- Die Einrichtung einer Datenbank wird auf Basis eines Domainnamens (z.B. dc=effinger,dc=org) vorgenommen
- Der entsprechende Eintrag für einen Administrator dieses DNs (dc=effinger,dc=org) wird nicht geschrieben, was bedeutet, dass man standardmäßig keine Einträge schreiben kann, sondern erst von Hand in cn=config den entsprechenden RootDN anlegen muss
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) 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 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 oder LDAP Browser/Editor, 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!
Interessanter Beitrag – gerade für mich der LDAP nie eingesetzt hat.
Warum setzt du LDAP ein? Warum keine der *SQL Datenbanken? Die sind zwar nicht so schnell und schlank wie LDAP, dafür aber feature reicher.
Der Grund, weshalb ich LDAP einsetzen möchte, ist weniger der strukturelle Unterschied zu SQL (hierarchisch vs. relational), sondern ganz einfach, dass Samba LDAP besser unterstützt und ich mein Adressbuch künftig ebenfalls auf LDAP migrieren möchte. Dann kann ich nämlich von Thunderbird, Evolution usw. auf ein einheitliches Adressbuch zugreifen. Und wenn ich mich deshalb ohnehin mit LDAP beschäftigen muss/möchte, warum dann nicht auch bei der Konfiguration des Mailservers?
Klingt plausibel.. das hat meinen Horizont mal wieder erweitert!
und wie willst du neue Adresse anlegen bzw. ändern?
Soweit ich weiss kann man von Thunderbird & Co aus keine Änderungen vornehmen.
Thunderbird 2 kann tatsächlich nur lesend auf LDAP-Kontakte zugreifen. Allerdings habe ich gelesen, dass in der Codebase von Thunderbird 3 eigentlich schon die Schreibunterstützung drin ist – es ist anscheinend nur noch nicht für die Alpha-Version aktiviert worden. Hoffen wir mal, dass die finale Version von Thunderbird 3 endlich schreiben kann. Evolution kann es schließlich auch jetzt schon.
Vielen Dank für diese Anleitung. Tatsächlich findet man nicht viele Anleitungen die bereits mit der Konfiguration in „cn=config“ beschreiben. Obwohl das Sinn macht.
Hallo Markus,
coole Anleitung! Hast Du schon mal versucht mit dem Apache eine Authentifizierung gegen den LDAP zu machen?
Danke und Gruß v. blaufotograph
Hallo blaufotograph,
mit dieser Fragestellung hatte ich bislang noch nichts zu tun. Evt. werde ich für mein dspam-webinterface allerdings etwas Ähnliches entwickeln müssen. Da ist allerdings noch die Frage offen, ob das direkt via Apache oder via irgendeiner Skriptsprache (perl, php, ..) realisiert werden sollte.
Gruß
Markus
Eine weitere gute LDAP-Einführung in Präsentationsform hat Adam Tauno Williams zusammengestellt. Sie ist zwar von 2003, aber konzeptionell hat sich ja inzwischen nicht viel geändert.
[…] zwar grundsätzlich ähnlich wie zu der Beschreibung in meinen anderen Blog-Artikeln (Das kleine OpenLDAP 1×1, OpenLDAP im Mailserversetup unter Ubuntu) beschrieben hatte, allerdings gibt es an der ein oder […]