Co je LDAP

Jan Scotka -- xscotka at fi.muni.cz



Rozdíl Mezi Adresářem a Databází:

Adresář je databáze, tedy spíš specializovaná databáze. Jednou z charakteristik je, že je v ní zdaleka více hledáno a z ní čteno, než jsou informace úpravovany. Protože adresář musí být schopen rychlého čtení, je obvykle pro to optimalizován. Zápis je například omezen jen na systémového administrátora. Adresář nepodporuje transakce, protože implementace není potřeba. Obecná databáze musí (měla by) podporovat obecné dotazovací jazyky, jako je SQL, které mají komplexní syntaxi, kdežto v adresáři jde o jednoduchost rozhraní

X.500 Standard pro adresářové služby

Konzorcium CCITT vytvořilo X.500 standard v roce 1988 s číslem ISO 9594 X.500 organizuje adresářové položky v hierarchálním uspořdání. Také definuje výkoné vyhledávání. Pro komunikaci mezi klientem a serverem je ustanoven DAP (directory acces protocol) Jde o protokol velice složitý, tak se prakticky nepoužívá, místo toho je nahrazen odlehčenou verzí LDAP

Co je LDAP

Je zkratkou Lightweight Directory Access protocol založeném na X.500 adresářových službách. Detaily o tomto protokolu jsou popsány v: První verze LDAP byla definována v "X.500 Lightweight Access Protocol" (RFC 1487) vyžadovala plný X.500 server.

Byla nahrazena 2 verzí, ta je definována v:

RFC 1777 definuje LDAP protokol spolu s The String Representation of Standard Attribute Syntaxes (RFC 1778) A String Representation of Distinguished Names (RFC 1779) An LDAP URL Format (RFC 1959) A String Representation of LDAP Search Filters (RFC 1960)

následovala verze číslo 3 definována v:


Principy LDAP

Komunikace:

Komunikace probíhá nad TCP/IP spojením, klient navazuje spojení autentizuje se potom je fáze průběhu dotazů, nakonec dojde k ukončení spojení

LDIF:

mnoho systémových adminů upřednostňuje plain text soubory pro konfiguraci serveru. TheLDAP Interchange Format (LDIF), definováno v RFC 2849. Je standardním textovým formátem pro ukládání informací o LDAP a obsahu adresáře. Ve své základní podobě se jedná o kolekci položek od sebe navzájem oddělených prázdným řádkem, spojení jmen atributů s hodnotani a kolekcí instrukcí pro parser. Používá se několik zakladních typů atributů jako například

Organizace:

Vše je organizováno ve stromové struktůře zvané jako DIT (Direct Information Tree) každý objekt je identifikován svým jménem které je jednoznačné tzv DN (distinguished name) a má atributy které mají také jedinečná jména v rámci jednoho objektu.

LDAP Schema:

popisuje třídy objedtů, typy atributů ,ro zhodu je o typech a vlastnostech atributů, poněvadž se jedná o Objektový model, tak se může používat dědičnosti. Kvůli spolupráci mezi LDAP servery existuje pár standartizovaných schémat. například jsou definovány třídy posixAccount a shaddowAccount aby je bylo možno použít k autentizaci tak jak se tomu děje přes soubory /etc/passwd /etc/shaddow

Software:

V součastnosti existuje relativně mnoho implementací LDAP. Například od firmy Novell eDirectory, Micro$oftí Active Directory, implementace v Netscapu, implementace od fy. Sun.

Mezi volně šiřitelné patří:

OpenLDAP je opensource projekt implementující LDAP nalezneme ho na stránce http://openldap.org
University of Michigan Server: ftp://terminator.rs.itd.umich.edu/ldap

Jako nástroj pro pokusy s LDAP vybral jsem si openLDAP


Instalace:

