LDAP

A Unix/Linux szerverek üzemeltetése wikiből
(Változatok közti eltérés)
(Miből áll egy LDAP-on elérhető címtár?: update 2010)
(update 2010)
12. sor: 12. sor:
 
* A gráf csomópontjai a címszavak vagy bejegyzések ('''entries'''), amelyeknek sémától függően vannak kötelező és opcionális attribútumaik.
 
* A gráf csomópontjai a címszavak vagy bejegyzések ('''entries'''), amelyeknek sémától függően vannak kötelező és opcionális attribútumaik.
 
** Minden csomópont egy-egy címszó; a közbülsők is és a levelek is.
 
** Minden csomópont egy-egy címszó; a közbülsők is és a levelek is.
* A sémák határozzák meg, milyen típusú bejegyzéseket vehetünk fel egyáltalán, és melyiknek milyen attribútumai lehetnek.
+
* A sémák határozzák meg, milyen típusú bejegyzéseket vehetünk fel egyáltalán, és melyiknek milyen attribútumai lehetnek (l. később).
** A bejegyzéstípus neve: objectClass.
 
** Kétféle objectClass létezik: strukturális ('''structural''') és kiegészítő ('''auxiliary''').
 
** Minden csomópontnak pontosan egy strukturális objectClass-ba kell tartoznia, de lehetne kiegészítő objectClass-jai is (ennek akkor van értelme, ha olyan attribútumokat is szeretnénk hozzá társítani, amelyeket a strukturális objectClass nem tartalmaz).
 
 
* Minden csomópont rendelkezik egy kitüntetett attribútummal, amely azonosítja a csomópontot a vele egy szinten, közös szülőtől származó csomópontok között - ez az RDN ('''relative distinguished name''').
 
* Minden csomópont rendelkezik egy kitüntetett attribútummal, amely azonosítja a csomópontot a vele egy szinten, közös szülőtől származó csomópontok között - ez az RDN ('''relative distinguished name''').
 
* A csomópontból a gyökérbe vezető út RDN-jei kiadják a csomópont megkülönböztető nevét - ez a DN ('''distinguished name''').
 
* A csomópontból a gyökérbe vezető út RDN-jei kiadják a csomópont megkülönböztető nevét - ez a DN ('''distinguished name''').
 
* Az attribútumok lehetnek '''többértékűek''' (ezt is a séma határozza meg).
 
* Az attribútumok lehetnek '''többértékűek''' (ezt is a séma határozza meg).
 
** A többértékű attribútum olyan, amiből több is lehet ugyanannak a címszónak (pl. egy embernek lehet több emailcíme, vagy csoportnak több tagja).
 
** A többértékű attribútum olyan, amiből több is lehet ugyanannak a címszónak (pl. egy embernek lehet több emailcíme, vagy csoportnak több tagja).
  +
* NB: a fa csomópontjai '''nem objektumok''' abban az értelemben, ahogyan az objektumorientált programozásnál használják ezt a szót, mert nem társíthatunk hozzájuk műveleteket.
   
 
=== Milyen műveleteket engedélyez az LDAP? ===
 
=== Milyen műveleteket engedélyez az LDAP? ===
50. sor: 51. sor:
   
 
=== Mi a séma? ===
 
