Der Verzeichnisdienst ldap

Mit dem so genannten Verzeichnisdienst LDAP (Lightweight Directory Access Protocoll) können Informationen in einer baumartigen Struktur gespeichert, verwaltet und vor allem auch in standardisierter Weise wieder abgerufen werden.

Durch das hohe Maß an Strukturierung bieten viele andere Dienste und Programme die Nutzung von LDAP an, so dass sich auf diese Weise beispielsweise Adressbücher, Account-Informationen, Anmelde-Daten usw. zentral verwalten lassen.

  • Die Anmeldung von Benutzern an einem Rechner oder in einem Netzwerksystem kann (via PAM) mittels LDAP erfolgen.
  • Dienste wie SAMBA oder Anwendungen wie Django bieten bei entsprechender Konfiguration auch eine Benutzer-Authentifizierung via LDAP anstelle einer Passworteingabe.

LDAP kann ebenso lokal wie über das Netzwerk genutzt werden; zwischen den Clients und dem LDAP-Server muss lediglich eine TCP/IP-Verbindung aufgebaut werden können; auf dem eigenen PC kann localhost als „Ziel“ genutzt werden.

Installation

Um LDAP zu installieren, müssen folgende Pakete installiert werden:

sudo aptitude install slapd ldap-utils ldapscripts

Mit diesen beiden Paketen wird sowohl der „Standalone“ LDAP-Server installiert, als auch Client-Programme, die auf diesen zugreifen. Mit „Standalone“ ist gemeint, dass diese Implementierung ohne externe Datenbank-Programme auskommt – sie nutzt stattdessen binäre .bdb-Dateien („Berkeley Database“) beziehungsweise bei modernen Versionen .mdb-Dateien („Memory-Mapped Database“).

Bei der Installation erscheint ein Dialog-Feld, um ein Passwort für den Administrator-Benutzer einzugeben. Optional kann das Dialog-Feld auch zu jedem späteren Zeitpunkt mittels dpkg-reconfigure -plow slapd erneut gestartet werden.

Der LDAP-Server slapd wird anschließend automatisch gestartet, wobei der Dienst unter dem Benutzer- und Gruppennamen openldap läuft.

Veraltet: Statische Konfiguration

Lange war es üblich, LDAP über die Konfigurationsdatei /etc/ldap/slapd.conf zu konfigurieren (beispielsweise bis inklusive Debian 8). Für Einsteiger ist diese Variante wohl weniger gewöhnungsbedürftig als die moderne dynamische Konfiguration, die ab Debian 9 sowie bei Ubuntu/LinuxMint zum Einsatz kommt. In künftigen Versionen wird diese „statische“ Form der Konfiguration jedoch gemäß der OpenLDAP-Webseite womöglich nicht mehr unterstützt. Jede statische Konfiguration kann jedoch ohne großen Aufwand in eine entsprechende dynamische Konfiguration umgewandelt werden (siehe hier).

Entscheidet man sich zunächst für eine Konfiguration mittels der Konfigurations-Datei /etc/ldap/slapd.conf, so muss zunächst folgender Eintrag in der Datei /etc/default/slapd angepasst werden:

# Datei: /etc/default/slapd
SLAPD_CONF=/etc/ldap/slapd.conf

Zudem muss der LDAP-Server slapd gestoppt werden:

# LDAP-Server stoppen:
sudo systemctl stop slapd

Die Datei /etc/ldap/slapd.conf existiert bei vielen neuen Linux-Distributionen standardmäßig nicht. Man kann allerdings eine Vorlage-Datei dorthin kopieren und anpassen:

# Beispiel-Datei kopieren:
sudo cp /usr/share/doc/slapd/examples/slapd.conf /etc/ldap