Po stažení zdrojových souborů ze stránek projektu, jsem zjistil, že bez BerkleyDB, openssl, SASL (Simple Authentication and Security Layer), jen tak nepojede. Tak jsem byl přinucen tyto věci ještě stáhnout z inetu, Pokud něco z toho máte, můžete narazit na problém verzí, proto si raději stáhněte nové verze všech potřebných knihoven. Pokud budeme používat autentizaci uživatelů do systému, budeme ještě potřebovat PAM, pam_ldap.so, NSS.

je dobré spustit si spustit ./configure --help protože má dost voleb a některé se nám mohou hodit, třeba

 --enable-crypt        enable crypt(3) passwords [no]
 --enable-lmpasswd     enable LAN Manager passwords [no]
 --enable-spasswd      enable (Cyrus) SASL password verification [no]
 --enable-slurpd       enable building slurpd [auto]
 --enable-ldbm         enable ldbm backend no|yes|mod [no]
 --with-ldbm-api     with LDBM API auto|berkeley|bcompat|mdbm|gdbm [auto]
tady jsem ještě narazil na to zě pokud kompiluji s podporou ldbm tal musím vypnout podporu Berkleydb

takže po vybrání svých voleb můžeme provést

$ ./configure moje_volby
$ make depend
$ make

pro zjištění zda-li vše proběhlo jak mělo použijeme

$ make test

provedeme instalaci, pod rootem

# make install


Konfigurace:

Základním konfoguračním souborem je sldap.conf, u mě se nachází v adresáři /usr/local/etc/openldap/
Pokud doména vypadá takto "fi.muni.cz", použije se:
...
database ldbm  #typ databáze, záleží co člověk nakonfiguroval při kompilaci 
suffix  "dc=fi, dc=muni, dc=cz"
rootdn  "cn=Manager, dc=fi, dc=muni, dc=cz"
rootpw secret
...
Nastává čas provytvoření ldif soubodů, jakožto pěkný způsob, jak dostat data do databáze, probíhá ve dvou krocích: vytvoření LDIF soudoru, přidání do databáze pomocí $ ldapadd , protože tento program očekává vstup v ldif formátu: Uvádím pár příkladů (staženo z inetu) jak by měli vypadat podle použití, protože do ldap se dá uložit mnoho různých věcí
User
--------------------
dn:uid=xscotka,ou=People,dc=fi,dc=muni,dc=cz
uid: xscotka
cn: xscotka
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword:: {CRYPT}*
loginShell: /bin/bash
uidNumber: 99999
gidNumber: 100
homeDirectory: /home/xscotka
gecos: Jan Scotka
host: nymfe
host: aisa

Group
-------------------------------
dn: cn=staff,ou=groups,dc=fi,dc=muni,dc=cz
cn: staff
objectclass: posixGroup
userPassword: {crypt}*
gidnumber: 100
memberuid: xscotka
memberuid: xdalsi
memberuid: xdalsidalsi
potom použití bude vypadat takto: ještě je potřeba zmínit, že použití atributů je závislé na použitém schématu. pro generování hesla se používá program slappasswd kde se parametrem -h určí šifra jenž se použije.
ldapadd -D -x "cn=Manager, dc=mydomain, dc=com" -W < myldif.ldif
parametr -x je důležitý protože zabrání použití SASL autentizace, která aspoň v té chvíli nebyla u mne funkční.

hledání v databázi se provádí přes ldapsearch zároveň tím zkontrolujeme jestli nám to funguje a zdali se vložilo to co jsem chtěli ;-)

$ ldapsearch -h <erver> -b <baze> <filtr>
$ ldapsearch -L -b "dc=mydomain, dc=com" -W "(objectclass=*)"

Nesmíme zapomenou na nastavení politiky přístupu uživatelů, tzn co mohou, či nemohou dělat, neco ve stylu mohu si měnit vlatní heslo, nemohu vidět další uživatele. V souboru slapd.conf nastavíme pomocí

include /usr/local/etc/openldap/sldap.conf.acl
ten použijeme pro nastavení práv, mohl by vypadat nejak takto:
 
access to dn.regex=".*,dc=fi,dc=muni,dc=cz" attr=userPassword 
  by dn="cn=admin,dc=fi,dc=muni,dc=cz" write //admin smí měnit 
  by self write 			//vlastník smí měnit
  by * auth				// ostatní se mohou autentizovat

