Das LDAP-Protokoll gibt es schon seit einer ganzen Weile. Heute wird es hauptsächlich für die Authentifizierung verwendet, aber Sie können es nutzen, um fast jede Art von Information in Ihrem Netzwerk verfügbar zu machen.
In diesem Artikel zeige ich Ihnen, wie Sie Ihren eigenen LDAP-Server mit dem Open Source Java-basierten Apache DS Server einrichten.
Eine kurze Einführung in LDAP
LDAP-Server speichern ihre Daten in Form eines Baums, dem DIT (Directory Information Tree). Die Knoten werden als 'Einträge' bezeichnet und enthalten Daten in Form von Schlüssel-Werte-Paaren.
Jeder Eintrag wird durch seinen Distinguished Name (DN) identifiziert. Ein Distinguished Name ist eine Zeichenfolge, die aus einem oder mehreren durch Komma getrennten Schlüssel-Wert-Paaren besteht, die zusammen den Knoten eindeutig identifizieren. Ein Beispiel: 'dc=foo,dc=com'
Der Name eines Schlüssels sowie die Form und der Typ der Daten in seinem Wert hängen von seinem Attributtyp ab.
Objektklassen definieren eine Reihe von erforderlichen und optionalen Attributtypen.
Einträge erben von einer oder mehreren Objektklassen: Und schließlich wird eine Sammlung von Objektklassen und ihren zulässigen Attributtypen als Schema bezeichnet.
LDAP Schema-Diagramm:
Vordefinierte Schemata
Ein Vorteil der Verwendung eines vordefinierten Schemas zur Darstellung Ihrer Daten besteht darin, dass externe Clients keine Probleme haben werden, die Bedeutung Ihrer Objektklassen und Attributtypen zu verstehen.
Einige Beispiele sind DHCP und das Microsoft-Adressbuch.
Möchten Sie mehr über LDAP lesen? Hier ist ein guter Link: Zytrax.com/books/ldap/
Apache DS
Der Apache DS ist nicht so bekannt und voll ausgestattet wie einige andere LDAP-Server: Vor allem Microsoft Active Directory und OpenLDAP.
Aber er hat ein paar nette Vorteile: Er ist in Java geschrieben und läuft daher auf vielen Plattformen. Und das Projekt enthält eine gut strukturierte Client-LDAP-Api, die auch für die Verbindung mit anderen LDAP-Servern verwendet werden kann.
Neben dem eigenständigen LDAP-Server bietet Apache DS auch eine Verwaltungsoberfläche namens Apache DS Studio.
Apache DS Studio kann auch als LDAP-Server fungieren und verfügt über eine LDAP-Schema-IDE, die auf dem Eclipse-Framework basiert.
Installation von Apache DS Studio
Da wir in diesem Blog unser eigenes Schema schreiben werden, installieren wir DS Studio.
Voraussetzungen:
Sie müssen nur Java 5 oder höher installiert haben.
Laden Sie DS Studio 1.5 von hier herunter und folgen Sie den Anweisungen zur Installation.
Unser Schema: Ein Buchkatalog
Wir werden ein einfaches Schema definieren, mit dem wir Informationen über Bücher in unserem LDAP-Server speichern können.
Die einzige Objektklasse unseres Schemas ist die Klasse Book mit den folgenden Attributen:
Machen wir uns an die Arbeit.
Öffnen Sie Apache DS Studio und erstellen Sie ein neues Projekt.
Öffnen Sie die Perspektive 'Schema-Editor'.
Klicken Sie mit der rechten Maustaste irgendwo in das Schema-Panel und wählen Sie 'neues Schema'. Nennen wir unser Schema 'Bücher'.
Wir werden unsere Attribute definieren und Synopsis zu einem optionalen Attribut machen.
Klicken Sie mit der rechten Maustaste auf unser Schema und wählen Sie 'neuer Attributtyp'.
Das erste, was Sie ausfüllen müssen, ist die OID. OID steht für Globally unique object identifier. Um sicher zu sein, dass Ihre OID wirklich weltweit eindeutig ist, sollten Sie Ihre IDs von der IANA, ANSI oder BSI zuweisen lassen. Das werden wir hier natürlich nicht tun, also wählen Sie einfach etwas wie '1.1.1.1'.
Das Alias-Feld enthält den Namen Ihres Attributs, also Autor, Titel oder Synopsis.
Klicken Sie auf 'weiter', um die Superklasse (übergeordnet) und die Syntax einzugeben. Alle Attributtypen benötigen einen Vorgesetzten; hier wählen wir einfach 'Name'. Wählen Sie 'directory string' für Ihre Syntax.Wenn Sie versuchen, unseren Attributtyp 'title' hinzuzufügen, werden Sie feststellen, dass Apache DS ihn nicht zulässt. Es stellt sich heraus, dass es im vordefinierten Schema organizationPerson bereits einen Attributtyp mit dem Alias title gibt.Obwohl wir dieses Schema selbst nicht verwenden, mag Apache DS es nicht. Anstelle von title verwenden wir also 'subject' als Alias für unser Attribut.
Wenn Sie mit der Definition der Attribute fertig sind, definieren Sie die Objektklasse book. Ihr Typ ist eine Strukturklasse.
Genau wie in Java gibt es auch in LDAP abstrakte Klassen. Ein Knoten muss mindestens eine Strukturklasse haben, damit er instanziiert werden kann.
Wenn Sie auch mit der Buchklasse fertig sind, klicken Sie auf das Symbol 'Speichern' in der Menüleiste von DS Studio.
Unser Schema ist nun vollständig.
Um es in unserem Server verwenden zu können, müssen wir es exportieren. Klicken Sie mit der rechten Maustaste auf das Schema und wählen Sie 'Export als LDIF/Schema für Apache DS'.
Und wir müssen es in unseren Server importieren, den wir jetzt erstellen:
Öffnen Sie die LDAP-Perspektive, klicken Sie mit der rechten Maustaste auf die Registerkarte Server und wählen Sie 'Neuer Server'. Geben Sie ihm einen Namen Ihrer Wahl und starten Sie ihn.Öffnen Sie die Registerkarte Verbindungen und klicken Sie mit der rechten Maustaste darauf, um eine neue Verbindung zu unserem Server zu erstellen.Wählen Sie localhost als Host und den Standardport von Apache DS, 10389, als Port.Konfigurieren Sie auf der Registerkarte Authentifizierung 'einfache Authentifizierung'. Geben Sie als Benutzernamen ein: uid=admin, ou=system.Der Benutzername ist eigentlich auch ein DN. Er identifiziert das Benutzerobjekt in der DIT des Servers, wo es sich unter dem Knoten 'system' befindet.
Geben Sie für das Passwort 'secret' ein. Dies sind der Standard-Benutzername und das Standard-Passwort, die von Apache DS verwendet werden. Sie können in der Konfiguration des Servers bearbeitet werden.Wählen Sie schließlich Verbinden. Daraufhin wird das DIT unseres Servers im LDAP-Browser angezeigt.
Importieren Sie unser Schema in den Server, indem Sie mit der rechten Maustaste auf das DIT klicken und 'importieren' sowie LDIF als Format wählen.
Wenn Sie fertig sind, können Sie Ihr importiertes Schema im DIT unter dem Knoten 'ou=schema' überprüfen.
Erstellen Sie eine Domäne
Für diesen Zweck verwenden wir die Domäne example.com, die mit DS Studio geliefert wird.
Klicken Sie mit der rechten Maustaste auf den DIT-Stammknoten, wählen Sie 'neuer Kontexteintrag', wählen Sie 'Domäne' als Klasse und klicken Sie auf ok.
Es sollte nun ein neuer Knoten im Baum mit dem Namen dc=example,dc=com
So sollte DS Studio jetzt aussehen, mit unserem Schema 'books' und der Domäne example.com:
Einen Knoten hinzufügen
Um unser Schema und unseren Server zu testen, fügen wir einen Kontextknoten hinzu.
Öffnen Sie 'neuer Kontexteintrag'. Klicken Sie zunächst auf das Symbol 'Aktualisieren', um die Liste der Klassen zu aktualisieren. Wählen Sie unser Schema 'Bücher'. Beachten Sie, dass wir dabei die Klasse 'top' umsonst bekommen haben. Das liegt daran, dass alle Klassen im DIT von top erben müssen.Als nächstes müssen Sie den Distinguished Name (DN) eingeben. Der DN sollte unseren Knoten im DIT-Baum eindeutig identifizieren.
Da unser Knoten unter die Domäne example.com fallen wird, müssen die Knoten für die Domäne Teil des DN sein.
Außerdem sollten wir ein Attribut angeben, das unseren Knoten in unserer Domäne eindeutig macht: nehmen wir das Attribut subject.
LDAP listet die Knoten im DN in umgekehrter Reihenfolge auf, so dass unser DN wie folgt lautet: subject=test,dc=example,dc=com
Im nächsten Bildschirm geben wir unsere Attribute ein.
Klicken Sie auf 'Knoten hinzufügen', um den optionalen Synopsisknoten hinzuzufügen.
Verbindung zu unserem Server über die Apache DS Client API
In diesem Blog werden wir uns über die Apache DS Api mit unserem Server verbinden. Alternativ ist es auch möglich, eine Verbindung über JNDIherzustellen. Die Apache Client Api ermöglicht es, Knoten zu suchen, hinzuzufügen, zu aktualisieren oder zu löschen.Zunächst müssen Sie das Apache DS Client jar in Ihrem Klassenpfad haben. Hier finden Sie ein Maven pom Snippet, das dies erledigt:
[xml]
org.apache.directory.shared
shared-ldap-client-all
1.0.0-M12
[/xml]
Dann unser Client: Hier ist ein einfaches Client-Tool, das den Titel eines Buches als Parameter erwartet und dann danach sucht und seine Details ausgibt.
[java]
import org.apache.directory.ldap.client.api.LdapConnection;
import org.apache.directory.ldap.client.api.LdapNetworkConnection;
import org.apache.directory.shared.ldap.model.cursor.EntryCursor;
import org.apache.directory.shared.ldap.model.entry.Attribute;
import org.apache.directory.shared.ldap.model.entry.Entry;
import org.apache.directory.shared.ldap.model.exception.LdapException;
import org.apache.directory.shared.ldap.model.message.SearchScope;
import java.io.IOException;
import java.util.Iterator;
public class LdapBookClient {
private final String host;
private final int port;
private final String userName;
private final String password;
public LdapBookClient(String host, int port, String userName, String password) {
this.host = host;
this.port = port;
this.userName = userName;
this.password = Passwort;
}
public LdapConnection getConnection() throws LdapException, IOException {
LdapConnection connection = new LdapNetworkConnection(host, port);
connection.bind("uid=" + userName + ",ou=system", password);
Rückverbindung;
}
public void closeConnection(LdapConnection connection) throws LdapException, IOException {
connection.unBind();
connection.close();
}
public Iterator search(LdapConnection connection, String baseDn, String attributeName, String attributeValue) throws LdapException {
String filter = "(" + attributeName + "=" + attributeValue + ")";
SearchScope searchScope = SearchScope.SUBTREE;
EntryCursor cursor = connection.search(baseDn, filter, searchScope);
return cursor.iterator();
}
public static void main(String[] args) throws Exception {
if (args.length == 0) {
throw new IllegalArgumentException("Geben Sie den Titel des zu durchsuchenden Buches an.");
}
LdapBookClient client = new LdapBookClient("localhost", 10389, "admin", "secret");
LdapConnection connection = client.getConnection();
Iterator searchResults = client.search(connection, "dc=example,dc=com", "subject", args[0]);
if (searchResults.hasNext()) {
printBookDetails(searchResults.next());
} sonst {
System.out.println("Kein Buch gefunden mit Titel: " + args[0]);
}
client.closeConnection(Verbindung);
}
private static void printBookDetails(Eintrag book) {
System.out.println("Titel: " + book.get("subject").get().toString());
System.out.println("Autor: " + book.get("author").get().toString());
Attribut synopsis = book.get("synopsis");
if (synopsis != null) {
System.out.println("Synopsis: " + synopsis.get().toString());
}
}
}
[/java]
Beachten Sie, dass wir zuerst eine Verbindung zu unserem Server herstellen und dann noch eine Bindung herstellen müssen. Erst danach können wir Suchen, Aktualisieren oder Löschen durchführen.Dies war nur ein kleines Beispiel dafür, was mit Apache DS möglich ist. Hoffentlich reicht es für den Anfang, ansonsten finden Sie auf der Apache DS-Website noch mehr Dokumentation.