Eine eigene Variante dieser Datei kann hier als Beispiel heruntergeladen werden. Entscheidend gegenüber der Vorlage aus dem /usr-Verzeichnis sind folgende Änderungen:

  • Die Backend-Datenbank muss festgelegt werden: An allen Stellen, die in der offiziellen Beispiel-Datei mit dem Platzhalter @BACKEND@ versehen sind, sollte dieser Eintrag durch mdb ersetzt werden.

  • Für die Variable loglevel ist der Wert 256 empfohlen (siehe man slapd.conf(5)).

  • Das „Suffix“, also der Basis-Pfad, auf den sich jedes spätere Objekt bezieht, muss ebenfalls festgelegt werden: An allen Stellen, die mit dem Platzhalter @SUFFIX@ versehen sind, muss dieser Eintrag durch den Domain-Namen ersetzt werden (beispielsweise dc=example-one, dc=de, wie im Abschnitt Grundlegende Konzepte näher beschrieben).

  • Die mit @ADMIN@ gekennzeichneten Stellen müssen durch einen Eintrag der Art cn=admin, dc=example-one, dc=de ersetzt werden. Das Kommentar-Zeichen vor dem Eintrag rootdn muss entfernt werden.

  • Das Passwort für den Admin-Benutzer muss gesetzt werden. Dies wird allerdings nicht im Klartext in der Datei hinterlegt, sondern muss mittels folgender Anweisung in einen zum Passwort gehörenden Hash-Wert verwandelt werden:

    # Passwort-Hash generieren:
    slappasswd
    

    Anschließend muss das gewünschte Passwort zweimal eingegeben werden. Der resultierende Hash-Wert muss als neuer Eintrag für rootpw (am besten im Anschluss an den rootdn-Eintrag) eingefügt werden. Damit sehen die Einträge etwa folgendermaßen aus:

    database    mdb
    
    suffix      "dc=example-one, dc=de"
    rootdn      "cn=admin, dc=example-one, dc=de"
    rootpw      {SSHA}7kACyCfp/vAc4i6vqjmIpgQqbCmgIdHc
    

Schließlich müssen noch alle bereits existierenden Datenbanken sowie bisherigen Config-Einträge gelöscht werden. Dies ist mittels der folgenden Anweisungen möglich:

# Bestehende Datenbanken löschen:
sudo rm /var/lib/ldap/[^D]*

