Das Linux-Verzeichnis LDAP

13.02.2006 von STEFAN RUBNER 
Microsoft hat es, Novell hat es, selbst OS/2 kann damit aufwarten – und Linux selbstverständlich auch. Die Rede ist von einem Verzeichnisdienst, der Informationen über Netzwerknutzer und -ressourcen, gemeinsam gepflegte Adressen und vieles mehr einfach abrufbar verwaltet.

Ein Verzeichnis muss nicht immer ein Ordner auf einer Festplatte sein. Vielmehr kann es sich bei einem Verzeichnis oder Directory auch um eine Art zentralen Katalog zur Verwaltung von Netzwerkinformationen handeln. Bei Microsoft nennt sich das dann Active Directory Services, bei Novell eDirectory und unter Linux sorgt OpenLDAP für die Bereitstellung der dazugehörigen Verzeichnisdienste.

OpenLDAP (www.openldap.org) vereinfacht Anwendern und Administratoren gleichermaßen die Arbeit. So lässt sich mit seiner Hilfe ein zentrale Verwaltung von Benutzerkonten ebenso realisieren wie ein firmenweites Adressverzeichnis. Dank fein granulierter Zugriffsrechte ist es kein Problem, den Zugang auf einzelne Bereiche der LDAP-Informationen zu beschränken oder Verwalter-Accounts für bestimmte Bereiche einzurichten. Vor allem wegen dieser Eigenschaften ist OpenLDAP in nahezu allen größeren Linux-Installationen im Einsatz.

Wie der Name OpenLDAP schon andeutet, handelt es sich um eine Open-Source-Implementierung des Leightweight Directory Access Protocols (LDAP). Dieses wiederum basiert auf dem X.500-Standard. Ein Verzeichnis selbst ist im Wesentlichen eine Datenbank. Im Gegensatz zu üblichen Datenbanken wie beispielsweise MySQL oder dem SQL Server von Microsoft sind Verzeichnisse jedoch vor allem auf Lesezugriffe hin optimiert. Das macht Sinn, da die bereitgestellten Daten zwar sehr häufig abgerufen, aber nur sehr selten geändert werden.

OpenLDAP-Installation

Ein Verzeichnis ist bei der Speicherung der Daten wesentlich restriktiver als eine SQL-Datenbank und gestattet nur die Ablage von Informationen, deren Datentyp und -format zuvor mit Hilfe eines so genannten Schemas festgelegt wurden. Die Daten selbst legt LDAP in einer Baumstruktur ab. Ausgehend von einer eindeutigen Wurzel – auch hier Root genannt – verzweigen einzelne Äste, an denen die Blätter – im LDAP-Jargon als Leaf Nodes bezeichnet – mit den Detailinformationen hängen. Jedes Blatt besitzt einen eindeutigen Bezeichner, den so genannten Distinguished Name (DN).

Das hört sich etwas kompliziert an, ist aber recht einfach, wie man am besten bei der Arbeit mit OpenLDAP feststellt. Aus diesem Grund zeigen wir die Eigenschaften und die Nutzung von OpenLDAP am „lebenden Objekt“. Dazu verwenden wir das frei erhältliche Enterprise Linux CentOS (www.centos.org), das im Wesentlichen dem Enterprise Linux von Red Hat entspricht. Aber auch jede andere Distribution eignet sich für die ersten Versuche mit LDAP.

Die Installation von OpenLDAP nehmen Sie am besten über den jeweiligen Paketmanager Ihrer Distribution vor. Bei CentOS findet sich dieser im Menü „Anwendungen“ unter dem Punkt „Systemeinstellungen“ als Option „Hinzufügen/Entfernen von Applikationen“. Sollten Sie nicht als Superuser angemeldet sein, werden Sie zunächst nach dem entsprechenden Root-Passwort gefragt, bevor die Anwendung startet.

Diese präsentiert Ihnen eine Reihe von Paketgruppen. OpenLDAP findet sich in der Gruppe „Netzwerk-Server“. Setzen Sie das Häkchen vor dem Eintrag „openldap-servers“ und klicken Sie anschließend auf die Schaltfläche „Schließen“, um zur Oberfläche des Paketmanagers zurückzukehren.

Hier ruft ein Klick auf die Schaltfläche „Aktualisieren“ die notwendigen Operationen zur Installation von OpenLDAP ab. Je nach Umfang der Grundinstallation von CentOS kann es dabei vorkommen, dass zusätzliche Pakete eingerichtet werden müssen. Quittieren Sie entsprechende Meldungen einfach durch einen Klick auf „Ok“ und warten Sie das Ende des Installationsvorgangs ab.