=== Mi a séma? ===
* a '''séma''' osztályok és attribútumok definíciója
+
** kicsit olyasmi, mint a relációs adatbázisok "sémája": mezők és típusaik vannak megadva
+
==== Bevezetés ====
** a mezők ('''attribútumok''') között lehet kötelező és opcionális
+
* A '''séma''' osztályok és attribútumok definíciója.
* a séma adja meg:
+
** Kicsit olyasmi, mint a relációs adatbázisok "sémája": mezők és típusaik vannak megadva.
** milyen '''objectClass'''ok léteznek
+
** A mezők ('''attribútumok''') között lehet kötelező és opcionális.
** az egyes osztályokba ('''objectClass''') tartozó entitásoknak milyen attribútumai lehetnek, és ezek közül melyik kötelező
+
** Szép formális szintaxis írja le, hogy az egyes attribútumok milyen típusú adatot tárolnak (pl. szám vagy szöveg),
** az attribútumok milyen típusúak
+
** és azt, hogy melyik bejegyzésfajtának (osztálynak) milyen attribútumokkal kell rendelkeznie, ill. melyek megengedettek még.
** az egyes attribútumok értékeinek összehasonlításkor legyen-e különbség a kis- és nagybetűk között
+
* A bejegyzéstípus neve: objectClass.
* vannak absztrakt ('''abstract'''), strukturális ('''structural''') és kiegészítő ('''auxiliary''') osztályok
+
** A létező objectClassok típusát a séma határozza meg.
** absztrakt: az LDAP alapvető struktúrájához tartozik; pl. ''top'' (nincsenek a felhasználó számára érdekes tulajdonságai)
+
** Háromféle objectClass létezik: strukturális ('''structural'''), kiegészítő ('''auxiliary''') és absztrakt ('''abstract''').
*** ilyen az ''alias'' is, ami a [[A DNS működése|DNS]] CNAME-jének a helyi megfelelője
+
** Minden csomópontnak pontosan egy strukturális objectClass-ba kell tartoznia, de lehet tetszőlegesen sok kiegészítő objectClass-ja is (ennek akkor van értelme, ha olyan attribútumokat is szeretnénk hozzá társítani, amelyeket a strukturális objectClass nem tartalmaz).
** strukturális: alapvető tulajdonságcsoportokat tartalmaz, amelyek általában logikailag kizárják egymást
+
** Az absztrakt objectClassok az LDAP alapvető struktúrájához tartoznak, és nincsenek a felhasználó számára érdekes tulajdonságaik (ilyen pl. a "top" objectClass).
*** pl. ''person'' vagy ''posixGroup'' - nem lenne értelme, hogy ugyanaz az entitás mindkét osztályba beletartozzon
+
*** Ilyen az ''alias'' is, ami a [[A DNS működése|DNS]] CNAME-jének a helyi megfelelője
*** ezért egy entitás egyszerre pontosan egy strukturális objectClassba tartozhat
+
** Strukturális objectClass: alapvető tulajdonságcsoportokat tartalmaz, amelyek általában logikailag kizárják egymást.
** kiegészítő objectClass: csak bizonyos felhasználás számára hasznos új attribútumokat tartalmaz
+
*** Pl. ''inetOrgPerson'' vagy ''groupOfNames'' - nem lenne értelme, hogy ugyanaz az entitás mindkét osztályba beletartozzon.
*** pl. a ''shadowAccount'' és a ''posixAccount'' olyan kiegészítései az ''account''-nak, amik akkor hasznosak, ha unixos felhasználók adatait akarjuk tárolni a címtárban (pl. innen lesz ''uidNumber'', ''userPassword'' és ''shadowLastChange'' attribútumunk)
+
** Kiegészítő objectClass: csak bizonyos felhasználás számára hasznos új attribútumokat tartalmaz.
*** egy entitás tetszőlegesen sok kiegészítő objectClassba tartozhat
+
*** Pl. a ''shadowAccount'' és a ''posixAccount'' olyan kiegészítései az ''account''-nak, amik akkor hasznosak, ha unixos felhasználók adatait akarjuk tárolni a címtárban (pl. innen lesz ''uidNumber'', ''userPassword'' és ''shadowLastChange'' attribútumunk).
** minden objectClassnak és attribútumnak van egy ún. OID-ja, ami egy számokból és pontokból álló globálisan egyedi azonosító (ezért sem egyszerű saját objectClass-t csinálni)
+
** Minden objectClassnak és attribútumnak van egy ún. OID-ja, ami egy szabványosító testület által kiadott, számokból és pontokból álló globálisan egyedi azonosító (ezért sem egyszerű saját objectClass-t csinálni).
*** igazából az OID azonosítja az egyes mezőket; nevük csak a megjegyezhetőség érdekében van, és gyakran ugyanahhoz az OID-hoz több név is tartozik. Pl. a ''userid'' és az ''uid'' név is a 0.9.2342.19200300.100.1.1-es OID-hoz tartozik.
+
*** Igazából az OID azonosítja az egyes mezőket; nevük csak a megjegyezhetőség érdekében van, és gyakran ugyanahhoz az OID-hoz több név is tartozik. Pl. a ''userid'' és az ''uid'' név is a 0.9.2342.19200300.100.1.1-es OID-hoz tartozik.
* egy címszónak legalább egy strukturális osztály kötelező attribútumaival rendelkeznie kell
+
*** Az OID-rendszer teszi lehetővé, hogy a protokoll bináris legyen és mégis együtt tudjanak működni egymással a különböző gyártók LDAP-ot használó termékei.
* az osztályok között van '''öröklődés'''
+
* egy attribútum leírása a '''típusra''', '''formátumra''' és az '''illeszthetőség vizsgálatára''' tartalmaz információt
+
==== Részletek ====
* egy attribútumnak lehetnek '''álnevei''' (pl. cn ugyanaz, mint a commonName)
+
* az attribútumok lehetnek binárisak (pl. jpegPhoto), ilyenkor az LDIF base64 kódolt változatukat tartalmazza
+
* Az osztályok között van '''öröklődés'''.
* az objectClass-ok és attribútumok nevei globálisan egyediek (ne azzal kezdjük, hogy sajátot hozunk létre)
+
* Egy attribútum leírása a '''típusra''', '''formátumra''' és az '''illeszthetőség vizsgálatára''' nézve tartalmaz információt.
* pl. az inetOrgPerson osztály, amit előszeretettel alkalmaznak személyek leírásához:
+
** Pl. megadható, van-e rendezés az attribútum lehetséges értékei között; az uidNumber és a gidNumber pl. ugyan numerikus, de sajnos nem rendezett attribútum, így nem tudjuk egyszerűen megtalálni mondjuk az 1000-nél kisebb UID-val rendelkező felhasználókat.
** 2 kötelező attribútummal bír: cn és sn (surname); mindkettőt a person osztálytól örökölte
+
* Egy attribútumnak lehetnek '''álnevei''' (pl. a ''cn'' ugyanaz, mint a ''commonName'').
** opcionális attribútumai: audio, businessCategory, carLicense, departmentNumber, description, destinationIndicator, displayName, employeeNumber, employeeType, facsimileTelephoneNumber, givenName, homePhone, homePostalAddress, initials, internationaliSDNNumber, jpegPhoto, l, labeledURI, mail, manager, mobile, o, ou, pager, photo, physicalDeliveryOfficeName, postOfficeBox, postalAddress, postalCode, preferredDeliveryMethod, preferredLanguage, registeredAddress, roomNumber, secretary, seeAlso, st, street, telephoneNumber, teletexTerminalIdentifier, telexNumber, title, uid, userCertificate, userPKCS12, userPassword, userSMIMECertificate, x121Address, x500uniqueIdentifier
+
* Az attribútumok lehetnek binárisak (pl. jpegPhoto), ilyenkor az LDIF (l. fent) base64 kódolt változatukat tartalmazza.
* NB: a fa csomópontjai '''nem objektumok''' abban az értelemben, ahogyan az objektumorientált programozásnál használják ezt a szót, mert nem társíthatunk hozzájuk műveleteket
+
* Az objectClass-ok és attribútumok nevei globálisan egyediek (ne azzal kezdjük, hogy sajátot hozunk létre).
  +