# Bestehende Konfigurationen löschen:
sudo rm -r /etc/ldap/slapd.d/*

Nun kann der LDAP-Server neu gestartet werden:

# LDAP-Server starten:
sudo systemctl start slapd

Der LDAP-Server ist damit einsatzbereit.

Konvertierung von slapd.conf auf slapd.d

Wurde LDAP zunächst mittels der Konfigurationsdatei /etc/ldap/slapd.conf statisch konfiguriert, so muss in der Datei /etc/default/slapd für die Variable SLAPD_CONF=/etc/ldap/slapd.d gesetzt werden. Falls das Verzeichnis /etc/ldap/slapd.d bereits existiert und Dateien enthält, sollten diese in ein Backup-Verzeichnis verschoben werden. Anschließend kann man den LDAP-Server stoppen und folgende Anweisungen aufrufen:

# LDAP-Server stoppen:
sudo systemctl stop slapd

# Konfigurationen übernehmen:
cd /etc/ldap
sudo slaptest -f slapd.conf -F slapd.d

Ruft man slaptest mit nur einer der Optionen -f datei oder -F verzeichnis auf, so wird die aktuelle Konfiguration des LDAP-Servers getestet. Mit einer zusätzlichen Option -v („verbose“) erfolgt eine ausführliche Ausgabe der Test-Ergebnisse. Gibt man allerdings beide Optionen -f und -F gemeinsam an, so ändert slaptest die Konfigurationsdatei in ein Konfigurations-Verzeichnis um.

Die bestehenden Einstellungen aus der Datei slapd.conf werden also übernommen und in LDIF-Dateien neu im Konfigurations-Verzeichnis abgelegt. Anschließend sollte noch die Original-Datei umbenannt werden, da sie ansonsten bei einem Neustart des LDAP-Servers ebenfalls geladen würde:

# Conf-Datei umbenennen:
sudo mv slapd.conf slapd.conf.backup

Zudem muss sichergestellt werden, dass der LDAP-Server Zugriff auf die neu erstellten Dateien hat:

# Datei-Rechte setzen:
sudo chown -R openldap:openldap slapd.d

Anschließend kann der LDAP-Server erneut gestartet werden:

# LDAP-Server starten:
sudo systemctl start slapd

Diese Variante funktioniert nicht nur mit einem neu eingerichteten LDAP-System, sondern auch mit bereits bestehenden Einträgen.

Aktuell: Dynamische Konfiguration

Der Vorteil der modernen Konfigurations-Variante, bei der die Einstellungen als LDIF -Dateien im Verzeichnis /etc/ldap/slapd.d ablegt werden, liegt unter anderem darin, dass spätere Änderungen ohne einen Neustart des LDAP-Dienstes erfolgen können. Dies ist insbesondere nützlich, wenn es zu Hochverfügbarkeits-Zwecken mehrere synchronisierte LDAP-Server im Netz geben soll.

Bei der dynamischen Konfiguration werden die Einstellungen als eigenständiger LDAP-Tree mit dem Basis-Eintrag cn=config gespeichert. Auf diese Informationen hat der root-Benutzer des Linux-Systems standardmäßig vollen Zugriff. Wurde LDAP zunächst statisch konfiguriert, so werden bei der Konvertierung für den dabei eingerichteten Admin-Benutzer automatisch Zugriffsrechte gesetzt.

Im Fall einer Neu-Installation empfiehlt es sich, den Server-Dienst slapd folgendermaßen neu zu konfigurieren:

# LDAP-Server neu konfigurieren:
sudo dpkg-reconfigure slapd

Hierdurch erscheint ein Frage-Dialog. Bei der ersten Frage geht es darum, ob eine weitere Konfiguration ausgelassen werden soll, was man für weitere Konfigurationen mit Nein beantworten muss:

../_images/slapd-conf-1.png

Anschließend wird der Basis-Pfad des LDAP-Trees angegeben. Standardmäßig lautet dieser nodomain, er sollte allerdings auf einen Eintrag wie dc=example-one,dc=de o.ä. geändert werden:

../_images/slapd-conf-2.png

Der Organisations-Name sollte aus Kompatibilitätsgründen, abgesehen von der Domain-Endung, mit dem Domain-Namen identisch sein:

../_images/slapd-conf-3.png

Nach einer Abfrage für das Passwort des Administrator-Benutzers admin soll ausgewählt werden, welche Art von Datenbank für die Einträge genutzt werden soll. Hierbei wird mdb offiziell empfohlen.

../_images/slapd-conf-4.png

Auch bei den letzten drei Fragen können guten Gewissens die Standard-Werte beibehalten werden: Wenn slapd entfernt werden sollte, soll die Datenbank weiterhin gespeichert bleiben:

../_images/slapd-conf-5.png

Bereits bestehende Datenbanken, die allgemein im Verzeichnis /var/lib/ldap abgelegt werden, sollen umgesiedelt werden:

../_images/slapd-conf-6.png

Schließlich wird gefragt, ob auch das veraltete Protokoll LDAPv2 noch unterstützt werden soll. Bei Neu-Installationen ist dies nicht nötig:

../_images/slapd-conf-7.png

Damit ist die dynamische Konfiguration des LDAP-Servers bezüglich der Haupt-Domain abgeschlossen. Im Verzeichnis /etc/ldap/slapd.d befindet sich nun eine „Master“-Datei cn=config.ldif sowie ein Verzeichnis cn=config mit weiteren Konfigurations-Dateien im LDIF-Format. Die einzelnen dort abgelegten Informationen haben grundsätzlich die gleichen Bezeichnungen wie bei einer statischen Konfiguration; es wird lediglich stets ein olc (für „OpenLDAP-Configuration“) vorangestellt.

Einrichtung eines Admin-Benutzers für cn=conf

Auf den LDAP-Server kann man nicht nur lokal, sondern auch über das Netzwerk zugreifen. Läuft der Server ohne graphische Bedienoberfläche (X-Server), so kann diese Variante genutzt werden, um mit einem graphischen LDAP-Bedienwerkzeug wie JXplorer auf die Datenbank zugreifen zu können. Um dabei ebenso Einstellungen an der (dynamischen) Konfiguration vornehmen zu können, ist es sinnvoll, auch für den Bereich cn=config einen admin-Benutzer einzurichten.

Hierfür gibt man zunächst folgende Anweisung auf dem Server ein:

# Passwort-Hash generieren:
slappasswd

Nach einer doppelten Eingabe eines Passworts wird ein zugehöriger Hash-Wert als Ergebnis zurückgegeben, beispielsweise {SSHA}o1cb7UCd6Pql7q3HB6+nvTZZ1OJOsJWV für das Passwort geheim. Diesen kopiert man in die Zwischenablage und fügt ihn an der entsprechenden Stelle in einer neu anzulegenden Datei /etc/ldap/db.ldif ein:

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootDN
olcRootDN: cn=admin,cn=config
-
add: olcRootPW
olcRootPW: {SSHA}o1cb7UCd6Pql7q3HB6+nvTZZ1OJOsJWV

Mit einer Anmeldung als cn=admin,cn=config kann man künftig Änderungen an den Einstellungen vornehmen (auch ohne SuperUser-Rechte auf dem LDAP-Server).

Konfiguration der LDAP-Clients

Zusätzlich können über die Datei /etc/ldap/ldap.conf weitere Einstellungen für die LDAP-Clients angegeben werden. Damit sind beispielsweise Programme wie ldapadd, ldapsearch oder ldapmodify gemeint, mit denen letztlich auf die LDAP-Datenbank zugegriffen wird. Standardmäßig befindet sich in dieser Datei ein Pfad für ein zu verwendendes TLS-Zertifikat. Zudem können beispielsweise folgende Einträge vorgenommen werden, um künftig Tipp-Arbeit zu sparen:

BASE     dc=example-one,dc=de
URI      ldap://ldap.example-one.de ldap://localhost

Werden mehrere URIs angegeben, so wird automatisch die erste ansprechbare Server-Adresse genutzt. Die Angaben können bei Verwendung von ldapsearch, ldapmodify usw. auch explizit neu gesetzt werden. Um zu testen, ob LDAP erfolgreich eingerichtet wurde, kann man nun folgendes eingeben:

# LDAP-Einrichtung testen:
ldapsearch -x -LLL

Damit werden alle bestehenden Einträge der Haupt-Domain aufgelistet. Nach einer neuen Installation existiert einerseits der Basis-Pfad dc=example-one,dc=de, als auch ein Eintrag dc=admin,dc=example-one,dc=net für den Admin-Benutzer. Insgesamt werden in diesem Fall also zwei Einträge aufgelistet.

Eine ausführliche Beschreibungen zu den einzelnen Attributen für den LDAP-Server gibt erhält man mittels man slapd.conf beziehungsweise man ldap.conf. In der offiziellen LDAP-Dokumentation ist die Einrichtung hier beschrieben.

Grundlegende Konzepte

Alle in LDAP gespeicherten Informationen werden als Objekte angesehen, die jeweils bestimmte Attribute aufweisen.

Unterschieden wird häufig zwischen Container- und Blatt-Objekten: Erstere enthalten üblicherweise weitere Objekte, und stehen daher im Informations-Baum tendenziell im „Inneren“. Blatt-Objekte hingegen, die sich „außen“ beziehungsweise am Ende des Informations-Baums befinden, sind als eigentliche Speicherstellen für Informationen gedacht.

Jedes Objekt muss im Informations-Baum, der üblicherweise mit DIT („Directory Information Tree“) abgekürzt wird, einen klar festgelegten Platz haben. Dies erfordert Sorgsamkeit und etwas zusätzlichen Aufwand bei der Ablage der Informationen, macht dafür allerdings das Suchen umso einfacher und ermöglicht folglich anderen Diensten beziehungsweise Anwendungen einen schnellen Zugriff auf die gespeicherten Informationen.

Jedes Objekt im DIT hat eine eindeutige Bezeichnung, die „Distinguished Name“ beziehungsweise dn genannt wird. Der wichtigste dn ist der Name des Ausgangs-Objekts, der oftmals auch „Wurzel“ oder „Basis-Pfad“ des Baumes genannt wird. Dieser erste Eintrag eines DIT wird oftmals in Anlehnung an einen Firmen- oder Domain-Namen vergeben. Für die Domain example-one.de könnte dieser erste Eintrag im DIT also folgendermaßen aussehen:

# Basis-Eintrag:
dn: dc=example-one,dc=de

Dieser Eintrag bezeichnet ein Objekt, das über die mit dc bezeichneten Domain-Komponenten example-one und de eindeutig definiert ist. Diese Variante, einen Domain-Namen als „Basis-Pfad“ zu wählen, wird bevorzugt gewählt, weil auf diese Weise Einträge ähnlich wie bei einem DNS-System abgefragt werden können.

Informationen über die Mitwirkenden können mittels weiteren Untergliederungen abgelegt werden, beispielsweise in mit ou bezeichneten „Organizational Units“. Die Kategorie „Mitwirkende“ hätte für das obige Beispiel dann dn: ou=mitwirkende, dc=example-one, cd=de als eindeutige Bezeichnung.

Die Abkürzungen dn, dc, ou, usw. sind nicht zufällig gewählt: Informationen können in LDAP allgemein nur über Objekt-Klassen gespeichert werden, die klar definiert sind. Die einzelnen Objekt-Klassen und ihre Attribute sind in so genannten „Schema“-Dateien festgelegt. Bei der Standard-Installation von LDAP werden automatisch einige solcher Schema-Dateien mit den am häufigsten verwendeten Objekt-Klassen und Attributen im Verzeichnis /etc/ldap/schema abgelegt.

Beim Einbinden zusätzlicher Schema-Dateien muss die Reihenfolge beachtet werden: Soll bei einer neuen Definition auf eine bestehende Objektklasse oder ein bereits anderweitig definiertes Attribut zurückgegriffen werden, so muss dieses bereits bekannt beziehungsweise eingebunden worden sein. Die allgemeinen Schema-Dateien müssen somit zuerst eingebunden werden.

Einige wichtige Objekt-Klassen (aus der Datei /etc/ldap/schema/core.schema) sind beispielsweise:

dn („Distinguished Name“) Eindeutiger Name im Informations-Baum
dc („Domain Component“) Teil eines Domain-Namens
c („Country“) Länder-Abkürzung (DE für Deutschland, US für Amerika, usw.)
o („Organization“) Organisation (Teil des Baumes)
ou („Organizational Unit“) Abteilung einer Organisation
cn („Common Name“) Allgemeiner Name, beispielsweise einer Person
uid („User-ID“) Benutzer-Kennung

Jeder Eintrag in einem DIT hat nicht nur einen dn, sondern auch weitere Attribute; insbesondere hat jeder Eintrag (mindestens) ein objectClass-Attribut, mit dem die Objekt-Klasse des Eintrags festgelegt wird. Je nach Objektklasse können oder müssen auch noch weitere Attribute angegeben werden.[1]

LDIF-Dateien

Sollen Informationen in eine LDAP-Datenbank aufgenommen werden, so werden diese üblicherweise in eine Datei mit der Endung .ldif geschrieben. Mittels der Anweisung ldapadd können die so hinterlegten Informationen dann in die (binäre) Datenbank übernommen werden.

Eine LDIF-Datei für die ersten Datenbank-Einträge könnte etwa so aussehen:

# Datei: neu.ldif

# Erster Eintrag (Basis-Pfad):
# Nach einer dynamischen Konfiguration existiert
# dieser Eintrag bereits!
dn: dc=example-one, dc=de
objectClass: dcObject
objectClass: domain
dc: example-one

# Zweiter Eintrag:
dn: ou=mitwirkende, dc=example-one, dc=de
objectClass: organizationalUnit
objectClass: top
ou: themen

Mit dieser Datei soll der Basispfad sowie ein erstes „Unterverzeichnis“ angelegt werden. In den Zeilen, die an die dn-Definition anschließen, wird das mit dem Eintrag verbundene Objekt genauer durch einzelne Attribute präzisiert. Eine Redundanz der angegebenen Informationen ist leider unvermeidbar: Beispielsweise ist ou=mitwirkende sowohl Teil der eindeutigen Pfadangabe, andererseits muss aufgrund der festgelegten Objektklasse organizationalUnit auch ein Attribut namens ou angegeben werden. Diese formale Struktur macht die Eingabe aufwändiger, den Zugriff hingegen effizienter: LDAP ist nicht für schnell wechselnde Daten ausgelegt, sondern für sich nur selten ändernde („statische“) Informationen und dafür hohe Zugriffszahlen.

Jede Zeile eines Eintrags stellt ein attribut: wert-Paar dar, wobei je nach Attribut nur ein einzelner Wert oder auch Werte-Listen erlaubt sind. Genügt eine einzelne Zeile nicht zur Angabe eines Wertes beziehungsweise mehrerer durch Komma-Zeichen getrennter Werte, so kann auch die folgende Zeile genutzt werden, sofern diese eingerückt wird (also mit einem oder mehreren Leerzeichen beginnt). Verschiedene Einträge werden in LDIF-Dateien jeweils durch eine leere Zeile getrennt.

ldapadd

Die Einträge aus einer .ldif-Datei können mittels der Anweisung ldapadd in die Datenbank aufgenommen werden. Für das obige Beispiel würde die Anweisung etwa folgendermaßen aussehen:

# Einträge aus LDIF-Datei aufnehmen:
ldapadd -x -D 'cn=admin,dc=example-one,dc=de' -W -f neu.ldif

Die einzelnen Optionen haben folgende Bedeutungen:

  • Die Option -x bewirkt, dass keine Authentifizierung via SASL durchgeführt werden soll.

  • Mit -D wird der Benutzer angegeben, mit dem die Anweisung aufgeführt werden soll.

  • Mit -W wird explizit nach einem Passwort gefragt.

    Anstelle -W kann auch die Option -w passwort genutzt werden, mit der allerdings das Passwort im Klartext in der History ~/.bash_history beziehungsweise ~/.zsh_history der Shell gespeichert wird.

  • Mit -f wird der Name der LDIF-Datei angegeben, die eingelesen werden soll.

Weitere nützliche Optionen für ldapadd sind:

  • Mit -c werden mögliche auftretende Fehler beim Einlesen von Einträgen der LDIF-Datei zwar angezeigt, die Bearbeitung wird jedoch fortgesetzt.
  • Mit -S dateiname werden die Einträge, die beim Einlesen Fehler verursacht haben und somit übersprungen wurden, in die angegebene Datei geschrieben. Diese Option wird meist zusammen mit der Option -c eingesetzt.
  • Mit -h kann der Hostname beziehungsweise die Adresse eines Rechners angegeben werden, auf dem der LDAP-Server läuft. Ohne explizite Angabe dieser Option wird localhost verwendet.
  • Mit -Z wird versucht, eine mit TLS gesicherte Verbindung zum mit der Option -h angegebenen Zielrechner aufzubauen. Mit -ZZ wird TLS erzwungen.

Die Programme ldapadd sowie ldapsearch sind als Client-Programme anzusehen, die auf den LDAP-Server zugreifen, um dort Daten hinzuzufügen oder um Daten abzufragen.

ldapsearch

Mit ldapsearch kann man im DIT nach Objekten suchen, deren Attribute mit dem angegebenen Suchmuster übereinstimmen. Eine Suche nach allen Einträgen, die bisher im DIT festgelegt wurden, kann folgendermaßen aussehen:

# Alle Einträge auflisten:
ldapsearch -x  -LLL -b 'dc=example-one,dc=de' '(objectclass=*)'

Die Optionen -x, -h, -D und -W haben für ldapsearch die gleiche Bedeutung wie für ldapadd. Weitere wichtige Optionen sind:

  • Mit -L werden die Ergebnisse im LDIF-Format ausgegeben,
    Mit -LL werden Kommentare ausgeblendet,
    Mit -LLL werden auch Angaben zur LDIF-Version ausgeblendet, also nur die
    Suchergebnisse angezeigt
  • Mit -b pfad („base“) wird der Startpunkt der Suche angegeben. Ist in der Konfigurations-Datei /etc/ldap/ldap.conf ein BASE-Eintrag angegeben, so kann diese Option entfallen, um die Suche von diesem Standard-Pfad aus beginnen zu lassen.

  • Mit -s („scope“) wird die Suchtiefe angegeben:

    -s sub durchsucht sämtliche untergeordneten Einträge (Standard),
    -s one durchsucht den mit -b angegebenen dn sowie die unmittelbar darunter liegende Ebene des DIT,
    -s base durchsucht nur den mit -b angegebenen dn.

Der eigentliche Suchausdruck, der in runden Klammern und ohne vorangehendes Options-Kürzel angegeben wird, sollte wegen der besonderen Bedeutung von Klammern und Wildcards in der Shell prinzipiell in doppelte oder einfache Anführungszeichen gesetzt werden.

Die Klammern um das Suchkriterium sind üblich, da sich damit auch mehrere Suchmuster kombinieren lassen:

  • Mit (&(bedingung1)(bedingung2)) werden alle Einträge aufgelistet, die beide – oder gegebenenfalls auch mehrere – Bedingungen erfüllen (logisches UND). Das Und-Zeichen verknüpft also alle Bedingungen, die sich innerhalb der äußersten runden Klammern befinden.
  • Mit (|(bedingung1)(bedingung2)) werden alle Einträge aufgelistet, die zumindest eine der angegebenen Bedingungen erfüllen (logisches ODER). Auch hier können optional mehrere Bedingungen angegeben werden.
  • Mit (!(bedingung)) wird die unmittelbar folgende Bedingung negiert (logisches NICHT). Der Nicht-Operator ! hat eine höhere Priorität als die beiden oberen Operatoren, und wird damit zuerst ausgewertet.

Der wohl häufigste Bedingungs-Typ ist der Wertevergleich, der mittels der Syntax (attribut=wert) geprüft wird. Als Wert kann sowohl eine Zeichenkette als auch eine Zahl angegeben werden. Sofern es sich bei der Zeichenkette um ein einzelnes Wort handelt, können die Anführungszeichen entfallen; falls ein Leerzeichen in der Zeichenkette vorkommt, so müssen hingegen Anführungszeichen gesetzt werden.

Zusätzlich zum gewöhnlichen Wertevergleich kann mit (attribut~=wert) geprüft werden, ob der Wert bei einer ungenauen Suche mit dem tatsächlichen Wert übereinstimmt (beispielsweise würde eine Abfrage der Art (cn~=Mair) auch Ergebnisse für „Maier“ liefern). Bei numerischen Werten kann auch mit (attribut>=wert) beziehungsweise (attribut<=wert) ein Größer/Kleiner-Vergleich durchgeführt werden.

Ähnlich wie in der Shell kann man bei einer LDAP-Suche auch so genannte „Wildcards“ nutzen. Das wichtigste Zeichen dabei ist *, das als „Joker-Zeichen“ für ein oder beliebig viele Zeichen gesetzt werden kann. So kann beispielsweise mit (cn=Ma*) nach allen Einträgen gesucht werden, deren Common Name mit Ma beginnt.

ldapmodify

Mit ldapmodify kann man die Attribute von Objekten im DIT abändern.

# Attribut zu Eintrag hinzufügen:
dn: ou=mitwirkende, dc=example-one, dc=de
add: description
description: "Eine Beschreibung für diese Gruppe."
-
add: seeAlso
seeAlso: Siehe README.txt

Auch hier können mit gewohnter LDIF-Syntax Änderungen an mehreren Einträgen auf einmal vorgenommen werden, indem diese durch leere Zeilen getrennt werden. Sollen wie im obigen Beispiel mehrere Änderungen an einen einzelnen Eintrag durchgeführt werden, so werden die einzelnen Änderungen durch eine Zeile mit einem einzelnen --Zeichen getrennt.

Neben der Änderungs-Anweisung add kann auch mittels replace der Wert eines bereits existierenden Attributs geändert werden; mittels delete können existierende Attribute wieder entfernt werden. Die Änderungen können wahlweise interaktiv eingegeben werden, oder in eine LDIF-Datei geschrieben und mit der Option -f dateiname an ldapmodify übergeben werden.

Mit ldapdelete können ganze Einträge wieder aus dem DIT entfernt werden.

slapcat und slapadd

Mittels slapcat können die Einträge eines LDAP-Trees wiederum als gewöhnlicher Text im LDIF-Format ausgegeben werden.

Ruft man slapcat mit der Option -n 1 auf, so wird nur der DIT mit der Nummer 1 ausgegeben. Man kann die Option -n auch nutzen, um zu prüfen, wie viele DITs überhaupt existieren. Gibt man beispielsweise slapcat -n 100 an, so erhält man eine Fehlermeldung, dass die angegebene Zahl außerhalb des erlaubten Zahlenbereichs ist. Da dieser jedoch explizit angegeben wird (beispielsweise range 0 to 1), weiß man damit automatisch, wie viele DITs existieren. Der DIT mit der Nummer 0 entspricht bei einer dynamischen Konfiguration dem DIT cn=config.

# Einträge des DIT Nr. 1 ausgeben:
slapcat -n 1

Die Ausgabe von slapcat erfolgt gewöhnlich auf dem Bildschirm, kann allerdings auch mittels des Shell-Operators > in eine Textdatei umgeleitet werden. Auf diese Weise lassen sich einfach Backups der LDAP-Einträge erstellen:

# Backup des DIT Nr. 1 erstellen:
slapcat -n 1 > dit-1-backup.ldif

Sinnvollerweise kann slapcat nur mit SuperUser-Rechten aufgerufen werden. Da ein DIT normalerweise wichtige Daten enthält, sollte man darauf, dass die Backup-Datei an einem sicheren Ort abgelegt wird und nur die nötigsten Benutzerrechte hat.

Um einen Backup wieder einzuspielen, kann man slapadd verwenden. Bei dieser Anweisung wird mit der Option -n wird wiederum die Nummer des Ziel-DIT angegeben, die mit der beim Aufruf von slapcat verwendeten Nummer übereinstimmen sollte. Mit der Option -F /etc/ldap/slapd.d kann das Zielverzeichnis explizit angegeben werden. Schließlich wird mittels der Option -l ldif-Datei die Backup-Datei angegeben.

# LDAP-Server stoppen:
systemctl stop slapd

# DIT Nr. 1 wiederherstellen:
slapadd -n 1 -F /etc/ldap/slapd.d -l dit-1-backup.ldif

Zudem muss mit chown -R openldap:openldap wiederum sichergestellt werden, dass die wiederhergestellten Daten vom LDAP-Server gelesen werden können. Anschließend kann der LDAP-Server wieder gestartet werden:

# LDAP-Server starten:
systemctl start slapd

LDAP-Programme mit graphischer Bedienoberfläche

Es gibt mehrere Client-Programme mit einer graphischen Bedienoberfläche, die eine Bearbeitung einzelner LDAP-Einträge einfacher machen können. Sollen Einträge massenweise hinzugefügt oder verändert werden, wird man um LDIF-Dateien und die grundlegenden Anweisungen wie ldapadd oder ldapmodify nicht umhin kommen.

Jxplorer

Persönlich habe ich mit dem GUI-Programm jxplorer schnell gute Erfahrungen machen können, was die Übersicht über LDAP-Einträge, das Hinzufügen neuer Einträge oder das Ändern bestehender Einträge anbelangt. Das Programm kann über das gleichnamige Pakete via aptitude installiert werden:

sudo aptitude install jxplorer

Startet man das Programm, so muss man sich zunächst eine Verbindung zu einem LDAP-Tree herstellen. Hierzu muss der Hostname beziehungsweise die URI des LDAP-Servers angegeben werden (localhost, wenn es sich um den eigenen Rechner handelt), sowie der Basis-Eintrag des LDAP-Trees (beispielsweise dc=example-one,dc=net. Wahlweise kann man sich anonym oder als Benutzer mit einem anzugebenden Passwort anmelden (beispielsweise als cn=admin,dc=example-one,dc=net). Die Angaben für den Anmelde-Vorgang kann man optional unter einem Profil-Namen abspeichern, um sie künftig nicht erneut eingeben zu müssen.

Apache Directory Studio

Eine gute Alternative zum JXplorer ist das Apache Directory Studio <https://directory.apache.org/studio>. Dieses GUI-Programm ist nicht in den normalen Paketquellen zu finden, sondern muss von der Homepage <https://directory.apache.org/studio/download/download-linux.html> als TAR-Archiv heruntergeladen werden; zudem wird eine Java-Runtime-Umgebung auf dem Rechner benötigt, die im Bedarfsfall folgendermaßen installiert werden kann:

sudo aptitude install openjdk-8-jre

Anschließend kann das TAR-Archiv entpackt werden:

tar xvzf ApacheDirectoryStudio-2.(...).tar.gz

Hierdurch wird im gleichen Verzeichnis ein neues Unterverzeichnis mit dem Namen ApacheDirectoryStudio erstellt. In diesem Verzeichnis befindet sich eine gleichnamige ausführbare Datei, mit der das Programm gestartet werden kann.