Adressbuch mit OpenLDAP

Vorwort

Einige beschriebene Vorgehensweisen sind nicht mehr aktuell und diese Anleitung könnte z.B. auf den neueren Ubuntu-Versionen zu Problemen führen, ich werde das mal updaten :-)

Datenbanken dürfte ja jeder anständige Administrator kennen wie z.B. MySQL oder PostgreSQL, die wohl bekanntesten Open-Source Produkte. Es spricht auch vieles für den Einsatz von Datenbanken, ideal als Speicher für zentralisierte Informationen und dank unzähliger APIs und Frameworks können sie in nahezu jede Applikation eingebunden werden (PHP & MySQL im Web-Bereich oder JavaDB). Da ich ja auch viel mit MySQL arbeite, dachte ich sofort daran, mir mein Mail-Adressbuch als Tabelle in einer Datenbank abzuspeichern (wie es ja RoundCube Webmail standardmäßig tut). Allerdings konnte ich diese Idee schnell wieder verwerfen, da native Mail-Clients (Windows: Thunderbird, Outlook; Linux: Evolution, KMail) Adressbücher nur über dieses komische Protokoll - genannt LDAP - einbinden können. „Was zur Hölle ist LDAP?!“ habe ich mich gefragt und nach Antworten gesucht. Gefunden habe ich sie in einer Protokollfamilie genannt X.500 und damit nicht genug, auch den Dienst OpenLDAP. Mit diesem mächtigen Verzeichnisdienst lässt sich einiges anstellen. Das folgende HowTo beschreibt die Installation und Konfiguration von OpenLDAP, dessen primäre Aufgabe es sein wird, ein Adressbuch mit Benutzerdaten (Name, Anschrift, E-Mail, …) verschiedensten LDAP-fähigen Anwendungen zur Verfügung zu stellen.

Software

Das eingesetzte Test-System ist ein Debian 5.0 Lenny x64 Server (mittlerweile auch eine Ubuntu 9.04 Desktop x68 Maschine), folgende Komponenten werden installiert werden:

  • OpenLDAP 2.4
~# slapd -V
@(#) $OpenLDAP: slapd 2.4.11 (Oct 11 2008 10:18:55) $
  • phpLDAPadmin 1.1.0.5
  • Apache Directory Studio 1.4.0

Installation

Debian-typisch ist die Installation keine Hexerei:

aptitude install slapd ldap-utils

Danach wird man nach den essentiellen Daten gefragt, die für den Betrieb notwendig sind (Frage-Antwort-Spiel :-D). Sollte der Dialog nicht erscheinen bzw. nur das Administrator-Passwort abgefragt werden (Ubuntu), kann man die neuerliche Konfiguration auch erzwingen:

dpkg-reconfigure slapd

Es werden nun folgende Parameter benötigt:

  • Soll die OpenLDAP-Server-Konfiguration ausgelassen werden?
    Nein
  • DNS-Domainname
    Der eingegebene Domainname des Systems (z.B. example.org) wird in die Basis-DN zerlegt (z.B. dc=example,dc=org)
  • Name der Organisation
    Beschreibung der Organisation (z.B. Example Inc.)
  • Zu verwendendes Datenbank-Backend
    HDB
  • Soll die Datenbank entfernt werden, wenn slapd vollständig gelöscht wird? (distributionsabhängig)
    Nein
  • Alte Datenbank verschieben? (nur wenn slapd schon einmal installiert wurde)
    Ja
  • Administrator-Passwort
    Das Passwort für den SLAPD-Administrator (cn=admin,dc=example,dc=org)
  • Allow LDAPv2 protocol?
    Nein (außer es gibt einen Grund dafür)

Nach Abschluss dieser Basiskonfiguration wäre der LDAP-Server schon einsatzbereit. Allerdings möchte ich gleich von Anfang an Verschlüsselung bereitstellen, da der Server über das Internet erreichbar sein wird.

Konfiguration

TLS

Am Anfang stand das Zertifikat, so auch hier ;-) Zuerst der private Schlüssel:

openssl req -new -nodes -keyout slapd-key.pem -out slapd-key.pem -days 365

Der Certificate Signing Request ist in dieser Datei bereits enthalten. Dieser steht zwischen den Tags

-----BEGIN CERTIFICATE REQUEST-----
dummy
-----END CERTIFICATE REQUEST-----

und kann nun einer Zertifizierungsstelle übermittelt oder selbst signiert werden.

Die Selbst-Signierung ist die simpelste Methode, sollte allerdings nur für Testzwecke verwendet werden (siehe Eigenes SSL-Zertifikat erstellen)

openssl ca -policy policy_anything -out slapd-cert.pem -infiles slapd-key.pem

Ich lasse mir dieses Zertifikat von CACert erstellen und füge das Fertige in die Datei slapd-cert.pem ein. Als CA wird der Root PKI Key benötigt. Diesen speichert man sich z.B. als cacert.pem ab.

Diese 3 Dateien erstellt man am besten unter /etc/ldap/ssl (Pfade in slapd.conf müssen natürlich gleich sein):

/etc/ldap/ssl# ls
cacert.pem  slapd-cert.pem  slapd-key.pem

Nun editiert man die /etc/ldap/slapd.conf folgendermaßen (ziemlich am Anfang der Datei):

# Global Directives:
TLSCACertificateFile /etc/ldap/ssl/cacert.pem
TLSCertificateFile /etc/ldap/ssl/slapd-cert.pem
TLSCertificateKeyFile /etc/ldap/ssl/slapd-key.pem
 
# Anonymous-Login ist nicht erwünscht
disallow bind_anon

Zuletzt muss man den slapd noch anweisen, öffentlich nur TLS zu benutzen, und einen unverschlüsselten Zugang auf localhost erlauben. Dazu muss man nur folgende Zeile in /etc/default/slapd einkommentieren:

SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///"

Danach lauscht der Server auf 127.0.0.1:389 und 0.0.0.0:636 bzw. auch :::636 (IPv6). nach einem abschließenden

invoke-rc.d slapd restart

sollte sich der Dienst anstandslos neu starten lassen und auf die angeführten Ports hören.

Einrichtung

Das Erstellen der Verzeichnisstruktur und das Einspeisen der Daten könnte auch per LDIF-Datei erledigt werden, doch für Anfänger (und auch den Administrator) ist dies mühsam und aufwändig. Deshalb folgt hier die Einrichtung von Fernwartungstools (GUI-basiert) für LDAP.

phpLDAPadmin

Praktisch ist natürlich ein Web-Frontend wie phpLDAPadmin, welches ebenfalls in den meisten Repositories verfügbar sein sollte und sich somit per Paketmanager installieren lässt:

aptitude install phpldapadmin

Nach der Installation ist es theoretisch schon möglich, sich über http://example.org/phpldapadmin/ anmelden zu können. Allerdings kann man noch ein paar Feinheiten in /etc/phpldapadmin/config.php korrigieren (die entsprechenden Zeilen befinden sich unterhalb des ersten Kommentar-Blocks):

// Der "Name" des LDAP-Servers
$ldapservers->SetValue($i,'server','name','Example Inc.');
 
// Basis-DN, der bei der slapd-Installation benutzt wurde
$ldapservers->SetValue($i,'server','base',array('dc=example,dc=org'));
 
// Login-Feld wird automatisch mit diesen Daten befüllt
$ldapservers->SetValue($i,'login','dn','cn=admin,dc=example,dc=org');

Fertig.

Apache Directory Studio

Ein anderes großartige Tool zur Bearbeitung von Einträgen ist das Programm Apache Directory Studio, welches für Linux, Windows und Mac OS X verfügbar ist. Zum Download folgt man diesem Link und die Installation und Einrichtung ist auf der Herstellerseite ausreichend beschrieben (siehe Weblinks).

Das Adressbuch

