Kategorien

Druckansicht des Beitrags Druckansicht des Beitrags

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 (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!

10 comments to Das kleine OpenLDAP 1×1

  • Sven

    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?

  • Sven

    Klingt plausibel.. das hat meinen Horizont mal wieder erweitert!

  • Satart

    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 […]

Leave a Reply to Markus Effinger Cancel reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>