Erste Einstellungen

Mit dem Einrichten der Software ist es aber nicht getan. Bevor Sie OpenLDAP nutzen können, müssen Sie das System konfigurieren. Dazu dienen wie unter Linux üblich Textdateien, die sich in /etc/openldap befinden. Für die Einstellungen des Servers zeichnet slapd.conf verantwortlich. Um nun beispielsweise ein Verzeichnis für die Domain tecchannel.lab zu definieren, sind die bereits vorhandenen Einträge wie folgt abzuändern:

include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema

allow bind_v2

pidfile /var/run/slapd.pid
argsfile /var/run/slapd.args

database bdb
suffix „dc=tecchannel,dc=lab“
rootdn „cn=admin,dc=tecchannel,dc=lab“
rootpw geheim
directory /var/lib/ldap

index objectClass eq,pres
index ou,cn,mail,surname,givenname eq,pres,sub
index uidNumber,gidNumber,loginShell eq,pres
index uid,memberUid eq,pres,sub
index nisMapName,nisMapEntry eq,pres,sub

Eine kurze Erklärung der einzelnen Blöcke:

Zeilen 1-4: Hier wird festgelegt, welche Schemata die nachfolgend definierten LDAP-Verzeichnisse kennen. Auf diese Weise werden die verwendbaren Datentypen vorgegeben.

Zeile 6: Weist den Server an, auch solche Clients zu unterstützen, die das veraltete LDAP-Protokoll Version 2 verwenden. Dazu zählen unter anderem einige E-Mail-Clients für Windows.

Zeilen 8 und 9: Diese Anweisungen bestimmen, wo der LDAP-Server die entsprechenden Informationen über seine aktuelle Prozess-ID und die beim Aufruf verwendeten Parameter ablegt.

Zeile 11: Über die Backend-Anweisung legen Sie die von OpenLDAP zu verwendende Datenbank fest. Die Angabe von „bdb“ bewirkt die Nutzung der Berkeley Database, dem von den OpenLDAP-Entwicklern empfohlenen System.

Zeile 12: Über das Schlüsselwort suffix teilen Sie OpenLDAP mit, welche Wurzel es für Objekte verwenden soll, die nicht als vollständiger DN (Distinguished Name) angegeben wurden.

Zeile 13: Der hinter rootdn angegebene Wert bezeichnet den Administrations-Account zur Verwaltung der LDAP-Verzeichnisse.

Zeile 14: Das Schlüsselwort rootpw legt das zum Administrations-Account gehörende Passwort fest. Wie Sie sehen können, handelt es sich dabei um eine Klartextdarstellung. Wie Sie das Passwort in einem sichereren Format spezifizieren können, erfahren Sie im weiteren Verlauf des Beitrags.

Zeile 15: Hier geben Sie das Verzeichnis an, in dem OpenLDAP die diversen Datenbanken ablegt. Das Verzeichnis muss existieren, bevor der LDAP-Server gestartet wird, da dieser das Directory nicht selbst anlegt.

Zeilen 17-21: Mit Hilfe der Index-Funktion teilen Sie OpenLDAP mit, welche jeweiligen Inhalte des Verzeichnisses zum schnelleren Auffinden von Daten indiziert werden sollen.

Das Verzeichnis füllen

Theoretisch könnten Sie den Server nun starten – bringen würde das jedoch nicht viel, da noch keine Informationen im Verzeichnis enthalten sind. Zum Füttern der Verzeichnisdatenbank verwendet OpenLDAP ebenfalls Textdateien, die nach einem speziellen Muster aufgebaut sind. Das Format dieser so genannten LDIF-Dateien orientiert sich an der Struktur des LDAP-Baums.

Unser LDAP-Baum soll zunächst zwei Äste enthalten. Zum einen den Zweig „User“, der die Daten der lokalen Anwender aufnimmt und später auch zur Authentifizierung dienen kann. Zum anderen den Zweig „Adressen“, der gemeinsam genutzte Kontaktdaten für das Unternehmen enthält. Dazu erzeugen Sie zunächst die Datei base.ldif mit folgendem Inhalt:

dn: dc=tecchannel,dc=lab
dc: tecchann
objectclass: domain
objectclass: top
o: TecChannel Lab

