8 | LDAP-Filter |
Immer, wenn Sie im LDAP-Baum suchen, sind Sie nicht darauf angewiesen, genau nach einem bestimmten Objekt zu suchen, sondern es gibt die Möglichkeit, Filter zu verwenden, um eine Suche genauer zu definieren. Die genaue Definition der Suche ist besonders in Bäumen mit mehreren Tausend Objekten wichtig, da der LDAP-Server immer nur eine gewisse Anzahl an Suchergebnissen zurückgibt. In der Beispielkonfiguration, die wir hier im Buch verwenden, ist zum Beispiel die Suche auf maximal 500 Ergebnisse eingeschränkt, um durch eine Suche den Server nicht zu überlasten. Stellt ein Anwender eine Suchanfrage, bekommt er immer nur die ersten 500 passenden Ergebnisse zurück.
Filter können Sie an den verschiedensten Stellen in der Konfiguration und Nutzung des LDAP-Servers anwenden. Hier eine kurze Liste der möglichen Einsatzzwecke:
Bei der Suche mit ldapsearch.
Bei der Einrichtung von dynamischen Gruppen mit groupOfURLs.
Bei der Replikation der Datenbank auf Consumer-LDAP-Server.
8.1 | Arten von Filtern |
Als Erstes wollen wir einen Blick auf die möglichen Filter werfen, um einen Überblick über die daraus entstehenden Möglichkeiten zu geben. In Tabelle 8.1 sehen Sie die Übersicht der einfachen Filter und die entsprechende Syntax.
Neben den einfachen Filtern gibt es noch die erweiterten Filter. Die erweiterten Filter stellen noch mehr Möglichkeiten bereit, die Suche zu optimieren. Diese Art der Filter sind komplexer als die einfachen Filter, aber dadurch auch leistungsfähiger. Die folgenden Möglichkeiten haben Sie mit erweiterten Filtern:
1. Mit den erweiterten Filtern können Sie die Matching Rules der Attribute übersteuern. So können Sie zum Beispiel beim Attribut cn, bei dem laut Attributsbeschreibung nicht auf die Groß- und Kleinschreibung bei der Suche geachtet wird, die Suche so durchführen, dass doch auf Groß- und Kleinschreibung geachtet wird.
2. Die erweiterten Attribute versetzen Sie in die Lage, nach bestimmten Werten in allen Attributen eines Objekts zu suchen.
3. Sie können feststellen, ob ein bestimmter Wert in den Attributen vorhanden ist, aus denen der DN für den Eintrag besteht. Mit einem erweiterten Filter können Sie einen Abgleich mit Attributen in anderen RDN-Komponenten durchführen, die zum Erstellen des DN des Eintrags verwendet werden.
Filter |
Syntax |
Beispiel |
Anmerkung |
Vorkommen |
* |
cn=* |
Attribut cn vorhanden |
Gleichheit |
= |
cn=Pan Tau |
Attribut cn genau gleich |
Teilstring |
* |
cn=Pan* |
Attribut ist vorhanden und beginnt mit Pan |
Größer-gleich |
>= |
uidNumber>=11000 |
Numerisches Attribut größer gleich |
Kleiner-gleich |
<= |
uidNumber<=11000 |
Numerisches Attribut kleiner gleich |
Ungefähr gleich |
~= |
cn~=Pan T |
ungefähr gleich |
logisches AND |
(&( |
(&(uid=ptau)(uidNumber>=11000)) |
Beide Attribute müssen stimmen |
logisches OR |
(|( |
(|(uid=ptau)(uid=kklammer)) |
Eines der Attribute muss stimmen |
logisches NOT |
(!( |
(!(uid=ptau)) |
Der Wert darf nicht im Attribut stehen |
8.1.1 | Beispiele zu einfachen Filtern |
Beginnen wollen wir mit den einfachen Filtern. Der einfachste Filter aus Listing 8.1 ist der nach der Suche, ob ein bestimmtes Attribut in einem Objekt überhaupt vorhanden ist. Sie suchen nach allen Objekten, die das Attribut cn besitzen, wobei der Wert bei der Suche unerheblich ist:
ldapsearch -x -D "cn=admin,dc=example,dc=net" -W "cn=*"
Sie suchen nach einem bestimmten genauen Wert für ein Attribut – geben Sie den genauen Wert bei der Suche an. Dabei wird die Matching Rule für das Attribut vom System berücksichtigt, so wie in Listing 8.2:
ldapsearch -x -D "cn=admin,dc=example,dc=net" -W "cn=Stefan Kania"
Hier wird genau nach Stefan Kania gesucht, wobei die Groß- Kleinschreibung keine Rolle spielt, denn das Attribut cn achtet nicht auf Groß- und Kleinschreibung.
Auch die Suche nach Teilstrings, so wie in Listing 8.3, ist möglich (wenn das entsprechende Attribut das erlaubt). Sie können Teile des gewünschten Werts durch den Stern ersetzen:
ldapsearch -x -D "cn=admin,dc=example,dc=net" -w geheim -LLL "cn=Stef*" ldapsearch -x -D "cn=admin,dc=example,dc=net" -w geheim -LLL "cn=*ef*" ldapsearch -x -D "cn=admin,dc=example,dc=net" -w geheim -LLL "cn=*ia"
Im ersten Beispiel wird nach allen Objekten gesucht, deren Attribut cn am Anfang den Teilstring Stef hat. Die nachfolgenden Zeichen sind nicht relevant, das Attribut kann auch nur die Zeichenkette Stef enthalten.
Im zweiten Beispiel soll die Zeichenfolge ef irgendwo im Wert des Attributs enthalten sein. Der Teilstring kann dabei sowohl am Anfang, in der Mitte oder auch am Ende des Wertes stehen.
Beim dritten Beispiel soll der Teilstring ia am Ende des Wertes stehen. Genau wie schon bei den ersten beiden Beispielen kann das Muster auch alleine als Wert in dem Attribut stehen.
Die nächsten beiden Möglichkeiten, „größer-gleich“ >= und „kleiner-gleich“ <=, sehen Sie in Listing 8.4:
ldapsearch -x -D "cn=admin,dc=example,dc=net" -w geheim -LLL "shadowLastChange <=1571306400" ldapsearch -x -D "cn=admin,dc=example,dc=net" -w geheim -LLL "uidNumber<=10000" ldapsearch -x -D "cn=admin,dc=example,dc=net" -w geheim -LLL "gidNumber>=1000"
Für das erste Beispiel haben wir das Datum 17.10.2019 12:00 Uhr in das Unix-Zeitformat über die Website https://www.unixtime.de/ umgerechnet und dann nach allen Benutzern gesucht, die ihr Passwort vor diesem Datum das letzte Mal geändert haben.
Beim zweiten Beispiel wird nach allen Benutzern gesucht, deren uidNumber größer-gleich 10.000 ist.
Im dritten Beispiel wird nach allen Objekten gesucht, die das Attribut gidNumber besitzen und der Wert größer-gleich 1.000 ist.
Wenn Sie verschiedene Filter AND-verknüpfen wollen, verwenden Sie das &-Zeichen, um beliebig viele Attribute zu verknüpfen. So können Sie gezielt nach Objekten suchen, bei denen zwei oder mehr Bedingungen erfüllt sein müssen. Achten Sie dabei auf die Schreibweise in Listing 8.5:
ldapsearch -x -D "cn=admin,dc=example,dc=net" -W "(&(cn=u1 prod)\ (loginshell=/bin/bash))" ldapsearch -x -D "cn=admin,dc=example,dc=net" -W "(&(cn=u1*)\ (loginshell=/bin/bash))" ldapsearch -x -D "cn=admin,dc=example,dc=net" -W "(&(cn=u1*)\ (loginshell=/bin/bash)(uidNummer>=11000))"
Sie sehen hier, dass das &-Zeichen für die logische Verknüpfung nicht zwischen den einzelnen Attributen steht, sondern vor den Attributen, die verknüpft werden sollen. Auch wenn Sie mehr als zwei Attribute verknüpfen wollen, müssen Sie alle Attribute einzeln geklammert in der AND-Verknüpfung eintragen. Bei der Verknüpfung können Sie auch wieder die verschiedenen Filter verwenden. Bei der AND-Verknüpfung müssen immer alle Bedingungen wahr sein, nur dann wird das Objekt angezeigt.
Die logische OR-Verknüpfung wird durch das |-Symbol eingeleitet, die Syntax eines Filters ist identisch mit der Syntax einer AND-Verknüpfung. Beispiele dazu sehen Sie in Listing 8.6:
ldapsearch -x -D "cn=admin,dc=example,dc=net" -W "(|(cn=u1*)(cn=u2*))" ldapsearch -x -D "cn=admin,dc=example,dc=net" -W \ "(|(cn=u1*)(cn=u2*)(cn=u3*))"
Im Gegensatz zur logischen AND-Verknüpfung reicht es bei der OR-Verknüpfung, wenn einer der Filter zutrifft.
Suchen Sie nach Objekten, die einen bestimmten Wert nicht in einem Attribut eingetragen haben, dann können Sie einen Filter über die logische NOT-Verknüpfung anpassen. Verwenden Sie hierzu zusätzlich vor dem zu negierenden Filter das !. Diese Verknüpfung können Sie dann auch noch mit der AND- oder OR-Verknüpfung kombinieren. In Listing 8.7 sehen Sie zwei Beispiele dazu:
ldapsearch -x -D "cn=admin,dc=example,dc=net" -W ’(!(cn=u1*))’ ldapsearch -x -D "cn=admin,dc=example,dc=net" -W ’(|(cn=u1*)(!(cn=u2*)))’
Im ersten Beispiel werden alle Objekte gesucht, die nicht mit u1 beginnen. Im zweiten Beispiel werden alle Objekte gesucht, deren CN mit u1 beginnen, oder die Objekte, die nicht mit u2 beginnen.
Wichtig: Wenn Sie alle Filter bisher mit dem doppelten Anführungszeichen quotiert haben, müssen Sie hier auf jeden Fall das einfache Anführungszeichen verwenden, da sonst die Shell das Ausrufezeichen interpretiert und es zu einer Fehlermeldung kommt.
So können Sie mithilfe der einfachen Filter schon sehr gezielt nach bestimmten Objekten suchen. Alle hier beschriebenen Filter können Sie miteinander kombinieren.
8.1.2 | Beispiel zu erweiterten Filtern |
Die erweiterten Filter geben Ihnen noch erheblich mehr Möglichkeiten, nach Objekten zu suchen, bis hin dazu, die Matching Rule für Attribute zu verändern. Die folgenden Beispiele in Listing 8.8 zeigen genau das.
provider01:~# ldapsearch -x -D "cn=admin,dc=example,dc=net" \ -W LLL "cn=u1 verw" Enter LDAP Password: dn: cn=U1 Verw,ou=users,ou=Verwaltung,ou=firma,dc=example,dc=net provider01:~# ldapsearch -x -D "cn=admin,dc=example,dc=net" \ -W -LLL "cn:caseExactMatch:=u1 Verw" Enter LDAP Password: provider01:~# ldapsearch -x -D "cn=admin,dc=example,dc=net" \ -W -LLL "cn:caseExactMatch:=U1 Verw" Enter LDAP Password: dn: cn=U1 Verw,ou=users,ou=Verwaltung,ou=firma,dc=example,dc=net
Im ersten Beispiel wird nach cn=u1 verw gesucht. Da das Attribut cn mit caseIgnoreMatch im Schema steht, wird das Objekt gefunden und angezeigt. Im zweiten und dritten Beispiel wird für die Suche die Option caseExactMatch festgelegt, und nur im dritten Beispiel wird das Objekt gefunden, da nur dort der Wert exakt so geschrieben wurde, wie er im Objekt abgelegt ist.
In Listing 8.9 folgt noch ein Beispiel, in dem durch die erweiterten Muster die Suche noch mehr individualisiert wird.
ldapsearch -x -D "cn=admin,dc=example,dc=net" \ -W -LLL "ou:dn:caseExactMatch:=users"
Jetzt werden alle Objekte gesucht, welche in ihrem DN irgendwo die Zeichenkette ou=users stehen haben, wobei zusätzlich noch auf die Groß- und Kleinschreibung geachtet wird. Bei dem Muster würden alle Benutzer aus der ou=users,ou=Verwaltung,ou=firma,dc=example, dc=net, der ou=users,ou=Produktion,ou=firma,dc=example,dc=net und der ou=users, dc=example,dc=net angezeigt. Hätten Sie bei einem der Pfade die ou=users mit einem großen U geschrieben, wären die Benutzer aus der OU nicht aufgelistet worden. Solche komplexen Filter zeigen Ihnen, wie wichtig es ist, auf eine einheitliche Schreibweise beim Anlegen von Objekten zu achten.
Selbstverständlich können Sie auch die erweiterten Filter wieder logisch mit AND, OR oder NOT verknüpfen. Auch können Sie die erweiterten Filter mit den einfachen Filtern verknüpfen. Wollen Sie bestimmte Filter später in Skripten verwenden, prüfen Sie die Filter auf jeden Fall vorher auf der Kommandozeile.
8.2 | Sonderzeichen in Attributen |
Bis zu diesem Punkt sind wir immer davon ausgegangen, dass kein Sonderzeichen in einem Wert eines Attributs vorgekommen ist. Was aber, wenn der «*» in einem Wert vorkommt? Genau, eine Suche nach zum Beispiel einem Attribut, in dem «cn=Name*» steht, wäre so nicht exakt möglich. Aus diesem Grund gibt es die Möglichkeit, bestimmte Sonderzeichen durch ESC-Sequenzen darzustellen.
Leerzeichen: Ein Filter darf an keiner Stelle ein Leerzeichen enthalten, wollen Sie nach einem Wert mit einem Leerzeichen suchen, ersetzen Sie jedes einzelne Leerzeichen durch \20 im Filter.
Das Nullzeichen: Das Nullzeichen ist ein Steuerzeichen, das in manchen Programmiersprachen als Füllzeichen verwendet wird. Es wird auch oft dazu verwendet, einem Gerät eine «NOP»-Anweisung zu senden. Wenn Sie, aus welchem Grund auch immer, nach diesem Zeichen suchen wollen, verwenden Sie die Sequenz «\00».
Eine öffnende Klammer: Die öffnende Klammer «(» dient in einem Filter dazu, den Anfang eines einzelnen Elements des Filters zu definieren. Wenn aber die Klammer Teil des Wertes ist, dann müssen Sie die Klammer durch die Sequenz «\28» eingeben.
Eine schließende Klammer Das Ende eines Filterelements wird immer mit der schließenden Klammer «)» geschlossen. Wenn Sie dieses Zeichen in einem Wert suchen wollen, verwenden Sie die Sequenz «\29».
Der Stern: Wenn Sie den «*» in einem Wert suchen wollen, zum Beispiel im CN eines Objekts, dann ist es wichtig, dass Sie auch dieses Symbol durch eine ESC-Sequenz ersetzen. Verwenden Sie an der Stelle die Sequenz «\2a».
Der Backslash: Auch der Backslash kann in einem Wert eines Attributs vorkommen. Wollen Sie nach dem Backslash suchen, verwenden Sie die Sequenz «5c».
So sind Sie jetzt auch in der Lage, nach Sonderzeichen in den Werten von Attributen zu suchen, die normalerweise Teile der Filtersyntax sind.