LDAP

Peter Krutý, xkruty@fi.muni.cz


Obsah


Directory Service, X.500, LDAP

Directory Service je špecializovaná služba na čítanie a prehľadávanie veľkého množstva dát. Nepodporuje, a ani to nie je cieľom, transakcie alebo roll-back schémy, ktoré je možné nájsť v iných, prevažne relačných databázach. Directory Service je teda databáza podporujucá operácie pridania, modifikácie alebo rušenia, iba v jednoduchej forme.

Príkladom Directory Service je WHOIS, DNS alebo X.500. Protokol X.500 vznikol ako pokus o zovšeobecnený, decentralizovaný a distribuovaný model adresárovej služby. Kedže sa však ukázalo, že tak ako je navrhnutý je obtiažne implementovateľný, vznikol LDAP (Lightweight Directory Access Protocol) [ RFC3377] odľahčený protokol na prístup k X.500.


Ako vyzerá LDAP, strom, LDAP schema

Aké informácie vieme uschovať do LDAP?

Databáza LDAP má tvar stromu, kde základanou informačnou jednotkou je "objekt" (entry), čo je vlastne uzol daného stromu - databázy. Objekt je kolekcia atribútov a je jednoznačne pomenovaný tzv. DN (Distinguished Name). Každý atribút objektu ma typ a jednu alebo viac hodnot. Typ je často mnemotechnický reťazec ako cn (Common Name), gecos (Unixovy GECOS záznam z /etc/passwd), mail alebo jpegPhoto, čo zároveň napovedá aké hodnoty tieto atribúty majú.

Ako sú informácie organizované?

