LDAP onder Linux; een introductie.

ArticleCategory:

System Administration

AuthorImage:

[Foto van de Auteur]

TranslationInfo:

original in en Atif Ghaffar

en to nl Tom Uijldert

AboutTheAuthor:

Atif is een kameleon. Hij verandert van rol, van systeembeheerder naar programmeur naar leraar naar projectleider, al naar gelang het werk vereist.
Soms zul je hem zien programmeren op zijn draagbare computer terwijl hij in de bioscoop een film bekijkt. Atif is van mening dat hij veel aan Linux en de opensource gemeenschap met zijn projecten te danken heeft vanwege de leerzame ervaringen.
Je kunt meer over hem vinden op zijn homepage.

Abstract:

In dit artikel gaan we in op LDAP en zijn toepassingen op ons favoriete operating systeem Linux.

Er is veel geschreven over LDAP dus dat zal ik hier niet herhalen. Ik zal het hier ook niet hebben over de nieuwste LDAP termen, schema's, v2 versus v3 verschillen enzovoorts. In feite weet ik daar weinig van. In plaats daarvan zal ik proberen in eenvoudige bewoordingen uit te leggen wat LDAP is, wat de voordelen ervan zijn en welke toepassingsmogelijkheden het heeft.

Ik ben geen expert in LDAP. Feitelijk ben ik een beginner. Ik zal hier slechts opschrijven wat ik met LDAP doe en hoe ik dat doe. Ik zal m'n best doen de lezer niet te verwarren op de manier zoals ik lange tijd verward was hierover.

Vraag: "Als je een beginner bent, waarom ga je er dan over schrijven?"
Laatst had ik hulp nodig van een collega op een project. De basis van dit project was LDAP. Hij kon me helpen met Perl, mail servers enzovoorts maar wist niets van LDAP. Sterker nog, iedere keer dat hij probeerde zich hierop toe te leggen werd het geheel steeds verwarrender.
Omdat enige notie van LDAP toch de éérste vereiste was voor dit project, heb ik hem een stoomcursus van een half uur gegeven en daarmee klaarde de mist volledig op. Het concept is zó eenvoudig dat het voor het oprapen ligt. Het enige duwtje wat je nodig hebt is concentreren op een aspect of een gek voorbeeld om het concept te begrijpen.

Ik zal proberen in dit artikel hetzelfde te doen.

In de referentie-paragraaf kun je vele URL's vinden die je verder kunnen helpen met LDAP.

ArticleIllustration:

openLDAP

ArticleBody:

Wat is LDAP?

