LDAP-ról pár szóban

Előszó

Ez a dokumentum betekintést nyújt az LDAP lehtőségeibe, és egy szerver implementáció, az OpenLDAP projekthez tartozó slapd használatába a teljesség igénye nélkül. Nem vállalkoztam arra, hogy minden angol terminológiából ismert szakkifejezést magyarítok.

További dokumentációk elérhetőek itt: http://www.openldap.org. Ez a dokumentum tárgyal olyan témaköröket, melyeket itt nem tárgyalunk (pl. adatbázis replikáció, elosztott adatbázis üzemeltetése, TLS konfigurálása).

LDAP alapok

Mi az az LDAP?

Az LDAP a Lightweight Directory Access Protocol rövidítése. Mint a neve mutatja, az LDAP nem több egy protokollnál, nem egy konkrét szoftverről van tehát szó. Ez a protokoll directory szolgáltatások elérését szabályozza.

Mi az a directory szolgáltatás?

Az angol directory service egy olyan speciális adatbázist takar, mely keresésre van optimalizálva, ennek megfelelően olyan esetekben célszerű ilyet használni, ahol kevés a módosítás, és nagy számú, gyors lekérdezésekre van szükség.

Az információ egy faszerű szerkezetben tárolódik, és minden csúcsában bejegyzések (entry) szerepelnek. Egy bejegyzésnek van típusa, amely meghatározza, hogy milyen attribútumai lehetnek. Minden egyes ilyen bejegyzésre egyértelműen hivatkozhatunk a bejegyzés DN-jével (Distinguished Name), mely lényegében a fában a csúcshoz vezető utat írja le.

Illusztrációként hadd vegyem kölcsön az OpenLDAP dokumentációból ezt a képet:

Példa információ struktúra

Ebben az esetben a dc (domain component) bejegyzések az Internet domain nevek elrendeződését veszik alapul. A példában az example.com site hierarchiájának egy részlete látható. A legmélyebben fekvő csúcs DN-je: uid=babs,ou=People,dc=example,dc=com

LDAP műveletek

Keresés

Egy LDAP keresés megadásához a következő információkat kell megadni: a keresés kezdetét (base), a keresés hatáskörét (scope), illetve egy keresési szűrőt (filter).
  1. base: egy DN ahol a keresést kezdeni kell. A fában ennél feljebb lévő bejegyzések biztosan nem szerepelnek a keresés eredményében.
  2. scope: a lehetőségek: base, one, sub.
    • base: csak a base DN által megadott objektum szerepel hatókörben. Amennyiben megfelel a szűrőnek, akkor a bejegyzés szerepel a keresés eredményében.
    • one: a base DN által meghatározott bejegyzés, és az egy szinttel lejjebb lévő bejegyzések tartoznak a keresés hatáskörébe.
    • sub: a base DN által meghatározott teljes részfa szerepel a keresésben.
  3. filter: a kereséshez megadható szűrő. Az attributúm definíciója, amire szűrünk, meghatározza, hogy a keresésnél milyen illesztés történik. Például a cn attribútum definíciója alapján mind egyenlőségvizsgálat esetén mind pedig részsztringvizsgálat esetén az illesztés nem betűérzékenyen történik.
Például megkereshetjük valakinek a neve alapján az azonosítóját a pandora-n. Az eredményt bárki láthatja, ha belép a pandora-ra, és kiadja ezt a parancsot (a név kisbetűvel írásának oka a nem betűérzékeny keresés illusztrálása):
ldapsearch -Y GSSAPI -b ou=people,dc=inf,dc=elte,dc=hu -s one '(cn=sandor antal)'
A -Y GSSAPI opcióval azt mondjuk meg, hogy a bejelentkezéskor megszerzett Kerberos ticket-ünket használjuk authentikációra. További információk az ldapsearch programról.

Módosítás, új bejegyzés létrehozása, bejegyzés törlése

Ezek a műveletek az ldapmodify programmal végezhetők el. Attribútumok törölhetők, cserélhetők, és új értékeket adhatunk hozzájuk. Erre példa a pandora-n a forward beállítása, melynek módja itt olvasható.