** pl. az inetOrgPerson osztály, amit előszeretettel alkalmaznak személyek leírásához:
  +
** 2 kötelező attribútummal bír: cn és sn (surname); mindkettőt a person osztálytól örökölte.
  +
** Opcionális attribútumai: audio, businessCategory, carLicense, departmentNumber, description, destinationIndicator, displayName, employeeNumber, employeeType, facsimileTelephoneNumber, givenName, homePhone, homePostalAddress, initials, internationaliSDNNumber, jpegPhoto, l, labeledURI, mail, manager, mobile, o, ou, pager, photo, physicalDeliveryOfficeName, postOfficeBox, postalAddress, postalCode, preferredDeliveryMethod, preferredLanguage, registeredAddress, roomNumber, secretary, seeAlso, st, street, telephoneNumber, teletexTerminalIdentifier, telexNumber, title, uid, userCertificate, userPKCS12, userPassword, userSMIMECertificate, x121Address, x500uniqueIdentifier.
   
 
=== Mi az LDAP URL? ===
 
=== Mi az LDAP URL? ===

A lap 2010. november 18., 21:30-kori változata

Írta: Fülöp Balázs és Korn András.

Tartalomjegyzék

1 Mi az LDAP?

  • LDAP: Leightweight Directory Access Protocol
  • L, mint pehelysúlyú: az X.500 kódnevű protokollcsalád könnyített változata. Az eredeti X.500-at az OSI hálózati modelljére tervezték, így a való életben nem sűrűn találkozhatunk vele.
  • D, mint címtárszolgáltatás: elsősorban egy számítógépes hálózat felhasználóit és erőforrásait tartalmazó adatbázis közvetítésére szolgál
  • A, mint elérés: támogatja az adatok frissítését, törlését, beszúrását és lekérdezését
  • P, mint az elektronikus kommunikáció egyik nyelve: egy TCP/IP felett megvalósított bináris protokoll