LDAP is de afkorting voor Lightweight Directory Access Protocol en is een indexeringssysteem, vergelijkbaar met directories in een bestandssysteem zoals we dat gewend zijn, en ook vergelijkbaar met een telefoongids die we gebruiken om telefoonnummers op te zoeken, en ook vergelijkbaar met een netwerk directory service zoals NIS (Network Information Service) van Sun, DNS (Domain Name Service), en ook vergelijkbaar met de boom die je in je (buurmans') tuin kunt zien.

LDAP is een gespecialiseerde database. Het is belangrijk daarbij te onthouden dat LDAP geen doorsnee database is. LDAP is speciaal toegesneden op het snel opvragen (lezen) van informatie. Lezen in LDAP wordt veel meer gedaan dan schrijven.

Wat hebben al deze diensten gemeen?
Ze geven allen informatie terug wanneer je ze uitvraagt op bepaalde criteria.

Voorbeelden:

File system directory
$ ls /etc
Zal informatie geven over alle bestanden en subdirectories in de directory /etc.

$ ls /etc/p*
Geeft alle bestanden en subdirectories die beginnen met een p.

$ find /usr/local/apache -name index.html
Dit commando zal een bestand of directory zoeken met de naam index.html, vanaf het startpunt /usr/local/apache

NIS directory
$ ypcat passwd
Geeft de gebruikersnaam, wachtwoord, identificatie enz. vanuit de NIS database.

$ ypmatch atif passwd
Deze geeft de wachtwoorden van de gebruiker atif

DNS directory
$ nslookup www.linuxfocus.org
Geeft het IP-adres van de URL www.linuxfocus.org vanuit de DNS database

$ nslookup -type MX linuxfocus.org
Geeft alleen MX-informatie uit de DNS database waarvan de hostnaam gelijk is aan linuxfocus.org

LDAP directory
(hier gaan we beneden verder op in)

$ ldapsearch uid=aghaffar
Zal alle openbare informatie over de gebruiker aghaffar teruggeven. Lijkt op het $ find / -uid aghaffar commando.

$ ldapsearch uid=aghaffar mail
Dit zal alleen mail-informatie over gebruiker aghaffar teruggeven.

Directory base of root

In iedere directory service als hierboven genoemd is er altijd een startpunt van waaruit men kan zoeken of bladeren. Dit startpunt wordt ook wel root (wortel) genoemd, analoog aan de start van een boom, de boomwortel.
Iedere boom start bij de wortel, dan komen er takken en meer takken en blaadjes en bloemen enzovoorts. Iedere root kan verder meerdere vertakkingen hebben (net als de boom in je tuin), voor een bestandssysteem kan dit bijvoorbeeld een ander bestand zijn of een subdirectory.
Iedere vertakking kan daarbij attributen hebben.
Bijvoorbeeld vertakkingen van het bestandssysteem (subdirectories en bestanden) hebben de volgende attributen: Hieronder een diagram dat een directory van een bestandssysteem laat zien.
De attributen worden weergegeven in de output van het Unix commando $ ls -ld /usr
drwxr-xr-x 29 root root 749 Jun 17 23:45 /usr

Nu een diagram van een LDAP directory

Later meer over dit diagram.

Distinguished Name

In tegenstelling tot een echte boom, heeft iedere vertakking van de filesystem/LDAP/Phonebook directory minimaal één uniek attribuut, waardoor men de vertakkingen van elkaar kan onderscheiden.

In bestandssystemen is dit de bestandsnaam in combinatie met het pad. Bijvoorbeeld /etc/passwd. De bestandsnaam passwd moet uniek zijn in dit pad. Uiteraard kunnen we /usr/passwd en /opt/passwd hebben, die allemaal uniek zijn in combinatie met het volledige pad (fully qualified filename). Analoog hieraan heeft het DNS systeem een FQDN (Fully Qualified Domain Name) die wederom uniek is (en ja, uiteraard kun je meerdere IP-adressen aan dezelfde FQDN hangen slimpie!).

In LDAP noemen we een dergelijke fully qualified name een "dn" of Distinguished Name. Deze naam is altijd uniek in een directory. Mijn dn is bijvoorbeeld: "uid=aghaffar, ou=People, o=developer.ch".
Het is niet mogelijk een ander voorkomen in de boom te hebben met dezelfde dn maar uiteraard kunnen we wel een afwijkende dn hebben in de trant van: "uid=aghaffar, ou=Administrators, o=developer.ch".
Dit is hetzelfde als de voorbeelden in het bestandssysteem met /etc/passwd en /usr/passwd.
We hebben een uniek attribuut uid in de (informatie-)boom "ou=Administrators, o=developer.ch" en we hebben een uniek attribuut uid in de boom "ou=People, o=developer.ch".

LDAP servers

Er zijn tegenwoordig diverse LDAP servers verkrijgbaar en de meeste daarvan zullen op Linux werken. Voor dit artikel gebruiken we openLDAP

Waarom heb ik openLDAP gekozen? Waarom zou jij openLDAP kiezen?

openLDAP is te verkrijgen bij www.openldap.org. Je kunt het pakket van het net halen en zelf bouwen en installeren of kijken of jouw Linux-distributie dit al heeft. Als dit zo is, bespaar je dan de moeite en installeer deze voorverpakte versie.
Ik heb openLDAP uitgeprobeerd op SuSE6.x en RedHat6.x.

Het opbouwen van de LDAP directory

Hier gaan we een LDAP server stap-voor-stap opbouwen. De volgende stappen moeten worden uitgevoerd:

Binnenhalen en installeren van openLDAP

Zoals hiervoor reeds vermeld, haal de broncode van www.openldap.com en installeer het aan de hand van de documentatie of installeer een meegeleverd pakket (het hoe van het laatste valt buiten dit artikel).

Instellen van de LDAP server

Voor dit voorbeeld zal ik een LDAP directory opbouwen voor linuxfocus.org.
Je kunt de benaming enz. naar behoefte veranderen om je eigen site weer te geven. Om de primaire server in te stellen moet je de bestanden slapd.conf en ldap.conf in je favoriete editor veranderen.
Op mijn machine is dit bestand te vinden onder /etc/openldap. Die van jou kan zich in /usr/local/etc/openldap of ergens anders bevinden, afhankelijk van je distributie of de voorkeur die je te kennen hebt gegeven bij het zelf compileren. Pas je eigen /etc/openldap/ldap.conf aan.
Dit bestand staat op de ldap client (we zullen één en dezelfde machine als client én server gebruiken. Dit kunnen ook twee aparte machines zijn).
Dit bestand wordt vaak gelezen door ldap hulpmiddelen zoals ldapdelete, ldapadd, enzovoorts.
(Standaard staan alle commentaren hierin in het Engels, dus dat volgen we hier nu ook maar.) Start nu de ldap server.
Als je de voorgeïnstalleerde versie van SuSe gebruikt dan kun je hem starten met $ /etc/rc.d/ldap start.
Op RedHat is het geloof ik:
$ /etc/rc.d/init.d/ldap start
Als je het pakket zelf hebt gecompileerd en geïnstalleerd met de standaard instellingen dan kun je starten met $ /usr/local/libexec/slapd & of waar je het dan ook hebt geïnstalleerd. Zoek gewoon slapd en start deze.

Gegevens toevoegen aan je zojuist geïnstalleerde LDAP server

Op dit punt aangekomen heb je een ldap server lopen, klaar om te worden gevuld met informatie. De standaard manier om informatie aan de server toe te voegen is met behulp van LDIF (LDAP Directory Interchange Format) bestanden. Lees $ man ldif erop na om hier meer over te weten te komen. Eenvoudig gesteld is ldif een tekstuele representatie van informatie in ldap. Dit is leesbare informatie en kan gebruikt worden voor het uitwisselen van informatie tussen twee LDAP servers van verschillende makelij (die een andere database back-end gebruiken of op andere operating systemen draaien).
Jazeker, weer een nieuw formaat. Ik vraag me af waarom XML niet wordt gebruikt in plaats van ldif.

Laten we nu zonder dralen een dergelijk ldif-bestand aan gaan maken. Dingen om rekening mee te houden:

Nu moeten we deze informatie dus toevoegen aan de ldap directory. Gebruik hiervoor het commando ldapadd
$ ldapadd -D "cn=Manager, o=linuxfocus.org" -w geheim <linuxfocus.org.ldif
Dit commando zal "cn=Manager, o=linuxfocus.org" gebruiken als de dn (distinguished name) van de manager met geheim als wachtwoord en zal de informatie inlezen van het bestand linuxfocus.org.ldif om dit aan de directory toe te voegen.
Als alles goed is gegaan ben je nu klaar voor het opvragen van gegevens uit de directory. Als het fout is gegaan ben je nu klaar om mijn postbus te overspoelen ;)