Egy bejegyzés törölhető az ldapdelete programmal. A törölni kívánt bejegyzésre természetesen a DN-vel hivatkozunk.

Egy bejegyzés RDN-je megváltoztatható

Egy DN több RDN-ből áll. Például a dc=inf,dc=elte,dc=hu DN a következő RDN-ekből áll: Egy bejegyzés RDN-jének megváltoztatására az ldapmodrdn program ad lehetőséget. Ennek segítségével a fában máshova nem helyezhetünk át bejegyzést, ehhez a bejegyzés törlése, és egy új bejegyzés létrehozása szükséges!

Néhány érdekesebb konfigurációs lehetőség

Az OpenLDAP projektben az slapd daemon végzi az LDAP kliensek kiszolgálását. A háttérben az adatokat több módon is tárolhatjuk, ezen lehetőségek ismertetése és konfigurálásuk megtalálható az OpenLDAP Administrator's Guide-ban.

A hozzáférések ellenőrzése

A konfigurációs file segítségével különböző hozzáférési jogokat adhatunk meg. Lehetőség van különböző felhasználóhoz különböző jogosultság megadására. Ha a felhasználó, akinek jogokat adunk a self, akkor a bejegyzéshez rendelt felhasználó jogai adhatóak meg. Ez azért hasznos, mert pl. egy LDAP szerveren, ahol felhasználók adatait, többek között a jelszavát is tároljuk, szükséges, hogy olyan attribútumokat, mint pl. uidNumber, gidNumber anonymous tudjon olvasni, de a userPassword attribútumot már csak az adott felhasználó módosíthassa.
A hozzáférés egészen az attribútumok szintjéig finoman szabályozható. Különböző hozzáférési szintek vannak, melyek segítségével szabályozható, hogy valami valaki számára épp csak összehasonlításra legyen elérhető, esetleg hogy keresési szűrőt is alkalmazhasson egy attribútumra, vagy netán már olvashassa is. A hozzáférési jogosultságok finomhangolása megfontolt tervezést igénylő rendszergazdai feladat, a lehetőségekről részletesen olvashatunk OpenLDAP Administrator's Guide-ban.

A keresési eredmények korlátozása

Egy óvatlan keresés nagyon sok bejegyzést visszaadását eredményezheti. Hogy ezeket ne kelljen mind feltétlenül elküldeni, a sizelimit direktíva megadja, hogy legfeljebb hány bejegyzés adható át egy keresés eredményeképpen. Ezért a klienseknek fel kell készülnie arra, hogy további kérések szükségesek a teljes eredmény megszerzéséhez.

Séma megadása

A séma megadása a konfigurációs file attributeType és objectClass direktíváival lehetséges. Az include direktíva segítségével külön fileba tett definíciók a konfigurációs fileba beemelhetőek. Debian rendszeren a schema definíciós fileok a /etc/ldap/schema könyvtárban találhatóak.

A séma megadásánál először attribútumokat definiálunk, megadjuk az attribútum nevét, a szintaxisát (típusát), azt, hogy milyen illesztés végezhető rá, hogy egyértékű, vagy esetleg több értéke is lehet-e, stb. Lehetőség van egy attribútum esetén "szülő" attribútum megadására, az attribútum a szülő attribútumtól minden tulajdonságot átvesz. Sőt! A szülő attribútumra alkalmazott szűrők vizsgálatánál a gyerek attribútum értékei is ellenőrzésre kerülnek!

Attribútumokból aztán objektum típusokat állíthatunk össze. Ezek definíciója megadja, hogy melyik attribútumnak kell benne lennie, és melyik attribútumnak szabad szerepelnie egy ilyen típusú bejegyzés esetében. Ezek is "örökölhetnek" egymástól.

Minden egyes attribútum, objektum típus, szintaxis rendelkezik egy numerikus és egyedi azonosítóval, aminek a neve OID (Object IDentifier). Egy tartományt bármilyen szervezet bármikor igényelhet, az igénylés ingyenes. Ennek a célja az, hogy ezek az azonosítók ne ütközzenek egymással. Tesztelésre mindenesetre fenntartottak egy tartományt, ezt csak lokálisan szabad használni, és soha nem fogják kiadni senkinek használatra. Ez a tartomány az 1.1-es. Példaképpen a dc, azaz domainComponent attribútum OID-je: 0.9.2342.19200300.100.1.25