1.1 Miből áll egy LDAP-on elérhető címtár?

  • A címtárban tárolt bejegyzések egy fát képeznek (directory tree), azaz egy gyökércsomóponttal rendelkező körmentes gráfot.
  • A gráf csomópontjai a címszavak vagy bejegyzések (entries), amelyeknek sémától függően vannak kötelező és opcionális attribútumaik.
    • Minden csomópont egy-egy címszó; a közbülsők is és a levelek is.
  • A sémák határozzák meg, milyen típusú bejegyzéseket vehetünk fel egyáltalán, és melyiknek milyen attribútumai lehetnek (l. később).
  • Minden csomópont rendelkezik egy kitüntetett attribútummal, amely azonosítja a csomópontot a vele egy szinten, közös szülőtől származó csomópontok között - ez az RDN (relative distinguished name).
  • A csomópontból a gyökérbe vezető út RDN-jei kiadják a csomópont megkülönböztető nevét - ez a DN (distinguished name).
  • Az attribútumok lehetnek többértékűek (ezt is a séma határozza meg).
    • A többértékű attribútum olyan, amiből több is lehet ugyanannak a címszónak (pl. egy embernek lehet több emailcíme, vagy csoportnak több tagja).
  • NB: a fa csomópontjai nem objektumok abban az értelemben, ahogyan az objektumorientált programozásnál használják ezt a szót, mert nem társíthatunk hozzájuk műveleteket.

1.2 Milyen műveleteket engedélyez az LDAP?

  • Start TLS: titkosítás nélkül indított csatornán titkosított kommunikáció kezdeményezése
  • Bind: autentikáció - bizony nem a csatlakozás, az anonim keresések során nem kerül sor bind műveletre
  • Search: keresés - lásd később
  • Compare: összehasonlítás - nem egy attribútum értékét kérdezzük le, hanem elküldünk egy értéket és megkérdezzük, hogy azzal (vagy annak a jelszó hash-ével) egyezik-e
  • Add: új címszó hozzáadása
  • Delete: címszó törlése
  • Modify entry: címszó attribútumlistájának módosítása
  • Modify DN: címszó átnevezése - ez nekem OpenLDAP alatt csak levél típusú csomópontra működött, és annál is csak RDN-re
  • Abandon: megkezdett művelet megszakítása
  • Unbind: ez viszont már a kapcsolat bontását jelenti (nem a bind ellentettje)
  • NB1: egy LDAP kapcsolat során egy kliens több kérést küldhet a szervernek, és a kérések között nem kötelessége megvárni a szerver válaszát (enélkül az abandon értelmét is veszítené)
  • NB2: a szerver semmilyen sorrendiséget nem garantál egy válaszon belül az abban szereplő címszavakra, az attribútumaikra, többértékű attribútum esetén az értékekre
  • NB3: igen, tényleg hiányzik a tranzakciókezelés

1.3 Mi az LDIF?

  • LDIF: LDAP Data Interchange Format
  • sima szöveges leírása egy vagy több LDAP címszó kiválasztott attribútumainak
  • olyasmi, mint egy SQL dump
dn: cn=wheel,ou=Group,dc=42,dc=hu
cn: wheel
gidNumber: 9999
objectClass: posixGroup
objectClass: top
memberUid: balazs
  • ez egy wheel nevű csoport leírása
  • NB1: az attribútumok neveiben nem különböztetjük meg a kis- és a nagybetűt (case insensitive)
  • NB2: az RDN-t nem elegendő a DN-ben feltüntetni

1.4 Mi a séma?

1.4.1 Bevezetés

  • A séma osztályok és attribútumok definíciója.
    • Kicsit olyasmi, mint a relációs adatbázisok "sémája": mezők és típusaik vannak megadva.
    • A mezők (attribútumok) között lehet kötelező és opcionális.
    • Szép formális szintaxis írja le, hogy az egyes attribútumok milyen típusú adatot tárolnak (pl. szám vagy szöveg),
    • és azt, hogy melyik bejegyzésfajtának (osztálynak) milyen attribútumokkal kell rendelkeznie, ill. melyek megengedettek még.
  • A bejegyzéstípus neve: objectClass.
    • A létező objectClassok típusát a séma határozza meg.
    • Háromféle objectClass létezik: strukturális (structural), kiegészítő (auxiliary) és absztrakt (abstract).
    • Minden csomópontnak pontosan egy strukturális objectClass-ba kell tartoznia, de lehet tetszőlegesen sok kiegészítő objectClass-ja is (ennek akkor van értelme, ha olyan attribútumokat is szeretnénk hozzá társítani, amelyeket a strukturális objectClass nem tartalmaz).
    • Az absztrakt objectClassok az LDAP alapvető struktúrájához tartoznak, és nincsenek a felhasználó számára érdekes tulajdonságaik (ilyen pl. a "top" objectClass).
      • Ilyen az alias is, ami a DNS CNAME-jének a helyi megfelelője
    • Strukturális objectClass: alapvető tulajdonságcsoportokat tartalmaz, amelyek általában logikailag kizárják egymást.
      • Pl. inetOrgPerson vagy groupOfNames - nem lenne értelme, hogy ugyanaz az entitás mindkét osztályba beletartozzon.
    • Kiegészítő objectClass: csak bizonyos felhasználás számára hasznos új attribútumokat tartalmaz.
      • Pl. a shadowAccount és a posixAccount olyan kiegészítései az account-nak, amik akkor hasznosak, ha unixos felhasználók adatait akarjuk tárolni a címtárban (pl. innen lesz uidNumber, userPassword és shadowLastChange attribútumunk).
    • Minden objectClassnak és attribútumnak van egy ún. OID-ja, ami egy szabványosító testület által kiadott, számokból és pontokból álló globálisan egyedi azonosító (ezért sem egyszerű saját objectClass-t csinálni).
      • Igazából az OID azonosítja az egyes mezőket; nevük csak a megjegyezhetőség érdekében van, és gyakran ugyanahhoz az OID-hoz több név is tartozik. Pl. a userid és az uid név is a 0.9.2342.19200300.100.1.1-es OID-hoz tartozik.
      • Az OID-rendszer teszi lehetővé, hogy a protokoll bináris legyen és mégis együtt tudjanak működni egymással a különböző gyártók LDAP-ot használó termékei.