dn: ou=Users,dc=tecchannel,dc=lab
objectclass: organizationalUnit
ou: Users
description: Lokale Anwender

dn: ou=Adressen,dc=tecchannel,dc=lab
objectclass: organizationalUnit
ou: Adressen
description: Adress-Verzeichnis

Um die so definierte Grundstruktur in das LDAP-Verzeichnis zu übernehmen, dient der Befehl ldapadd, der nach dem Start des Servers aufzurufen ist:

/etc/init.d/ldap start
ldapadd -x -D „cn=admin,dc=tecchannel,dc=lab“ -W -f base.ldif

Wenn alles geklappt hat, erfolgt keinerlei Ausgabe beziehungsweise Rückmeldung und Sie sehen wieder die Eingabeaufforderung der Linux-Kommandozeile.

Daten anlegen

Nun ist zwar schon die Struktur des Directorys angelegt, es fehlen aber noch die eigentlichen Daten, die es wirklich nutzbar machen. Um auch diese zu erzeugen, dient eine etwas umfangreichere LDIF-Datei, die zwei Einträge im Abschnitt „Users“ und einen Eintrag unter „Adressen“ erzeugt. Der Inhalt von eintraege.ldif sieht folgendermaßen aus:

dn: uid=stefan,ou=Users,dc=tecchannel,dc=lab
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
ou: Users
cn: Stefan Rubner
sn: Rubner
uid: stefan
l: München
mail: stefan@tecchannel.lab
telephonenumber: +49-89-123-456-789
userpassword: keines

dn: uid=mike,ou=Users,dc=tecchannel,dc=lab
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
ou: Users
cn: Mike Hartmann
sn: Hartmann
uid: mike
l: München
mail: mike@tecchannel.lab
telephonenumber: +49-89-987-654-321
userpassword: seines
dn: uid=hmuster,ou=Adressen,dc=tecchannel,dc=lab
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
ou: Adressen
cn: Hans Mustermann
sn: Mustermann
uid: hmuster
l: München
mail: hans@mustermann.de
telephonenumber: +49-89-987-654-321

Die Übernahme der Informationen erfolgt wiederum mit Hilfe von ldapadd.

LDAP-Daten abfragen

So weit, so gut. Aber wie fragt man nun die im LDAP-Verzeichnis enthaltenen Daten ab? Eine erste Möglichkeit dazu bietet das Hilfsprogramm ldapsearch. Sein Aufruf ähnelt dem von ldapadd:

ldapsearch -x -D "cn=admin,dc=tecchannel,cx=lab" -W "objectclass=*"

Dieser Aufruf listet Ihnen nach Eingabe des Admin-Passworts alle im LDAP-Verzeichnis enthaltenen Objekte auf. Wollen Sie nur die Einträge sehen, die zu einem User gehören, dann lautet der Befehl wie folgt:

ldapsearch -x -D "cn=admin,dc=tecchannel,cx=lab" –W "ou=User"

Sie sehen schon: besonders komfortabel ist das nicht und als sonderlich nützlich würde man es wohl auch nicht bezeichnen. Zum Glück besitzen viele E-Mail- und Groupware-Produkte eine LDAP-Schnittstelle, die einen deutlich benutzerfreundlicheren Zugang zu den Informationen erlaubt. Dazu zählt auch Evolution, der bei CentOS und auch SUSE Linux mitgelieferte Groupware-Client.

LDAP-Zugriff mit Evolution

Um diesen zur Zusammenarbeit mit dem gerade konfigurierten LDAP-Server zu bewegen, rufen Sie zunächst Evolution über das Briefumschlag-Icon aus der Menüleiste am oberen Bildschirmrand auf. Ist Evolution gestartet, wechseln Sie durch einen Klick auf „Kontakte“ zur Verwaltung der Adressen. Anschließend klicken Sie auf den nach unten zeigenden Pfeil neben der Schaltfläche „Neu“ und wählen aus dem daraufhin erscheinenden Menü den Punkt „Adressbuch“. Sie gelangen zu einer Eingabemaske, in die Sie die Zugangsdaten wie Anmeldename und -methode zum LDAP-Server eintragen beziehungsweise auswählen.

