LDAP

A Unix/Linux szerverek üzemeltetése wikiből
A lap korábbi változatát látod, amilyen Bigwig (vitalap | szerkesztései) 2007. december 2., 16:57-kor történt szerkesztése után volt.

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ár egy fa (directory tree), azaz egy gyökér csomóponttal rendelkező körmentes gráf
  • a gráf csomópontjai a címszavak (entries), melyeknek sémától függően vannak kötelező és opcionális attribútumaik
  • 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)

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 - ritkán használt, amióta támogatott az SSL feletti LDAP
  • Bind: autentikáció - bizony nem a csatlakozás, az anoním keresések enélkül működnek
  • 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
  • RDBMS adminok gondoljanak egy SQL dump-ra (mivel gyakorlatilag egy dump egy keresés eredményeiről)
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 objectClass attribútum értékei olyan osztályok, melyek a sémában leírják az adott címszó kötelező és opcionális attribútumait, illetve azok formátumát
  • NB3: az RDN-t nem elegendő a DN-ben feltüntetni
  • NB4: ez nem egy objektum, mert semmilyen műveletet nem társíthatunk hozzá

1.4 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
  • 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.5 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.6 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
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
  • NB1: ha azt szeretnénk, hogy a sima passwd parancs megváltoztassa a jelszavakat az LDAP adatbázisban, 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/ldap.secret fájlba (mód: 0600, de akkor 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 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

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 ;-)
Személyes eszközök