Ako je uvedené vyššie databáza LDAPu je vlastne strom, ktorý nemá predom danú štruktúru, avšak existujú zvyklosti ako má vyzerať. Zvyčajne reflektuje štruktúru organizácie, v ktorej je LDAP používaný. Tak jednotlivé úrovňe stromu odpovedajú organizačným jednotkám v danej organizácií. Druhou možnosťou je usporiadať strom podľa hierarchie domén danej organizácie v DNS. Oba prístupy sú na obrazku [zdroj:
OpenLDAP 2.1 Administrator's Guide]:
Strom reflektujúci hierarchiu DNS Strom reflektujúci hierarchiu organizácie

Ako sú informácie odkazované?

DN daného objektu je (ako je možné vidieť na obrázku) vlastne cesta s daného objektu (uzlu stromu) k vrcholu. Teda napr. na obrázku vidíme objekt s DN: uid=babs,ou=People,dc=example,dc=com (čo znamená, že objekt z uid (Uniq ID) babs sa nachádza v ou (Organization Unit) People pod dc (Domain Component - odpovedá subdoméne) v dc com. Tento strom teda používa model odpovedajúci doménovej hierarchí, kde v subdoménach najnižsej úrovňe sa nachádzajú ďalšie podstromy pre organizačné jednotky v danej organizacií. S týmto súvisí aj pojem RDN (Relative Distinguished Name), čo je časť DN, ktorá identifikuje objekt v danom podstrome. Teda napr. v našom príklade je RDN napr. uid=babs.

Ako sú informácie popísané?

LDAP ďalej dovoluje definovať, ktoré atribúty objektu sú vyžadované a ktoré povolené definovaním triedy objektu použitím atribútu objectclass. Tento atribút je ako každý iný, teda je možné s ním pracovať ako s ostanými atribútmi. Rozdiel je v tom, že pri manipulácií s obsahom LDAP databázý sa berie ohľad na tento atribút, ktorý obsahuje mená tried, do ktorých patrí daný objekt a tak definuje možný obsah daného objektu - typy a hodnoty a atribútov, ktoré sú popísané v v LDAP Schéme. LDAP Schéma popisuje triedy objektov a typy atribútov. To znamená aké atribúty objekt obsahuje a aké hodnoty atribúty nadobúdajú. Schéma je takmer vzdy nemenný zoznam tried a typov, napr. v implementacií
OpenLDAP uložená v textových súboroch, ktoré si LDAP server pri štarte načíta (popísane sú pomocou EBNF). Schému je samozrejme možné si rozšíriť resp. upraviť podľa vlastných potrieb, ale takmer vždy si vystačíme s už preddefinovanými triedami.

Príkladom triedy je napr. trieda posixAccount a trieda shadowAccount. Obe boli definované na to aby bolo možné autentizovať uživaťelov presne tak ako funguje autentizácia pomocou súborov /etc/passwd a /etc/shadow, teda aj atribúty tíchto tried odpovedajú záznamom v príslušných súboroch. Triedy posixAccount a shadowAccount vyzerajú nasledovne (podľa Ldap Schema Viewer):

posixAccount shadowAccount

Atribúty vyžadované:

cn: Common Name
uid: Uniq ID
uidNumber: unixové uid
gidNumber: unixové gid
homeDirectory: domovský adresár
objectClass: hodnota je posixAccount a prípadne ďalšie

Atribúty povolené:

userPassword: heslo
loginShell: shell
gecos: GECOS záznam odpovedajúci záznamu z /etc/passwd
description: popis objektu

Atribúty vyžadované:

uid: Uniq ID
objectClass: hodnota je shadowAccount a prípadne ďalšie

Atribúty povolené:

userPassword: heslo
shadowLastChange:
shadowMin:
shadowMax:
shadowWarning:
shadowInactive:
shadowExpire:
shadowFlag:
description: popis objektu

Ako sú informácie chránené?

LDAP poskytuje mechanizus autentizácie klienta, umožnuje popísať kto má aké práva k danému objektu, pričom poskytuje okrem tradičných práv na čítanie zápis, prehľadávanie aj právo na porovnanie, kedy jedinou informáciu, ktorú dotazujúci sa klient dostane je áno/nie podľa výsledku porovnania. Implementácia OpenLDAP podporuje natívne SSL alebo spoluprácu so SASL.

Ako LDAP pracuje?

LDAP pracuje na modele server-klient. Jeden alebo viac serverov poskytuje klientom informácie v databáze, pričom databáza je buď zďieľaná a replikuje sa z jedného na ostatné alebo je strom zdieľaný, tak že časťi stromu sú na iných serveroch. Klient položí otázku, ktorémukoľvek serveru a ten buď odpovie ak odpoveď pozná alebo klientovi pošle odkaz na server kde je odpoveď.

OpenLDAP

Technicky je LDAP protokol na prístup k X.500 adresárovej službe (mimochodom X.500 je OSI adresárová služba čo sa prejavuje na jej "ťažkotonážnosti"). Povodne LDAP klienti pristupovali ku gatewayi pre X.500. Takáto gateway komunikovala protkolom LDAP s LDAP klientom a protokolom X.500 DAP (Directory Access Protocol) s X.500 serverom. DAP je protokol, ktorý pracuje nad OSI modelom, a vyžaduje nezanedbateľné systémové prostriedky, naopak LDAP je narhnutý nad TCP/IP a poskytuje vačšinu funkcionality DAPu s menšími nákladmi.

Aj keď je LDAP stále používaný ako gateway pre X.500, LDAP je častejšie priamo imlementovaný v X.500 serveroch. Najpoužívanejšia implementácia LDAPu je OpenLDAP. Používa dva démony slapd a prípadne slurpd. slapd(8) je vlastne odľahčený X.500 server. Neimplementuje DAP, ale iba podmnožinu jeho funkcionality pomocou LDAP. slurpd je replikačný server, zodpovedný za distribúciu zmien spravených v master slapd databáze na iné (záložné) servery.

OpenLDAP implementuje LDAPv3, slapd podporuje LDAP nad IPv4 aj IPv6, autentizáciu pomocou SASL (konkrétne Cyrus SASL), TLS a SSL pomocou OpenSSL, UNICODE alebo prístup z najpopulárnejších skriptovacích jazykov (Perl, Shell, SQL a Tcl).


Konfigurácia

slapd.conf

Hlavný konfiguračný súbor OpenLDAPu je /etc/slapd.conf. Po odstránení komentárov vyzerá napr. takto:
include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/nis.schema
include         /etc/openldap/schema/redhat/rfc822-MailMember.schema
include         /etc/openldap/schema/redhat/autofs.schema
include         /etc/openldap/schema/redhat/kerberosobject.schema

TLSCertificateFile    /usr/share/ssl/certs/slapd.pem
TLSCertificateKeyFile /usr/share/ssl/certs/slapd.pem
TLSCACertificateFile  /usr/share/ssl/certs/slapd.pem

database        ldbm
suffix          "dc=organizacia, dc=korporacia, dc=com"
rootdn          "cn=admin, dc=organizacia, dc=korporacia, dc=com"
rootpw          {MD5}HESLO
directory       /var/lib/ldap
index   objectClass,uid,uidNumber,gidNumber     eq
index   cn,mail,surname,givenname               eq,subinitial
defaultaccess   none
sizelimit       100000

replica host=ldap.organizacia.korporacia.com
	    binddn="cn=replicator,dc=organizacia,dc=korporacia,dc=com"
	    bindmethod=simple credentials=""XXXXXXX"
replogfile /var/lib/ldap/ldap.replog

access to dn=".*ou=group,dc=organizacia,dc=korporacia,dc=com"
	by dn="cn=backup,ou=admins,dc=organizacia,dc=korporacia,dc=com" read
	by domain=.* read 
access to dn=".*ou=people,dc=organizacia,dc=korporacia,dc=com"
	by dn="cn=backup,ou=admins,dc=organizacia,dc=korporacia,dc=com" read
	by domain=.* read
access to "dn=.*ou=admins,dc=organizacia,dc=korporacia,dc=com"
	by dn="cn=backup,ou=admins,dc=organizacia,dc=korporacia,dc=com" read
	by * compare
access to "dn=.*"
	by dn="cn=backup,ou=admins,dc=organizacia,dc=korporacia,dc=com" read
	by * read
V uvedenom konfiguračnom súbore musíme definovat kde má LDAP pri štarte hľadať schému svojho stromu - teda ako budú vyzerať informácie v databáze. Ďalej je možné definovať DN správcu databázy a jeho heslo. Heslo sa vo svete LDAPu zapisuje obvykle vo forme {typ}hash, teda napr. {MD5}Md5_HaSh_HeSlA, takto ho nájdeme uložené aj v databáze až na to, že celý tento reťazec je naviac zakodovaný Base64 (pre náš reťazec to bude: e01ENX1NZDVfSGFTaF9IZVNsQQ==). Nakoniec zmienim možnosť definovať prístupové práva na daný objekt databázy direktívou access, kde na daný objekt (napr. dn=".*ou=group,dc=organizacia,dc=korporacia,dc=com") definujeme napríklad právo čítania pre dn="cn=backup,ou=admins,dc=organizacia,dc=korporacia,dc=com" a pre domain=.* (teda pre objekt v databáze s daným DN a pre prístup z akejkoľvek domény). Detaily viď slapd.conf(5).

nsswitch.conf

Tento súbor definuje akým sposobom sa majú pre rozne systémové tabuľky vyhľadávať informácie. To znamená napr. pre databázu uživateľov alebo preklad mien (DNS) či pre databázu služieb (štandartne v /etc/services). Súbor vyzerá napríklad takto:
passwd:     files nisplus
shadow:     files nisplus
group:      files nisplus

hosts:      files nisplus dns

ethers:     files
netmasks:   files
networks:   files
protocols:  nisplus [NOTFOUND=return] files
rpc:        files
services:   files nisplus

automount:  files nisplus
aliases:    files nisplus
V súbore je pre jednu tabuľku (jeden typ služby) určený riadok, tak že na začiatku je identifikovaná tabuľka a potom usporiadaný zoznam podľa, ktorého sa bude napr. prekladať doménové meno. Teda ak riadok obsahuje:
hosts: files nisplus ldap dns
najprv sa meno bude hľadať v lokálnych konf. súboroch (/etc/hosts) v prípade neúspechu sa bude skúšať NIS, potom LDAP a nakoniec sa použije DNS dotaz. V prípade, že do zoznamu uvedieme [NOTFOUND=return] hľadanie sa zastaví ak hľadanie v predchádzajúcej položke nič nevrátilo. Ak však hľadanie skončilo neúspechom, pretože služba nebola dostupná pokračuje sa ďalej.

nscd a nscd.conf

nscd (Name Service Cache Daemon) je démon, ktorý robí cache pre dotazy na rozne systémové tabuľky, DNS iné. Konfiguračný súbor sa nachádza v /etc/nscd.conf a vyzerá napríklad takto:
server-user             nscd
debug-level             0

enable-cache            passwd          yes
positive-time-to-live   passwd          600
negative-time-to-live   passwd          20
suggested-size          passwd          211
check-files             passwd          yes

enable-cache            hosts           yes
positive-time-to-live   hosts           3600
negative-time-to-live   hosts           20
suggested-size          hosts           211
check-files             hosts           yes
Definuje službu pre akú sa má cachovanie vykonávať a rozne parametre pre danú cache. Je vhodné cachovanie zapnúť z dovodu zníženia dotazov napr. na LDAP server.

Práca s LDAP

Na prácu s LDAPom nám slúži mnoho nástrojov základom je balík ldap-clients, obsahujúci programy ako ldapsearch, ldapadd, ldapmodify a podobne. Všetky tieto programy používajú formát LDIF (LDAP Data Interchange Format, vid. ldif(5)), ktorý vyzerá napríklad takto:
dn: uid=xkruty,ou=People,dc=fi,dc=muni,dc=cz
uid: xkruty
cn: xkruty
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword:: e2NyeXB0fXg=
loginShell: /bin/zsh
uidNumber: 13644
gidNumber: 10100
homeDirectory: /home/xkruty
gecos: Peter Kruty
host: aisa
host: anxur
host: atys
host: erigona
host: erinys
host: nereus
host: nymfe
host: oreias
host: pyrrha
LDIF obsahuje jednu dvojicu atribút: hodnota na jednom riadku. Tento výpis sme získali príkazom:
$ ldapsearch -h ldap.fi.muni.cz -b 'dc=fi,dc=muni,dc=cz' -x -LLL 'uid=xkruty'
Parametre znamenajú:

-h LDAP server, ktorému sa položí otázka
-b base otázky, teda podstrom v ktorom sa má vyhľadávat
-x použije sa jednoduchá autentizácia namiesto SASL
-LLL výpis bude v LDIFv1 formáte bez komentárov a verzie LDIFu
'uid=xkruty' vyhľadávací filter

Tento príkaz teda nájde na serveri ldap.fi.muni.cz v podstrome 'dc=fi,dc=muni,dc=cz' všetky objekty, ktoré majú hodnotu atribútu uid rovnú 'xkruty'. Príklad modifikácie LDAP databázy:


Odkazy