Ik hoop voor mijn mailserver dat alles goed is gegaan.
Laten we, voordat we verder gaan, het ldif bestand eens regel voor regel bekijken:

  1. Deze regel geeft de dn voor onze eerste toevoeging en is de root van deze directory-boom. Deze moet worden gedefinieerd.
  2. Op deze regel definiëren we de o (organisatie) en geven hem de waarde "linuxfocus.org".
  3. Deze regel definieert de object-klasse van dit object. We definiëren top.
  4. Hier definiëren we het type van het object (dit is een organisatie-object).
  5. De scheiding met een lege regel.
  6. dn van de groep editors (dit is de vertakking voor linuxfocus editors), analoog aan deze vertakking kunnen we meerdere vertakkingen hebben voor diverse doeleinden. Bijvoorbeeld een vertakking voor machines en hun data of een vertakking voor site mirrors enz., enz.
  7. Hier wordt het attribuut ou (organizational unit) voor editors gedefinieerd. Deze attributen fungeren als grootheden waar je op kunt zoeken. Om bijvoorbeeld alle gebruikers die editor zijn te vinden kun je zoeken op "alle dn waarbij ou=editors". Als we dit hier niet definiëren, kun je er ook niet op zoeken.
  8. Hier definiëren we de object-klasse (organizationalUnit).
  9. Scheiding met lege regel.
  10. dn voor gebruiker aghaffar in groep editors
  11. de identificatie van de gebruiker (uid, zorg ervoor dat deze uniek is).
  12. De cn (common name) van de gebruiker. Ik geef er bijvoorbeeld de voorkeur aan mijn naam op te geven als "Voornaam Achternaam", anderen kunnen de voorkeur "Achternaam Voornaam" hebben.
  13. sn: surname (Achternaam)
  14. givenname (Voornaam).
  15. object-klasse (Persoon)
  16. wachtwoord (dit is versleuteld). De aanduiding {CRYPT} geeft aan dat dit woord versleuteld is met het crypt-algoritme. Daarna volgt het versleutelde wachtwoord.
  17. deze regel geeft een e-mail adres waarop ik kan worden bereikt.
  18. ou. Dit geeft aan dat ik tot de organizationalUnit editors behoor.
  19. Scheiding
  20. Wederom een nieuwe toevoeging, gebruiker mkempe, ou editors
  21. common name, weer te geven naam
  22. Surname
  23. Firstname (Voornaam)
  24. object-klasse
  25. wachtwoord: merk op dat we hier een wachtwoord in leesbare tekst geven. Je kunt per gebruiker aangeven hoe je het wilt hebben, het is geen instelling per database. Dus de één met de leesbare tekst, een ander met CRYPT en weer aan ander met bijvoorbeeld SHA enz.
  26. e-mail adres van de gebruiker (meestal gebruikt door de mailserver).
  27. maildrop: Ook dit is voor de mailserver en geeft de eigenlijke plaats aan waar de gebruiker zijn postbus precies is. In dit voorbeeld ontvangt de mailserver post voor "mkempe@linuxocus.org". De mailserver zal dan bij de server nagaan "is er een postbus die post ontvangt voor mkempe@linuxfocus.org"? De ldap server zal dan het maildrop-attribuut teruggeven. De mailserver zal vervolgens de post daar afleveren. Hierover een andere keer meer.
    Ik ben op dit moment bezig een ISP infrastructuur op te zetten waarbij zwaar gebruik wordt gemaakt van LDAP voor het beheren van virtuele domeinen en aanverwante informatie. Als je hierin bent geïnteresseerd, stuur me even een e-mail.
  28. preferredlanguage. Hier hebben we een extra attribuut wat aangeeft welke taal een gebruiker prefereert. Deze en andere voorkeurs-informatie kunnen we centraal in LDAP opslaan om zo de gebruiker meer toegesneden service te kunnen bieden. Deze gebruiker bijvoorbeeld, wordt direct doorverwezen naar de Franse versie van de site.
    Merk op dat het voorgaande record geen attributen preferredlanguage en maildrop heeft. Dit is de kracht van LDAP. De structuur is niet vastgesteld zoals in een tabel. Een toevoeging kan 3 attributen bevatten, een andere kan er 30 hebben.
  29. ou. De unit editors.