access to dn.regex=".*,ou=People,dc=mylan,dc=net" 
          by * read //vsechny ostatni udaje jen pro cteni ani uzivatel nemuze

máme něklik možností jak vyjádřit osobu:*, self, anonymous, users, Regulární výraz na DN
a pro vyjádření přístupového práva: write, read, search, compare, auth, none

nastavení klienta

aby se klient mohl autentizovat proti ldap je zžejmě ho potřeba natstavit, děje se tak pomocí konfiguráku /etc/ldap.conf nastavují se tam věci jako, kde je databáze, jaké je její jméno, tedy to co je nastaveno v /usr/local/etc/openldap/sldap.conf rootbinddn uvádí jnémo kterým se bude navazovat spojení(/etc/lapd.secret heslo je v čisté formě)
host doto-alpha.lab.fi.muni.cz 
base dc=fi,dc=muni,dc=cz 
rootbinddn cn=admin,dc=fi,dc=muni,dc=cz
pam_filter objectclass=posixaccount 
pam_login_attribute uid
pam_member_attribute gid 
pam_password md5 
...

Konverzní nástroje

Na PADL nalezneme nástroje, přesneji skripty, schopné převodu stávajících systémových souborů do LDAP databáze. Nebo si takový nástroj klidně napište sami, ldif formát je relativně jednoduchý a unixové konfiguráky mají přesně definovanou syntaxi.

PAM

Je potřebná existence pam_ldap.so knihovny, ta je buď v distribuci, nebo neni nic hezčího než kompilace :-) v adresáři /etc/pam.d/neco_chcem_aby_se_autentizovalo přes PAM upravíme kofigurák zkruba do téhle podoby
auth        required      /lib/security/pam_env.so
auth        sufficient    /lib/security/pam_unix.so likeauth nullok
auth        sufficient    /lib/security/pam_ldap.so try_first_pass
auth        required      /lib/security/pam_deny.so

account     required      /lib/security/pam_unix.so
account     sufficient    /lib/security/pam_ldap.so

password    required      /lib/security/pam_cracklib.so retry=3 type=
password    sufficient    /lib/security/pam_unix.so nullok use_authtok md5 shadow
password    sufficient    /lib/security/pam_ldap.so
password    required      /lib/security/pam_deny.so

session     required      /lib/security/pam_limits.so
session     required      /lib/security/pam_unix.so
#session     optional      /lib/security/pam_ldap.so
zdrojové soubory se nacházejí na stránce http://www.padl.com/OSS/pam_ldap.html

dasi vychytavky

nsswitch.conf nscd

machanizmus poskytuje informace jak hledat informace pro systemove soubory. Treba databaze uzivatelu, dns, services, automount. soubor je v adresari /etc/nsswitch.conf passwd: files ldap shadow: files ldap group: files ldap

SASL

ldapv3 umoznuje 3 druhy autentizace, bud anonymous, simple, SASL. "Simple Authentication and Security Layer" definovana v RFC 2222 specifikuje protokol pro datovou vymenu mezi klientem a serverem za ucelem autentizace a zabezpeceni dalsi komunikace. Podrobnost na strankach http://asg.web.cmu.edu/sasl/sasl-library.html kde se nachazi balik Cyrus-SASL

replikace

vzdy je dobre mit vice jak jednu kopii databaze. Proto balik openLDAP obsahuje SLURPD (Standalone LDAP Update Replication Daemon), ktery je schopen provadet replikaci databaze. Je potreba nakonfigurovat server i klienta aby to podporovali. Na Master serveru je potreba nastavit polozku replica, viz nize
replica host=<hostname>[:<port>]
        [bindmethod={ simple | kerberos | sasl }]
        ["binddn=<DN>"]
na strane sekundarniho serveru je potreba nastavit v konfiguracnim souboru polozku uptdatedn jenz odpovida zaznamu ["binddn="] na strane Master serveru

Literatura