1.4.2 Részletek

  • Az osztályok között van öröklődés.
  • Egy attribútum leírása a típusra, formátumra és az illeszthetőség vizsgálatára nézve tartalmaz információt.
    • Pl. megadható, van-e rendezés az attribútum lehetséges értékei között; az uidNumber és a gidNumber pl. ugyan numerikus, de sajnos nem rendezett attribútum, így nem tudjuk egyszerűen megtalálni mondjuk az 1000-nél kisebb UID-val rendelkező felhasználókat.
  • Egy attribútumnak lehetnek álnevei (pl. a cn ugyanaz, mint a commonName).
  • Az attribútumok lehetnek binárisak (pl. jpegPhoto), ilyenkor az LDIF (l. fent) base64 kódolt változatukat tartalmazza.
  • Az objectClass-ok és attribútumok nevei globálisan egyediek (ne azzal kezdjük, hogy sajátot hozunk létre).
    • pl. az inetOrgPerson osztály, amit előszeretettel alkalmaznak személyek leírásához:
    • 2 kötelező attribútummal bír: cn és sn (surname); mindkettőt a person osztálytól örökölte.
    • Opcionális attribútumai: audio, businessCategory, carLicense, departmentNumber, description, destinationIndicator, displayName, employeeNumber, employeeType, facsimileTelephoneNumber, givenName, homePhone, homePostalAddress, initials, internationaliSDNNumber, jpegPhoto, l, labeledURI, mail, manager, mobile, o, ou, pager, photo, physicalDeliveryOfficeName, postOfficeBox, postalAddress, postalCode, preferredDeliveryMethod, preferredLanguage, registeredAddress, roomNumber, secretary, seeAlso, st, street, telephoneNumber, teletexTerminalIdentifier, telexNumber, title, uid, userCertificate, userPKCS12, userPassword, userSMIMECertificate, x121Address, x500uniqueIdentifier.

1.5 Mi az LDAP URL?

  • ha egy protokoll nem támogatja az URL-t (unified resource locator) az erőforrások (jelen esetben címszavak) azonosítására, akkor sokkal nehezebb eladni a menedzsmentnek
  • csomópontok egy halmazát lehet vele kiválasztani
proto://host:port/DN?attributes?scope?filter?extensions
  • proto: ldap, vagy ldaps (LDAP+SSL)
  • host: DNS név vagy IP cím
  • port: port szám, opcionális (alapértelmezés ldap esetén 389, ldaps esetén 636)
  • DN: a keresés kiindulópontjának megkülönböztető neve
    • A DN, mint Distinguished Name, amúgy is fontos fogalom: a címtárban tárolt entitások bármelyikét egyértelműen azonosítja a DN-je. Konstrukciója: az entitás "bázisát" (pl. ou=People,dc=42,dc=hu) egészítsük ki egy olyan attribútummal, amely az adott bázis kontextusában egyértelműen azonosíthatóvá teszi a konkrét entitást (pl. cn=Gipsz Jakab,ou=People,dc=42,dc=hu).
    • Az RDN (Relative DN) az az attribútum, ami egy adott kontextusban egyértelműen azonosít egy entitást. A fenti példában pl. a CN ilyen, mert az ou=People,dc=42,dc=hu alatt (közvetlenül) nem lehet két cn=Gipsz Jakab.
      • Az RDN lehet összetett; ha pl. a cn és a relatedDomain együttesen teszi egyedivé a bejegyzést, akkor a DN lehet mondjuk cn=Gipsz Jakab+relatedDomain=fenchurch.42.hu,ou=People,dc=42,dc=hu. Ebben az esetben a fenchurch.42.hu-hoz és mondjuk a traal.42.hu-hoz tartozhat két különböző Gipsz Jakab.
  • attributes: meglepő módon az attribútumok listája, opcionális
  • scope: base, ha pontosan egy címszót keresünk; one, ha a DN-ben megadott csomópont közvetlen gyermekei között keresünk; sub, ha egy részfában keresünk - NB: az, hogy melyik az alapértelmezés, implementáció-függő; opcionális
  • filter: ez egy keresési szűrő (lásd később), opcionális
  • extensions: minden, ami az RFC-ből kimaradt (ja igen, opcionális)