Opvragen uit de LDAP database

Laten we alle gegevens van gebruiker mkempe opvragen:
$ ldapsearch uid=mkempe
Laten we de dn van alle editors opvragen
$ ldapsearch '(&(objectclass=person)(ou=editors))' dn
Voor meer voorbeelden, zie $ man ldapsearch

Voordelen van LDAP

Waarom zou je dus op LDAP overgaan?

LDAP is een open standaard. De meeste nieuwe applicaties zullen in staat zijn om een ldap database uit te vragen. Zelfs Windows2000 gebruikt LDAP voor zijn directory services. Het centraliseren van informatie heeft enorme voordelen, één plaats waar wordt geadministreerd, minder kans op fouten, minder dubbele data overal en minder gedoe om backups te maken.

Voorbeelden van LDAP implementaties

Ik kan nu een wijsneus van Compaq zijn en je proberen LDAP te verkopen door te zeggen dat je het als "contact manager" kunt gebruiken. Maar ik werk niet voor Compaq dus ik zal proberen je wat interessanter voorbeelden te geven van de bruikbaarheid van LDAP.

Enkele bron van aanlog-informatie
Gebruikersgegevens op een centrale plaats vastgelegd.
Je zou ldap kunnen gebruiken voor het centraal vasteggen van gebruikersinformatie, wachtwoorden en tal van andere gegevens die je normaal niet kwijt kunt in een plat /usr/passwd bestand. De informatie kan vervolgens worden gebruikt door Microsoft Windows/Unix/Mac-gebruikers.
Idee Je kunt bijvoorbeeld /etc/pam.d/login aanpassen zodanig dat het verifiëren gedaan wordt met behulp van LDAP informatie in plaats van een schaduwbestand of via nis.
Idee Je kunt een kleine webkoppeling maken voor gebruikers om hun wachtwoord te veranderen zonder de noodzaak op het systeem in te loggen omdat het wachtwoord in LDAP zit en niet in het systeem zelf. Hiervoor moet je gebruik maken van pam_ldap. Zie de referentiesectie voor een URL over pam_ldap.