Biztonsági megfontolások, SASL authentikáció

Az LDAP protokoll alapvetően kétfajta authentikációs mechanizmust támogat. Az egyik a 'simple', a másik az 'SASL'.
Mivel simple authentikáció esetén a jelszavak kódolatlanul utaznak a hálózaton, célszerű a kapcsolatot TLS felett használni.
A kapcsolathoz annak biztonságának jelzésére a szerver hozzárendel egy ún. Biztonságossági Faktort (Security Strength Factor = SSF), ami felhasználható pl. hozzáférési jogosultságok beállításakor is. Például megengedhetjük egy adat elolvasását alacsonyabb biztonsági szinten is, de ugyanakkor annak módosításához már magas szintű biztonsági követelményeket fogalmazhatunk meg.

LDAP-authentikáció konfigurálása Debian GNU/Linux-on

Ebben a szakaszban felállítunk egy olyan tesztrendszert, melyben bizonyos programok authentikációjukat egy LDAP szerveren keresztül is fogják végezni. Ehhez felállítunk egy slapd szervert, majd létrehozunk benne felhasználót, csoportot.
A példát bárki az otthoni Linux-án végigviheti, kipróbálhatja. A példa a Debian disztribúcióra koncentrál, de más disztribúciókon is azonosak a főbb lépések. A példában a domain név a teteny.elte.hu.

A konfiguráció során nem fogjuk a kliens gépet kizárólag LDAP-os authentikációra beállítani. Ennek az az oka, hogy mindig kell lokális felhasználó, akinek akkor is be kell tudni jelentkezni, ha az LDAP szerver éppen nem elérhető. A legfontosabb a root, neki lokálisnak kell lennie. Nem fogok minden konfigurációs filet teljes egészében beilleszteni, amit módosítani fogunk, csupán a fontosabb sorokat mutatom.
Másrészről ez előnyös nekünk azért is, mert ilyen módon a tesztrendszerbe csak kicsit kell belenyúlni, minden lokális felhasználó megmarad.

LDAP kliens programok telepítése

Szükségünk lesz az OpenLDAP kliens programokra (ldapsearch, ldapmodify, stb.), első lépésként telepítsük fel ezeket.
apt-get install ldap-utils

slapd telepítés

Telepítsük fel az slapd daemon-t, a telepítés során válaszoljunk a debconf által feltett kérdésekre. Válasszunk 'auto' inicializálási módot, válasszuk a 'domain or host' alapot a root dn megadására, adjuk meg a domain nevünket, az admin jelszót és ne kérjünk replikálást. Az ilyen módon generált konfigurációs file jól alkalmazható lesz. A telepítést a következő paranccsal végezhetjük el:
 apt-get install slapd 

Felhasználók és csoportok létrehozása

Hozzunk létre először két csoportot. A csoport osztálya posixGroup legyen, ez tartalmazza azokat az attribútumokat, melyre szükségünk lesz. A két csoport neve legyen loosers és lamers. A /etc/ldap/schema/nis.schema sémafile tartalmazza ennek az osztálynak és a hozzá tartozó attribútumoknak a definícióját. Ebből látszik, hogy egy ilyen csoportnak kell, hogy legyen cn és gidNumber attribútuma. Hozzuk tehát létre ezeket a csoportokat. A következőket írjuk bele a /tmp/entries fileba:
# ez a bejegyzés hozza létre a szervezi egységet, amibe a csoportokat tesszük
dn: ou=Groups,dc=teteny,dc=elte,dc=hu
objectClass: organizationalUnit
ou: Groups

# ez a bejegyzés a fent létrehozott ou alá létrehozza a vesztesek csoportját
dn: cn=loosers,ou=Groups,dc=teteny,dc=elte,dc=hu
objectClass: posixGroup
cn: loosers
gidNumber: 1100
description: Group of loosers