1.6 Hogyan keressünk az LDAP segítségével?

  • mivel az LDAP-ot címtárak elérésére fejlesztették, legjobban a kereséseket támogatja (igazából minden más igen körülményes vele)
  • telepítsünk egy LDAP klienst - Debian alatt az ldap-utils csomag tartalmazza az OpenLDAP kliensoldali segédprogramjait
  • mivel a legtöbb LDAP kliens implementáció az RFC-ben leírt URL formátumot nem támogatja, gyorsan felejtsük el a fentebb ismertetetteket és nézzünk utána a manual-ban a paraméterezésnek
$ ldapsearch -LLL                                         \
             -H ldaps://localhost/                        \
             -b 'ou=People,dc=42,dc=hu'                   \
             -s sub                                       \
             -x                                           \
             '(&(objectClass=inetOrgPerson)(uid=balazs))' \
             mail                                         \
  | grep '^mail:'
mail: ifj.fulop.balazs@42.hu
  • -LLL: a legszűkszavúbb, kommentmentes LDIF formátumot kérjük
  • -H: LDAP URI megadása (nem URL!)
  • -b: a keresés kiindulópontja
  • -s: a keresés hatóköre
  • -x: SASL nélkül kapcsolódunk
  • filter: minden szűrő zárójelek között, logikai operátorok prefix jelöléssel
  • attribútumok: egyszerűen, szóközzel elválasztva
  • a végén azért áll egy grep, mert a parancs kimenete tartalmazza a DN-t, amire most nem volt szükség

1.7 Skálázható?

  • megvalósítástól függ (nyilván alapvetően nem a protokollon múlik a skálázhatóság, hanem a szerveralkalmazáson)
  • az OpenLDAP támogatja a master - slave replikákat és a 2.4-es verziótól a multimaster üzemmódot is
    • a korábbi verziókkal is összegányolható a multimaster működés, de a fejlesztők kifejezetten ellenjavallottnak tartják
    • a 2.4-es verzió multimaster működésének leírása egyelőre (2008. január végén) hiányzik az amúgy mostanra elég jónak mondható dokumentációból; helyette az LDAP weekly newsban olvashatunk róla
  • felmerülhet a kérdés, hogy érdemes-e minden gépre slave-et rakni - ez jó lehet, mert:
    • tehermentesíti a központi szervert (a keresések és lekérdezések tekintetében)
    • rövidebbek a válaszidők (mivel nem lép fel hálózati késleltetés)
    • ki kell próbálni ;-)

1.8 Végülis mikor jó ez az egész?

  • ha az adatbázisműveletek döntő többsége keresés jellegű ÉS
  • nincs szükség tranzakciókra ÉS
  • adatbázis szinten akarjuk szabályozni a felhasználók hozzáférését (lásd később) ÉS
  • nincs szükség idegen kulcsokra és komoly kényszerekre (constraint) VAGY
  • ha marhára unatkozunk

2 Hogyan használjuk az OpenLDAP-ot központi konfigurációhoz?

  • szükség van egy LDAP szerverre mindenféle *-ldap csomagokra, és sok-sok szkriptelésre

2.1 Hogyan állítsuk be az OpenLDAP szervert?

  • Debian alatt a slapd csomag tartalmazza
  • konfiguráció: /etc/ldap/slapd.conf
# This is the main slapd configuration file. See slapd.conf(5) for more
# info on the configuration options.

#######################################################################
# Global Directives:

# Schema and objectClass definitions
include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/inetorgperson.schema
include         /etc/ldap/schema/authldap.schema

# Schema check allows for forcing entries to
# match schemas for their objectClasses's
# Ez az opció eltűnt az OpenLDAP 2.4-ben; alighanem ez lett a default
#schemacheck     on

# ...

TLSCACertificateFile    /etc/ldap/certs/cert.pem
TLSCertificateFile      /etc/ldap/certs/cert.pem
TLSCertificateKeyFile   /etc/ldap/certs/key.pem

sizelimit unlimited

# ...

#######################################################################
# Specific Directives for database #1, of type bdb:
# Database specific directives apply to this databasse until another
# 'database' directive occurs
database        bdb