Let op
Een enkele bron van aanlog-informatie is niet hetzelfde als een enkele aanlog-mogelijkheid.
Veel LDAP fabrikanten proberen te verkopen dat dit kan met het implementeren van LDAP.
Dat is maar de halve waarheid. Een enkele aanlog-mogelijkheid is iets heel anders en hét modewoord binnen het IT-management.
Een voorbeeld van een enkele aanlog-mogelijkheid is:

Uiteraard kun je LDAP gebruiken als de informatiebron voor het aanloggen maar de magie zit hem in het aansturen van de sessies voor meerdere programma's, ook wel bekend als de "Single Sign-on solution" en dit heeft absoluut niets met LDAP te maken.
Dit kan namelijk ook gedaan worden met NIS, NT Domain controller accounts, database, gewone bestanden enzovoorts.

Idee Je zou gebruikers wel een e-mail adres op je server willen geven maar geen Unix toegang. Geen probleem. Ik gebruik een combinatie van LDAP+Postfix MailServer+Cyrus IMAP/POP Server voor het administreren van duizenden gebruikers met geen van alle toegang tot Unix.

Idee Wellicht wil je voorkeuren voor meerdere applicaties centraal vastleggen. Netscape instellingen en bookmarks bijvoorbeeld kunnen worden vastgelegd in LDAP, waarbij de gebruiker van de ene machine naar de andere kan verhuizen terwijl de instellingen van de LDAP server kunnen worden gehaald. De gebruiker kan verhuizen van Windows NT Netscape naar Linux/Solaris/Macintosh Netscape en nog steeds dezelfde informatie gebruiken (Sorry Microsoft... ik weet dat dat jammer is voor je).

Scenario Ik heb er een hekel aan mijn informatie keer op keer in te vullen op een web formulier of op papier. Ik begrijp niet waarom mensen keer op keer mijn leeftijd, geboortedatum en adres willen weten terwijl ik ze die al een keer gegeven heb. In mijn vorige bedrijf moesten we grote formulieren aanmaken voor de helpdesk waarbij 75% van de gevraagde informatie steeds dezelfde was (Voornaam, Achternaam, Titulatuur, Afdeling enz.). In plaats van het irriteren van je gebruikers en het risico lopen om op een donkere nacht in elkaar geslagen te worden door vreemden die je verdomd bekend voorkomen, kun je wellicht beter volstaan met het vragen van alleen relevante informatie. Vraag bijvoorbeeld alleen naar hun identificatiecode en haal de rest van de gegevens uit LDAP, vraag ze vervolgens alleen het ontbrekende gedeelte (de probleemomschrijving).