Dazu vergeben Sie zunächst einen Namen für das neue Adressbuch – zum Beispiel „TecChannel-Adressen“ – und tragen als Server „localhost“ ein. Den vorgegebenen Port 389 brauchen Sie nicht zu ändern. Als Anmeldenamen verwenden Sie den in slapd.conf eingetragenen Administrations-Account, die Anmeldemethode stellen Sie auf „Eindeutigen Namen (EN) verwenden“ ein. Wechseln Sie nun zum Reiter „Details“ und tragen hier in das Feld Suchbasis den Wert „ou=Adressen,dc=tecchannel,dc=lab“ ein.

Haben Sie die Daten durch einen Klick auf „Ok“ gesichert, sehen Sie neben der Adressbuchanzeige „Auf LDAP-Servern“ ein kleines Dreieck. Klicken Sie dieses an, erscheint das neu angelegte Adressbuch. Sobald Sie dieses auswählen, werden Sie nach dem entsprechenden Passwort für den Zugriff auf den LDAP-Server gefragt und landen dann in einer scheinbar leeren Adressliste. Ein Klick auf die Schaltfläche „Jetzt suchen“ lässt den zuvor angelegten Datensatz von Hans Mustermann erscheinen. Ein Doppelklick auf den Eintrag öffnet die Maske zum Bearbeiten von dessen Eigenschaften.

LDAP-Fähigkeiten erweitern

Spätestens beim Wechsel zum Reiter „Persönliche Informationen“ merken Sie schnell, dass sich bei weitem nicht alle von Evolution unterstützte Felder auch wirklich ausfüllen lassen.

Der Grund dafür ist, dass dem LDAP-Server die dazu notwendigen Schema-Informationen nicht zur Verfügung stehen. Um diesen Zustand zu ändern, tragen Sie folgende Zeilen in der slapd.conf ein:

include /usr/share/evolution-data-server-1.0/ evolutionperson.schema
schemacheck off

Starten Sie anschließend den LDAP-Server über den Befehl /etc/init.d/ldap restart neu. Wenn Sie nun Evolution starten, stehen Ihnen zusätzliche – aber immer noch nicht alle – Felder zur Bearbeitung zur Verfügung. Dass Sie diese auch speichern können, dafür sorgt die zweite Anweisung. Leider sind die Vorgaben im Evolution-Schema nicht immer so sauber erstellt, dass sie den normalerweise recht rigorosen Schema-Check von OpenLDAP überstehen. Erst das manuelle Abschalten der Tests schafft hier Abhilfe.

Den Zugriff regeln

Bislang haben wir für unsere Beispiele stets den Administrations-Account verwendet – und das aus gutem Grund: Jeder Versuch, mit einer anderen Kennung auf die Daten zuzugreifen, wäre mit hoher Wahrscheinlichkeit fehlgeschlagen. Es fehlen nämlich noch die Zugriffsrechte in der slapd.conf.

Dabei müssen Sie beachten, dass die Reihenfolge der Rechtedefinitionen von entscheidender Bedeutung ist. Sie müssen stets vom Feinen zum Groben sortiert in der Konfigurationsdatei stehen, da die erste zutreffende Regel verwendet wird. Dies gilt sowohl für die Bereiche, auf die der Zugriff erfolgen soll, wie auch für die unterschiedlichen Benutzergruppen, die Zugriff erhalten sollen. Ein Beispiel verdeutlicht das:

access to dn.children=“ou=Adressen,dc=tecchannel,dc=lab“
by users write
by * read

access to dn.children=“ou=Users,dc=tecchannel,dc=lab“
by self write
by users read
by * auth

access to *
by * search

Über diese Definitionen legen Sie fest, dass authentifizierte Nutzer („users“) Einträge im Bereich „Adressen“ nicht nur abrufen, sondern auch ändern dürfen. Alle anderen – auch anonyme – Anwender, dürfen die Daten aus diesem Bereich lesen. Etwas eingeschränkter stellt sich die Situation für die im Zweig „Users“ abgelegten Daten dar. Hier hat nur der Besitzer („self“) selbst Schreibzugriff, während authentifizierte Nutzer nur noch Leserecht haben. Anonyme Anwender können sich mit Hilfe der Daten im Bereich „Users“ authentifizieren. Für die restlichen Bereiche gilt für alle Anwender lediglich das Recht, diese zu durchsuchen.

Es fällt nicht schwer, sich vorzustellen, wie komplex entsprechende Setups bei umfangreicheren Verzeichnissen werden können. Achten Sie daher stets darauf, dass alles so funktioniert, wie Sie es sich vorgestellt haben und testen Sie neue Einstellungen ausgiebig, bevor Sie diese in ein Produktivsystem übernehmen. (ala)