# ez a bejegyzés a fent létrehozott ou alá létrehozza a lámák csoportját
dn: cn=lamers,ou=Groups,dc=teteny,dc=elte,dc=hu
objectClass: posixGroup
cn: lamers
gidNumber: 1101
description: Group of lamers
Ezután simple authentikációt és az admin user DN-jét megadva, a prompthoz a az admin jelszót megadva létrehozhatjuk ezeket a bejegyzéseket. Adjuk ki a következő parancsot:
ldapmodify -a -x -D cn=admin,dc=teteny,dc=elte,dc=hu -W -f /tmp/entries
FONTOS! A gidNumber értékeket úgy kell megválasztani, hogy ilyen értékkel lokális csoport ne létezzen a /etc/group fileban!

Következő lépésként felhasználót hozzunk létre. Egy felhasználó típusának a posixAccount osztályt választjuk, mert ez megköveteli azokat az attribútumokat, melyek szükségesek lesznek majd az authentikációhoz. Írjuk a követekezőket a /tmp/looser fileba:

dn: cn=Looser User,ou=People,dc=teteny,dc=elte,dc=hu
objectClass: posixAccount
cn: Looser User
gecos: Looser User
uid: looser
uidNumber: 1100
gidNumber: 1100
homeDirectory: /home/looser
loginShell: /bin/bash
userPassword: looser
Majd adjuk ki a következő parancsot:
ldapmodify -a -x -D cn=admin,dc=teteny,dc=elte,dc=hu -W -f /tmp/looser
FONTOS! Az uidNumber értéket úgy kell megválasztani, hogy ilyen értékkel lokális felhasználó ne létezzen a /etc/passwd fileban!

A szerver készen áll, hogy felhasználói információkra vonatkozó kéréseket szolgáljon ki. Bár a userPassword attribútumot most kódolatlanul küldtük el az LDAP szervernek, de a /etc/ldap/slapd.conf fileban a userPassword attribútumhoz csak az admin-nak és a self-nek van hozzáférési joga, ezért más nem fogja tudni olvasni.

Megjegyzés: Az ldapexplorer csomagot feltelepítve és bekonfigurálva kényelmesen böngészhetjük a directory-t.

A névszolgáltatás alrendszer konfigurálása

A további módosítások már a kliens gépen végzendők el! Természetesen ugyanaz a gép lehet egyszerre a szerver és a kliens is.

Az NSS (Name Service Subsystem) feladata például elvégezni a felhasználói nevek és az uidNumber egymáshoz rendelését. Ennek bekonfigurálása lesz a következő lépésünk. Telepítsük fel az ehhez szükséges csomagot:

apt-get install libnss-ldap
Nyissuk meg az /etc/nsswitch.conf filet, és módosítsunk néhány sort, hogy az NSS lokális fileokban, s azután LDAP-ban keresse meg a leképezéshez szükséges információt:
passwd:         files ldap
group:          files ldap
shadow:         files ldap
Ezután az imént feltelepített lib számára adjuk meg az LDAP szerverünk elérhetőségét a /etc/libnss-ldap.conf fileban:
host 127.0.0.1
base dc=teteny,dc=elte,dc=hu
Próbáljuk is ezt ki azonnal! Hozzunk létre egy temp filet, adjuk oda looser-nek. Az ls -l parancs az uidNumber->uid leképezéshez az NSS-t használja, ezért rögtön kiderül, hogy az NSS konzultál-e az LDAP szerverrel:
neptune:~# touch /tmp/test
neptune:~# chown 1100.1100 /tmp/test
neptune:~# ls -l /tmp/test
-rw-r--r--    1 looser   loosers         0 Apr 30 11:40 /tmp/test
Miután az uidNumber és gidNumber értékeket úgy választottuk meg, hogy azok ne szerepeljenek a lokális fileokban, ezek az információk mindenképpen az LDAP szervertől származnak.

Az authentikáció konfigurálása

A PAM (Pluggable Authentication Module) célja az, hogy az egyes authentikációs modulok könnyen cserélhetőek legyenek egy szoftver alatt, és ne okozzon nagy problémát pl. az, ha lokális authentikációról át szeretnénk térni LDAP authentikációra. A megadott URL-n érhető el információ a PAM-ról, leírás a konfigurációs állományáról.