Idee Als bijvoorbeeld mijn telefoon stuk is, is de enige nieuwe informatie die ik voor je heb het gegeven "dat mijn telefoon het niet doet".

Een gebruiker zou niet zo ontevreden zijn met het Intranet als:

Schrijf artikelen: Onderwijzen/Leren

Ik hoop dat ik met dit artikel heb geholpen bij het voeren van je hongerige brein met de broodnodige 10001110011.
Je hoeft namelijk geen expert te zijn om je kennis met de gemeenschap te delen. Ook hoef je geen leraar of professor te zijn om een leerzame instructie te schrijven. Alle kleine beetjes informatie kunnen een gebruiker helpen.
Persoonlijk vind ik het het makkelijkst om iets te leren terwijl ik iemand anders probeer uit te leggen wat ik al weet. Wellicht ook iets voor jou om die techniek te proberen.
Gelukkig hoor ik tegenwoordig veel mensen over Linux praten en zie ik velen daarvan het uit proberen. Sommigen geven het meteen op, anderen geven het een kans. Dergelijke gebruikers kunnen mensen zijn die totaal geen ervaring hebben met Unix commando's en concepten, terwijl anderen ergens voor langere tijd vastzitten met een probleem.
Als je dit allemaal zelf net hebt meegemaakt ben jij de aangewezen leraar voor die groep mensen.

Als je geen geschikt materiaal denkt te hebben waarover je kunt schrijven maar wel de Linux gemeenschap wilt helpen, dan kun je je wellicht vrijwillig aanmelden voor het vertalen van deze artikelen in je eigen taal.

Referenties

PAM LDAP Module
De pam_ldap module bevat het mechanisme onder Solaris en Linux om te verifiëren met LDAP directories en om de wachtwoorden in een dergelijke directory te veranderen.
openLDAP
Het openLDAP project is een gemeenschappelijke inspanning om een robuust, kwalitatief hoogwaardig en met volledige functionaliteit een verzameling LDAP hulpmiddelen van de grond te krijgen. Het project wordt geleid door een wereldwijde gemeenschap van vrijwilligers die gebruik maken van het Internet voor het communiceren, plannen en uitvoeren van het openLDAP project en de bijbehorende documentatie.
Uitstekende LDAP Browser/Editor, gebouwd op Java
Deze LDAP browser/editor geeft een gebruikvriendelijke koppeling naar LDAP directories met goed geïntegreerde blader- en edit-mogelijkheden. Het is geheel in Java geschreven met gebruikmaking van JFC (SwingSet) en JNDI klasse-bibliotheken. Het kan praten met LDAP v2 en v3 servers.
kldap
kldap is een LDAP client (bladerprogramma) voor KDE. Je kunt door de boom bladeren, analoog aan Novell Administrator.
http://freshmeat.net/search.php3?query=ldap
Veel LDAP-gerelateerde hulpmiddelen bij Freshmeat.
http://www.redbooks.ibm.com/abstracts/sg245110.html
LDAP implementatie-kookboek van IBM.
Je kunt het online bekijken of een papieren versie aanvragen.
ypldapd - nis 2 ldap gateway
ypldapd is een Network Information Service (NIS) server die LDAP als informatie-opslag gebruikt. Hiermee kunnen bestaande NIS clients zonder dat ze het merken gebruik maken van LDAP informatie over gebruikers, groepen en machines. Bedrijven en organisaties kunnen hierdoor gebruik maken van de voordelen van LDAP, zoals de schaalbaarheid en distributiemogelijkheden, zonder dat ze de clients hoeven aan te passen. In combinatie met LDAP server technologieën zoals Netscape's Directory Server, kan ypldapd een enkele login leveren voor zowel NT als Unix clients.
Introduction to the SLAPD and SLURPD Administrator's Guide
'n moetje. Heel veel informatie over het LDAP protocol en ldap servers.
An LDAP RoadMap & FAQ
Een leerzame index met diverse verwijzingen naar nuttige LDAP en X.500 Directory Service sites op het Internet
http://www.umich.edu/~dirsvcs/ldap/index.html
Lightweight Directory Access Protocol