# The base of your directory in database #1
suffix          "dc=42,dc=hu"

# ...

# Indexing options for database #1
index           objectClass eq
index           cn eq
index           uid eq
index           mail eq
index           dc eq

# ...

access to dn.sub="ou=DNS,dc=42,dc=hu"
        by dn="cn=admin,dc=42,dc=hu" write
        by dn="cn=dnsadmin,ou=system,dc=42,dc=hu" read
        by * none

  • fent látható, hogyan kell megadni a tanúsítványt és a privát kulcsot az SSL-es eléréshez
  • sizelimit unlimited: ha ezt nem adjuk meg, és az alapértelmezés szerinti 500 találatnál többet tesz ki a felhasználóink száma, egy egyszerű getent passwd nem adja meg a felhasználók teljes listáját
  • index: mindenképpen készítsünk a gyakrabban lekérdezett attribútumokhoz indexet, különben egy határon túl nagyon lassú lesz a keresés. Ha utólag adunk meg itt egy indexet, futtassuk a slapindex parancsot az indexek legenerálásához.
  • access: ACL-ekkel adhatjuk meg akár címszó szinten, hogy ki mihez fér hozzá - itt egy dnsadmin nevű felhasználó kapott olvasási jogot a DNS részfához
  • a fent megadott tanúsítványt akkor használja a slapd, ha megfelelő paraméterrel indítjuk. Ehhez Debian alatt a /etc/default/slapd fájlban adjuk meg a következőt:
SLAPD_SERVICES="ldaps:///"
  • érdemes még a /etc/ldap/ldap.conf-ban a kliensek alapértelmezéseit beállítani, így nem kell minden esetben nagyon hosszú paraméterlistát adni az ldapsearch-nek:
BASE    dc=42,dc=hu
URI     ldaps://localhost/
TLS_REQCERT never
  • a tanúsítvány-ellenőrzést csak akkor kapcsoljuk ki, ha előfordulhat, hogy az valamiért nem sikerül (pl. loopback interfészen szeretnénk elérni a szervert, és a tanúsítvány CN mezője nem localhost-ot tartalmaz ;-) - jó, belenyúlhatnánk a DNS-be is...)

2.2 Hogyan állítsuk be a központi autentikációt?

  • állítsuk be az NSS-t és a PAM-ot - Debian alatt a libnss-ldap és a libpam-ldap csomagokra lesz szükség
  • a libnss-ldap egy kész konfigurációval örvendeztet minket (/etc/libnss-ldap.conf), az ncurses varázsló után csak az SSL-t kell beállítani:
#host 127.0.0.1
uri ldaps://127.0.0.1/
  • itt érdemes IP címet használni, ha lehet, hogy az NSS ne végezzen névfeloldást
  • a /etc/nsswitch.conf fájlt így módosítsuk:
passwd:         files ldap
group:          files ldap
shadow:         files
  • a libpam-ldap gyakorlatilag ugyanazt a konfigurációs fájlt használja, csak egy másik példányban (/etc/pam_ldap.conf) - nem baj, ezt is átírjuk:
#host 127.0.0.1
uri ldaps://127.0.0.1/
  • végezetül a /etc/pam.d/common-* fájlokat kell módosítani, az alábbi séma szerint:
auth    [success=1 default=ignore]      pam_unix.so     nullok_secure
auth    required                        pam_ldap.so     use_first_pass
auth    required                        pam_permit.so
  • a fentit meg kell írni az account, password és session szekciókra is
  • NB2: opcionálisan telepíthetünk nscd-t (Name Service Cache Daemon), így az NSS nem fordul minden kéréssel az LDAP szerverhez
  • ha minden jól megy és nem felejtettem ki semmit, innentől működik a központi hitelesítés

2.3 Hogyan változtathatják meg a felhasználók a saját jelszavukat?

  • Az ldappasswd nem erre való (a látszat ellenére). (Hogy miért nem, az rejtély.)
  • Használhatjuk a sima passwd parancsot is, és az majd a PAM segítségével módosítja a jelszót az LDAP-ban.
  • A /etc/pam.d/common-password file-ba írjunk valami ilyesmit:
password        sufficient      pam_ldap.so
password        required        pam_unix.so nullok obscure md5
  • Hogy miért nem megy az auth-tal analóg módon, az egyelőre nem világos.
  • A /etc/pam_ldap.conf fájlban meg kell adni egy felhasználót, aki az összes jelszót képes módosítani, és az ő jelszavát le kell tenni a /etc/pam_ldap.secret és a /etc/libnss-ldap.secret fájlba (mód: 0400, de akkor is...)
  • Szintén a pam_ldap.conf-ba írjuk be azt, hogy pam_password exop - ettől a PAM az OpenLDAP által támogatott "password change extended operation" segítségével változtatja meg a jelszót, aminek az a hatása, hogy a jelszót nem plaintextben, hanem hash-elve fogja tárolni az LDAP.
  • Jó kérdés, hogy mindezt hogyan befolyásolja, ha SASL-t is használunk, márpedig az OpenLDAP-os dokumentációk eléggé efelé próbálják terelni az embert;
    • viszont látszólag SASL esetén plaintextben kellene tárolni a jelszavakat a szerveroldalon, állítólag azért, hogy az autentikcáció ne legyen érzékeny a lehallgatásra.
    • Ez minket persze nem érint, hiszen úgyis SSL-t használunk, úgyhogy jó nekünk a plaintext autentikáció és a hash-elt jelszó. (A tévedés jogát fenntartom.)

2.4 Hogyan tegyük a DNS-t LDAP-ba?

  • 2 lehetőség:
    • olyan DNS szervert használunk, amely alapból támogatja, vagy patchelt Bind9-ünk van
    • körbeszkripteljük a Bind9-et
  • az utóbbi a kevésbé triviális, és meg kellett oldanom, íme
  • Google: ldap2dns
  • letöltés után fordítsuk, telepítsük, az ldap2dns.schema fájlt pedig másoljuk be az LDAP schema könyvtárába, adjuk meg a slapd.conf-ban és indítsuk újra a slapd-t
  • írjuk meg azt a szkriptet, ami az LDAP fából ki fogja bányászni a DNS információt, és legenerálja a zónafájlokat:
#!/bin/bash

LDAP2DNS="/usr/bin/ldap2dns"
BINDINIT="/etc/init.d/bind9"
BINDCACHE="/var/cache/bind"

temp=`mktemp -d`
cd "$temp"

"$LDAP2DNS"                              \
  -D "cn=dnsadmin,ou=system,dc=42,dc=hu" \
  -w "talaneztmegseiromide"              \
  -b "ou=DNS,dc=42,dc=hu"                \
  -o "db"                                \
  -H "ldaps://localhost/"

"$BINDINIT" "stop"
rm -f "$BINDCACHE/*"
mv * "$BINDCACHE"
"$BINDINIT" "start"

cd /
rmdir "$temp"
  • készítsük el a cn=dnsadmin,ou=system,dc=42,dc=hu felhasználót talaneztmegseiromide jelszóval
  • az ou=DNS,dc=42,dc=hu részfa alatt helyezzük el a zónáinkat
  • a zónák adminisztrálására kiválóan alkalmas a phpldapadmin

Fájl:ldapadmin.png

2.5 Kikkel működik még?

  • Postfix: jól működik és egyszerűen telepíthető az LDAP modulja - az alias-tól az autoBcc-ig mindent LDAP-ba tehetünk
  • AMaViS: támogatja az LDAP-ot, felhasználónként lehet a vírus-ellenőrzést be- és kikapcsolni, a fekete- és fehérlista már nem működik (pedig a dokumentáció alapján kellene)
  • Samba: a samba.schema telepítése után a sambaSamAccount megvalósításával a személyekhez eltárolhatók a sambaLMPassword és a sambaNTPassword mezők (arra nem jöttem rá, hogy az Samba-nak miért van szüksége két hash-re) - de még ezután is nagyon macerás a beállítása
  • Apache: egy nagyon szerény tudású LDAP modullal a VirtualHost-ok kitehetők LDAP-ba - de a DocumentRoot-on kívül ne akarjunk állítgatni semmit...

3 Végezetül

  • az LDAP jó dolog, ha az adatbázison végzendő műveletek atomiak, és a keresések vannak túlsúlyban, de...
  • ...egy jótanács: soha ne mappelj relációs sémát LDAP-ra ;-)
  • egy másik: a rendszerusereket mindig hagyd meg a /etc/passwd-ben, mert:
    • miért legyen mysql felhasználó olyan gépen, ahol nincs mysql szerver?
    • ha egyik gépen letörlöd a mysql-t, és a csomagkezelő viszi a felhasználót is, az miért legyen hatással a többi gépre?

4 Ajánlott irodalom

  • ftp://kalamazoolinux.org/pub/pdf/ldapv3.pdf - ez egy elég részletes tutoriál-prezentáció az LDAPról; olvasva is érthető (kicsit zavaró, hogy "principal" helyett következetesen "principle"-t ír; ettől vonatkoztassunk el :)
  • LDAP for Rocket Scientists - egy online könyv arról, hogy hogy is működik az LDAP (főként az OpenLDAP), mi mire jó benne és mire érdemes használni. Sokkal jobban használható, mint az OpenLDAP saját dokumentációja.
Személyes eszközök