original in en Atif Ghaffar
en to de Harald Radke
Atif ist ein Chamäleon. Er verändert seine Rollen von
Systemadministrator zu Programmierer, zu Lehrer, zu Projektmanager
oder was immer in seinem Beruf benötigt wird.
Gelegentlich findet man ihn sogar auf der Toilette mit seinem Laptop wie
er gerade dabei ist, Dokumentation zu schreiben.
Atif glaubt daß er Linux und der Open-Source Gemeinde sehr viel
verdankt. Mehr über ihn findet man auf seiner
Homepage
Es existiert eine Menge Literatur zu diesem Thema, deren Inhalt hier nicht wiederholt werden soll. Ebenso werden etwas fortgeschrittenere Aspekte von LDAP, wie etwa V2 contra V3, nicht behandelt. Tatsache ist, dass ich von diesen Dingen auch nicht allzuviel Ahnung habe. Stattdessen soll hier in einfachen Worten umrissen werden, was LDAP eigentlich ist, was es bringt und wie man es verwendet.
Ich bin kein Experte in Sachen LDAP, ja, eigentlich bin ich ein Neuling. Im Prinzip stellt dieser Artikel eine Art Erfahrungsbericht dar, über alles, was ich mit LDAP mache und wie es bewerkstelligt wird. Ich werde versuchen, den Leser die Verwirrung und Schwierigkeiten zu ersparen, denen ich mich lange Zeit konfrontiert sah.
Es stellt sich natürlich die Frage: Warum schreibt ein Anfänger auf einem Gebiet über dieses einen
Artikel?
Vor kurzem benötigte ich die Hilfe eines Kollegen. Grundlage des Projektes war LDAP.
Er konnnte mir zwar in Sachen Perl, Mailservern, uvm. helfen, LDAP war für ihn aber Neuland. Schlimmer, bei jedem
Versuch sich in die Materie einzuarbeiten, wurden seine Verständnisprobleme größer.
Da eine gewisse Vertrautheit mit LDAP eine Mindestvoraussetzung für das Projekt war, gab ich ihm
einen halbenstündigen Crashkurs, nach welchem ihm plötzlich alles klar war.
Die Konzepte waren so einfach, er hatte alles vor Augen, es brauchte nur ein wenig Konzentration und ein paar verständliche
Beispiele.
Selbiges wird in diesem Artikel versucht.
Bei den Literaturverweisen sind eine Menge URLs zu finden, durch die man ein wenig mehr über LDAP lernen kann.
LDAP ist die Abkürzung für Lightweight Directory Access Protocol und ist ein Verzeichnisdienst, vergleichbar den Verzeichnissen bekannter Dateisysteme oder Telefonbüchern, in denen man Nummern nachschlägt. Ähnlichkeiten bestehen zu netzzwerkorientierten Verzeichnissystemen, wie etwa Suns NIS, Network Information System oder DNS, Domain Name Service. Nicht zuletzt kann man auch Parallelen mit dem Baum im Garten des Nachbars finden...
LDAP ist eine spezialisierte Datenbank. Es ist sehr wichtig, dass man LDAP nicht einfach nur als ein weiteres Datenbanksystem betrachtet. LDAP wurde für das Auffinden (Lesen von Daten) optimiert, da Lesezugriffe wesentlich häufiger durchgeführt werden müssen, als Schreibzugriffe.
Was haben nun alle oben genannten Dienste gemeinsam ?
Sie alle geben Auskunft über bestimmte Attribute, wenn an sie eine entsprechende Anfrage gestellt wird.
Beispiele.
Verzeichnisse des Dateisystemes
ls /etc
Dadurch wird eine Liste aller Dateien und Unterverzeichnisse des Ordners /etc zurückgeliefert.
ls /etc/p*
Man erhält alle Dateien und Unterverzeichnisse, deren Namen mit p anfangen
find /usr/local/apache -name index.html
Hierdurch wird das Dateisystem nach Dateien/Verzeichnissen mit dem Namen index.html durchsucht,
beginnend in /usr/local/apache.
NIS Verzeichnis
ypcat passwd
Zurückgeliefert werden Benutzername, Passwort, ID, usw. aus der NIS Datenbank
ypmatch atif passwd
Ergebnis sind Einträge das Passwort des Benutzers atif betreffend
DNS Verzeichnis
nslookup www.linuxfocus.org
Man erhält die IP Adresse von www.linuxfocus.org von der DNS Datenbank
nslookup -type MX linuxfocus.org
Hierdurch werden nur MX Informationen von der DNS Datenbank zurückgeliefert, in der der Hostname
linuxfocus.org entspricht.
LDAP directory
(hierzu später mehr Details)
ldapsearch uid=aghaffar
Es werden alle öffentlich zugänglichen Informationen über den Benutzer aghaffer
zurückgeliefert.
Ähnlich dem Befehl find / -uid aghaffar unter Unix.
ldapsearch uid=aghaffar mail
Hierdurch bekommt man nur Mail für den Benutzer aghaffar zurückgeliefert.
In jedem der oben genannten Verzeichnissyteme gibt es immer einen Ausgangspunkt von dem aus jede
Reise oder Suche beginnt. Dieser wird oft auch Wurzel (Root) genannt, ähnlich der
Wurzel eines Baumes.
Jeder Baum beginnt mit einer Wurzel und verzweigt sich dann in Äste, Blättern, Blüten, usw.
drwxr-xr-x 29 root root 749 Jun 17 23:45 /usr
Hier nun das Diagramm für ein LDAP Verzeichnis
Auf dieses Diagramm wird später noch eingegangen werden.
Im Gegensatz zu einem natürlichen Baum hat jede Verzweigung im Dateisystem-/LDAP-/Telefonbuchverzeichnis mindestens ein einzigartiges Attribut, durch welches sie sich von anderen unterscheidet.
Im Dateisystem ist dieses Attribut der Dateiname, zusammen mit dem Pfad, also zum Beispiel
/etc/passwd
.
Innerhalb dieses Pfades muss der Dateiname passwd einzigartig sein. Natürlich kann es
/usr/passwd oder /opt/passwd geben, welche durch ihren vollständigen Dateinamen
(mit Pfad) eindeutig sind.
Ähnlich dazu gibt es beim DNS System den FQND, Fully Qualified Domain Name, welcher einen
eindeutigen Eintrag darstellt (natürlich kann man einem FQDN mehrere IP Adressen zuordnen).
Beim LDAP stellt dn, Distinguished Name, das Äquivalent zum FQND des DNS dar.
Diese Bezeichnung ist innerhalb eines Verzeichnisses immer einzigartig.
Zum Beispiel lautet mein dn: uid=aghaffar, ou=People, o=developer.ch
Es kann keinen weiteren Eintrag mit dem selben dn geben, aber sicherlich einen weiteren wie:
uid=aghaffar,ou=Administrators, o=developer.ch
Ganz wie in dem oben gezeigten Beispiel des Dateisystemes, mit:
/etc/passwd und /usr/passwd
Es gibt ein einzigartiges Attribut namens uid im Baum ou=Administrators, o=developer.ch
und eines im Baum ou=People, o=developer.ch.
Deshalb kommt es zwischen diesen zu keinem Konflikt.
Es gibt heutzutage eine ganze Reihe von LDAP Servern auf dem Markt, von denen die meisten unter Linux gefahren
werden können.
Für diesen Artikel wird openLDAP verwendet.
Warum gerade openLDAP?
Im folgenden wird Schritt für Schritt ein LDAP Server eingerichtet.
Hierfür notwendig:
Wie bereits erwähnt kann man entweder die Quellen von www.openldap.org herunterladen und, entsprechend der Dokumentation, installieren oder bereits vorkompilierte Pakete verwenden. Die Anleitung zur Installation dieser Pakete oder eine Beschreibung, wie die Programme übersetzt werden, würde diesen Artikel sprengen und wird hier deshalb nicht zu finden sein.
Als Beispiel soll hier nun ein LDAP Verzeichnis für linuxfocus.org erstellt werden.
Natürlich kann der Leser die Namen und andere Daten entsprechend den eigenen
Bedürfnissen anpassen. Für die Konfiguration des Hauptservers müssen die Dateien
slapd.conf und ldap.conf angepasst werden, man kann dazu seinen bevorzugten Texteditor verwenden.
Auf meinem Server sind diese Dateien unter /etc/openldap zu finden. Abhängig von der verwendeten
Linux Distribution können sie aber auch unter /usr/local/etc/openldap oder an anderen Stellen zu finden
sein, abhängig von den Parametern etwa, die man während des Übersetzens der Quellen angegeben hat.
######### /etc/openldap/slapd.conf ################################### # folgende Einträge werden standardmäßig von der SuSE 6.4 Distribution # gesetzt sie werden im zweiten oder dritten Teil dieser Artikelserie # beschrieben vielleicht werde ich bis dahin auch herausgefunden haben, # wofür sie gut sind :) include /etc/openldap/slapd.at.conf include /etc/openldap/slapd.oc.conf schemacheck off pidfile /var/run/slapd.pid argsfile /var/run/slapd.args ####################################################################### # Einstellungen für die LDAP Datenbank ####################################################################### # hier wird die zu verwendende Datenbank bestimmt, man sollte den # Standardwert (ldbm) lassen database ldbm # Endung bzw. Verzeichniswurzel. Dies ist der oberste Eintrag im # LDAP Verzeichnis suffix "o=linuxfocus.org" # Hier ist die LDAP Datenbank zu finden directory /var/lib/ldap # der (einzigartige) Name des Verwalters des Verzeichnisses rootdn "cn=Manager, o=linuxfocus.org" # keine gute Idee, das Passwort des LDAP Verwalters in Klartext # einzutragen, dies geschieht hier nur anfangs, bis man sich ein # wenig mit LDAP auseinandergesetzt hat rootpw secret # das war's erstmalMan modifiziert nun die Datei /etc/openldap/ldap.conf.
##########/etc/openldap/ldap.conf######### # # LDAP Defaults # # Mehr Details auf der Man-Page ldap.conf(5) # Diese Datei sollte global lesbar sein # hier wird der LDAP Server angegeben, Rechname oder IP Adresse host 127.0.0.1 # dies ist die Verzeichniswurzel, die als Ausgangspunkt für alle # Suchen dienen soll hier wird der oberste Eintrag unserer Konfiguration # gewählt dies muss aber nicht unbedingt der Fall sein, es könnte # auch zum Beispiel base = ou=users, o=linuxfocus.ch sein # Entsprechend starten dann alle Suchaktionen von diesem Zweig des # Baumes aus. base o=linuxfocus.org # und Schluss...Nun wird der LDAP Server hochgefahren.
Nun sollte der LDAP Server laufen und bereit für die Aufnahme von Informationen sein.
Dazu werden normalerweise LDIF, LDAP Directory Interchange Format(*), Dateien angelegt.
ldif ist einfach die textuellde Darstellung der LDAP Einträge. Diese sind für Menschen lesbar
und können zwischen zwei verschiedenen LDAP Server von unterschiedlichen Herstellern ausgetauscht werden,
auch wenn verschiedene Backends für die Datenbanken verwendet und diese unter verschiedenen Betriebssystemen
betrieben werden.
Für eine ausführlichere Beschreibung sollte man sich die Manualpages von ldif anschauen.
(*)Ja, ja, wieder ein anderes Dateiformat. Ich frage mich, wieso man stattdessen nicht einfach XML verwendet
Nun wird ohne weitere Umschweife diese ldif Datei erstellt. Was man in Erinnerung halten sollte ist, dass:
dn: o=linuxfocus.org o: linuxfocus.org objectclass: top objectclass: organization dn: ou=editors, o=linuxfocus.org ou: editors objectclass: organizationalUnit dn: uid=aghaffar, ou=editors, o=linuxfocus.org uid: aghafar cn: Atif Ghaffar sn: Ghaffar givenname: Atif objectclass: person userpassword: {CRYPT}yIvSBWSuLs2N2 mailacceptinggeneralid: aghaffar@linuxfocus.org ou: editors dn: uid=mkempe, ou=editors, o=linuxfocus.org uid: mkempe cn: Magnus Kempe sn: Kempe givenname: Magnus objectclass: person userpassword: clearpass mailacceptinggeneralid: mkempe@linuxfocus.org maildrop: mkempe@developer.ch preferredlanguage: fr ou: editorsNun müssen diese Informationen noch dem LDAP Verzeichnis hinzugefügt werden. Dazu wird der Befehl ldapadd verwendet:
ldapadd -D "cn=Manager, o=linuxfocus.org" -w secret < linuxfocus.org.ldif
Dieses Kommando verwendet cn=Manager, o=linuxfocus.org als dn des Verwalters und secret als
Passwort und liest Informationen aus der Datei linuxfocus.org.ldif und fügt diese dem LDAP Verzeichnis hinzu.
Sollte alles geklappt haben, sollte man nun Anfragen an das LDAP Vereichnis stellen können. Alternativ,
sollte es doch Probleme geben, mag der Leser an dem Punkt angekommen sein, meine Mailbox mit Post zu überfluten ;)
Jedoch hoffe ich zum Wohle meines Mailservers, dass alles funktioniert.
Bevor es weitergeht, hier eine zeilenweise Betrachtung der ldif Datei:
Alle Informationen über den Benutzer mkempe:
ldapsearch uid=mkempe
Die dn aller Editoren:
ldapsearch '(&(objectclass=person)(ou=editors))' dn
Weitere Beispiele sind auf den Man-Pages zu ldapsearch zu finden.
LDAP ist ein offener Standard. Die meisten neuen Programme, die man verwenden wird,
werden in der Lage sein, LDAP Datenbanken zu benutzen, um Informationen zu erlangen.
Selbst Windows 2000 verwendet LDAP für seine Verzeichnisdienste.
Alle Informationen in einem Punkt zu sammeln birgt enorme Vorteile: nur eine zu verwaltetende Site,
geringere Fehleranfälligkeit, weniger Daten mehrfach verteilt und so keine Notwendigkeit diese zu sichern/aktualisieren.
Als ein Compaq Mitarbeiter könnte ich jetzt hingehen und versuchen, jemanden LDAP anzudrehen, indem ich es als "Contacts Manager" preise. Da ich aber nicht bei Compaq angestellt bin, stell ich hier eine etwas interessantere LDAP Anwendung vor.
SINGLE SOURCE OF SIGN-ON
Die Accounts aller Benutzer sind zentral gespeichert.
Die Benutzer können über einen LDAP Verzeichnisbaum verwaltet werden, mit ihren
Passwörten und noch viel mehr Informationen, die nicht in einer einfachen Datei wie
/etc/passwd untergebracht werden können.
Die Benutzer können MS Windows, Unix, Mac,... Anwender sein.
Idee Authentifizierung kann direkt über die LDAP Daten anstelle von Shadowdatei, NIS, o.ä.
vollzogen werden, dazu muss man Dateien wie /etc/pam.d/login usw. entsprechend anpassen.
Idee Über ein selbstgeschriebenes kleines WWW Interface kann man es den Benutzern ermöglichen,
ihr Unix Passwort zu ändern, ohne sich in das System einzuloggen, da diese Information im LDAP
und nicht im System gespeichert ist. Dafür wird allerdings pam_ldap benötigt.
Am Ende dieses Artikels ist ein Verweis zu pam_ldap zu finden.
ACHTUNG
Single Source Of Sign-On != Single Sign-On.
Viele LDAP Anbieter versuchen ihre Produkte dadurch zu verkaufen, das sie behaupten, dass man mit einem LDAP System eine
Single Sign-On Lösung realisieren kann.
Das ist nur die halbe Wahrheit. Single Sign-On ist etwas ganz anderes und ist eines der großen Schlagworter vieler IT Manager heutzutage.
Ein Beispiel für Single Sign-On:
Idee Man mag zwar Benutzern einen E-Mailaccount auf dem Server einrichten, aber dazu keinen Unixaccount anlegen. Kein Problem, ich verwende hierfür LDAP zusammen mit dem Postfix Mailserver, sowie dem Cyrus IMAP/POP Server. Tausende von Benutzer werden so verwaltet, ohne dass einer von ihnen einen Account auf dem System hat.
Idee Man möchte die Einstellungen für verschiedene Programme zentral ablegen. Einstellungen und Bookmarks von Netscape zum Beispiel können mittels LDAP verwaltet werden. Der Benutzer kann von Rechner zu Rechner ziehen und immer seine persönlichen Einstellungen vom LDAP Server beziehen. Er kann von Netscape unter Windows NT zur Linux/Solaris/Macintosh Netscapeversion wechseln und dennoch dieselben Informationen verwenden (Tut mir leid, Microsoft, ich weiss, dies ist recht bitter für Euch).
Eine Anwendung
Ich hasse es, meine persönlichen Daten immer und immer wieder anzugeben, sei es auf dem Papier oder im Netz.
Mir ist nicht klar, warum manche Menschen mit schöner Regelmäßigkeit mein Alter, Geburtsdatum oder
meine Adresse wissen wollen, obwohl ich sie ihnen irgendwann einmal habe zukommen lassen (Bürokratie...).
Bei meinem letzten Arbeitgeber mussten umfangreiche Formulare für den Help-Desk Betrieb angelegt werden, die zu 75%
ebenfalls auf obigen Daten basierten (Vorname, Nachname, Position, Postfach, Etage, Name des Leiters, Abteilung).
Statt nun seine Benutzer zu nerven und das Risiko einzugehen, des Nachts von Fremden, die diesen verblüffend ähnlich
sehen, Gewalt angetan zu bekommen, sollte man sie lieber nach den wirlich wichtigen Informationen fragen, zum Beispiel
nach ihrer ID, den Rest stellt einem LDAP zur Verfügung. Alle danach noch fehlenden Daten, kann man dann wiederum vom Benutzer
erfragen.
Idee
Angenommen, mein Telefon funktioniert nicht, die einzigen Informationen, die ich geben kann, ist: "Mein Telefon funktioniert nicht".
Ein Benutzer wäre wesentlich zufriedener mit dem Intranet, wenn:
Ich hoffe, dieser Artikel konnte dem Leser ein wenig hilfreich sein, oder aber zumindest den Heisshunger seines Geistes nach digitaler
Nahrung etwas stillen.
Wie man sieht, muss man kein Experte in einem Gebiet sein, will man sein Wissen mit anderen teilen.
Genausowenig braucht es einen Professortitel oder eine Lehramtsausbildung, um Anleitungen zu schreiben. Auch die kleinste Information kann
Anwendern helfen.
Mir persönlich fällt das Lernen einfacher, wenn ich jemand anderem beibringen will, was ich bereits weiss.
Wer mag, sollte mal diese Methode ausprobieren.
Glücklicherweise wird heutzutage mehr und mehr über Linux geredet. Viele probieren dieses
Betriebssystem auch aus, einige geben schnell wieder auf, während andere ein wenig mehr Ausdauer
haben. Diese Anwender haben zum Teil gar keine Ahnung von Unix Befehlen oder dem generellen Konzept,
einige von ihnen knabbern eine ganze Weile an einem bestimmten Problem herum.
Sollte dies den ein oder anderen Leser an seine jüngsten Erfahrungen erinnern, so qualifiziert ihn dies
doch dafür, anderen zu helfen.
Wer anderen Linuxern zwar helfen möchte, allerdings glaubt, er hat kein Wissen zu bieten, dass einen Artikel
füllen könnte, kann zum Beispiel Artikel in seine Muttersprache übersetzen.