Wenn der Server erst mal läuft, kann man sich mit der Befüllung des Verzeichnisbaumes befassen. Dazu meldet man sich per phpLDAPadmin über den Webbrowser an, mit folgenden Daten (ich empfehle, auch den Zugriff auf das Webinterface per HTTPS zur Verfügung zu stellen!):

LDAP-Benutzer

Wie bei einer Datenbank empfiehlt es sich auch bei einem Verzeichnisdienst einen Benutzer anzulegen, der nur auf einen gewissen Teilbaum (Subtree) zugreifen kann. Der Teilbaum ähnelt einer Tabelle bzw. eigenen Datenbank, auf die (außer vom Administrator) nur von einem gewissen Benutzer lesend bzw. schreibend zugegriffen werden darf. Dazu legt man auf dem frischen Server am besten eine neue OU (Organisation Unit) an, z.B. ou=people,dc=example,dc=org. In phpLDAPadmin klickt man auf die Domain (dc=example,dc=org) und wählt im rechten Menü Erzeuge einen Untereintrag. Nun erscheinen die Templates, hier wählt man Organisational Unit, vergibt einen Namen (in diesem Fall people) und schon hat man es :-) Nun (fast) das selbe mit der neuen OU, nur wählt man diesmal das Template Default und in der folgenden Liste inetOrgPerson und befüllt die Attribute folgendermaßen:

  • RDN: cn (cn)
  • cn: addressbookuser
  • sn: addressbookuser
  • userPassword: diverses neues Passwort

Nun hat man seinen neuen Benutzer cn=addressbookuser,ou=people,dc=example,dc=org samt Passwort. Abschließend müssen dem Benutzer noch die entsprechenden Rechte einräumen. Dazu editiert man die /etc/ldap/slapd.conf:

# 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
access to attrs=userPassword,shadowLastChange
        by dn="cn=admin,dc=example,dc=org" 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.
access to dn.base="" by * read
 
# Dieser Abschnitt ist neu und gewährt dem Benutzer
# cn=addressbookuser,ou=people,dc=example,dc=org Lese und Schreibrechte auf den Subtree
# ou=contacts,dc=example,dc=org welcher noch erstellt werden muss
access to dn.subtree="ou=contacts,dc=example,dc=org"
        by self write
        by dn="cn=addressbookuser,ou=people,dc=example,dc=org" write
        by * break
 
# Diese ACL muss entsprechend angepasst werden
# The admin dn has full write access, everyone else
# can read everything.
access to *
        by self write
        by dn="cn=admin,dc=example,dc=org" write
        by users read
        by * none

Adressbuch-Benutzer

Was jetzt noch fehlt, ist der Subtree, welcher die Objekte aufnimmt, die die Adressbuchkontakte repräsentieren. Dazu legt man folgende OU an: ou=contacts,dc=example,dc=org. Danach kann der erste Testkontakt angelegt werden. In diesem neuen Verzeichnis wählt man nun das Template Address Book Entry. Die Attribute sind selbsterklärend.

LDAP-Client einrichten

Mozilla Thunderbird

Im Thunderbird navigiert man nach dem Start von diesem zu dem Eintrag Extras → Einstellungen… → Verfassen → Adressieren, dort aktiviert man LDAP-Verzeichnisserver und wählt Bearbeiten….

Im folgenden Dialog geht man auf Hinzufügen und füllt diesen aus:

  • Name: Mein LDAP-Server
  • Server-Adresse: example.org
  • Basis-DN: ou=contacts,dc=example,dc=org
  • Port-Nummer: 636
  • Bind-DN: cn=addressbookuser,ou=people,dc=example,dc=org

Nachdem man alles bestätigt hat, kann man es testen, indem man eine neue Mail erstellt und die Autovervollständigung testet (dafür müssen natürlich entsprechende Einträge vorhanden sein) oder einfach das Adressbuch öffnet, den Namen des Servers wählen und im Suchfeld *.* eingeben.

Quellen

Kommentare