A Debian a potato óta PAM-ot használ. Az authentikációhoz fel kell tenni az LDAP-os PAM csomagot:

apt-get install libpam-ldap
Majd a konfigurációja során meg kell adni az LDAP szerver elérhetőségét a /etc/pam_ldap.conf fileban. Ha minden jól megy, ehhez a filehoz nem kell nyúlni, mert a csomag telepítése során feltett kérdésekre válaszolva a megfelelő file legenerálódik.
host 127.0.0.1
base dc=teteny,dc=elte,dc=hu
rootbinddn cn=admin,dc=teteny,dc=elte,dc=hu
scope sub
pam_password exop
Minden szolgáltatás (service, program), ami használ PAM-ot külön konfigurációs filelal rendelkezik a /etc/pam.d könyvtárban. Minden egyes szolgáltatást külön be kell konfigurálni arra az estre, ha szeretnénk, hogy az a szolgáltatás használja az LDAP szervert authentikációhoz. Mivel a feladat minden esetben ugyanaz, a példában mi csak login szolgáltatást konfiguráljuk, valamint a passwd szolgáltatást a jelszó megváltoztatásához. Módosítsuk a /etc/pam.d/login filet, hogy tartalmazza a következő sorokat:
auth       sufficient   pam_unix.so nullok
auth       sufficient   pam_ldap.so use_first_pass
auth       required     pam_deny.so

account    sufficient  pam_unix.so
account    sufficient  pam_ldap.so

password   sufficient  pam_unix.so nullok obscure min=4 max=8 md5
password   sufficient  pam_ldap.so
A /etc/pam.d/passwd file a következőképpen módosítandó:
password   sufficient  pam_unix.so nullok obscure min=4 max=8 md5
password   sufficient  pam_ldap.so
Ezek után lépjünk be looser felhasználóként (nem nagy baj, ha előtte létrehozzuk a home könyvtárát), használhatjuk a passwd programot a jelszó megváltoztatására.

Felhasználók kezelése

Most már működik a hőn áhított LDAP authentikációnk, de a felhasználók kezelése (user management) most már az LDAP-on belül végzendő, a megfelelő LDAP műveletekkel. Erre példaként oldjuk meg a következő helyzetet. Időközben rájövünk, hogy looser egy láma is, ezért szeretnénk betenni őt a lamers csoportba, de a gidNumber attribútumnak legfeljebb egy értéke lehet. Ennek megoldása a lamers csoporthoz tartozó bejegyzésnél rejlik. A változatosság kedvéért most ne írjuk külön fileba a módosítandó dolgokat, hanem írjuk az ldapmodify standard input-jára.
neptune:~# ldapmodify -x -D cn=admin,dc=teteny,dc=elte,dc=hu -W 
Enter LDAP Password: 
dn: cn=lamers,ou=Groups,dc=teteny,dc=elte,dc=hu
changetype: modify
add: memberUid
memberUid: looser
modifying entry "cn=lamers,ou=Groups,dc=teteny,dc=elte,dc=hu"

neptune:~#
Jelentkezzünk be újra és ellenőrizzük le, hogy sikeres volt-e:
looser@neptune:~$ id
uid=1100(looser) gid=1100(loosers) groups=1100(loosers),1101(lamers)
További módosításokat már az olvasó fantáziájára bízom. További információkért a dokumentumban szereplő linkeket érdemes felkeresni.

Name Server Caching Daemon

Azért, hogy ne kelljen minden egyes ls -l kiadásakor az LDAP szervezhez fordulni, telepíthetjük az nscd nevű programot, amely pontosan ezeknek az információknak a cache-elését végzi el. Telepítése a következő paranccsal történik:
apt-get install nscd


Az oldalt a hivatkozott dokumentumok és gyakorlati kipróbálás alapján összeállította: Papp Zoltán, prog.terv. V.
Amennyiben hibát találsz a leírásban, kérlek jelezd a következő címen: padre@elte.hu
2003. április 30.