Protokol LDAP je protokol typu klient/server. Klient se připojí k serveru a poté serveru odesílá požadavky. Server přijme požadavek, vykoná požadovanou akci a vrací výsledek. Komunikace mezi serverem a klientem nemusí být synchronní a klient i server musí být schopen pracovat v asynchronním módu. Zpracování dosud nedokončeného požadavku je možné zrušit pomocí operace "abandon". Součástí LDAP protokolu je také autentizace klienta.
LDAP (Lightweight Directory Access Protocol) je založen na protokolu X.500 a zahrnuje většinu z jeho primárních funkcí. X.500 je model pro adresářové služby (Directory Services) v konceptu OSI. Obsahuje definice prostorů jmen (namespaces) a protokoly pro vyhledávání a aktualizace adresáře. Pro svou snahu být obecným, decentralizovaným a distribuovaným systémem se stal těžko implementovatelný, proto zvnikl LDAP. Stejně jako X.500 poskytuje datový model a model prostorů jmen pro adresář. Nicméně je LDAP navržen přímo pro běh přes TCP/IP stack.
Adresář je specializovaná databáze navržená pro časté dotazy, ale sporadické aktualizace. Narozdíl od obecných databázových serverů neobsahuje podporu transakcí nebo roll-back funkcionalitu. Pro zvýšení dostupnosti jsou adresáře snadno replikovatelné. Při této činnosti může dojít k dočasným nesrovnalostem (inconsistences) do doby než se adresáře znovu synchronizují.
Základní strukturou, nad kterou pracuje protokol LDAP, je strom. Stromová struktura zprístupňovaná prostřednictvím LDAP, tzv. DIT (Directory Information Tree), může být rozprostřena přes více fyzických serverů. Rozprostření přes více fyzických serverů je realizované s použitím odkazů (referrals). Pokud například při hledání některý z vrácených záznamů je uložen na jiném serveru, pak záznam obsahuje položku referral, která obsahuje jednu nebo více LDAP URL s odkazem, kde se nachází příslušný podstrom.
Strom se skládá ze záznamů (entry). Každý záznam má přiřazenou sadu projmenovaných atributů. Pojmenovaným atributem je např. Country (c), Organization (o), Common Name (cn). Záznam v LDAP stromu popisuje většinou nějaký objekt z reálného světa, např. firmu, člověka, skupinu uživatelů apod.
cz dc=cz | muni dc=muni | fi dc=fi | /\ / \ / \ ou=group group people ou=people | | +---------------+ | | +---------------+ uid=cvt | cvt | | | | xcieslar | uid=xcieslar +---------------+-+ +-+---------------+ |gidNumber=10001| | | |uidNumber=13506| |memberUid=kas | | | |gidNumber=10100| |... | | | |... | +---------------+ | | +---------------+ | | ... ...
Každý atribut záznamu má své jméno a hodnotu. Některé atributy v rámci záznamu mají výsadní postavení a odlišují svou hodnotou záznam od ostatních záznamů na stejné úrovni stromu. Skupina těchto atributů tvoří tzv. relativní jednoznačné jméno (Relative Distinguished Name - RDN). Pomocí RDN dokážeme tedy vybrat záznam v rámci jedné úrovně stromu.
Abychom od sebe dokázali odlišit dva stejné RDN v různých částech stromu, přiřazuje se každému záznamu tzv. jednoznašné jméno (DN - Distinguished Name). Toto jméno určuje pozici záznamu ve stromě a vznikne zřetězením RDN záznamů, přes které se k popisovanému záznamu dostaneme z kořene stromu.
DIT obsahuje tzv. schéma. Schéma je sada pravidel, která popisují, jaké typy atributů mohou být použity v rámci DIT, jaké třídy záznamů lze použít a jaké mají třídy záznamů vlastnosti.
Každý záznam má přiřazenu tzv. třídu (objectclass). Trída záznamu určuje, které atributy mohou být záznamu přiřazeny. Každý záznam může mít přiřazenu jednu nebo více tříd. Přiřazení třídy k záznamu je realizováno přítomností jednoho nebo více atributů typu "objectClass". Každý záznam musí mít přiřazen minimálně jeden atribut typu "objectClass". Třídy záznamů (objectClass) jsou uspořádány do hierarchie. Pokud je přiřazena záznamu konkrétní třída, jsou mu automaticky přiřazeny i předkové přidávané třídy záznamu.
Existují dvě volně šiřitelné vrze LDAP serveru: University of Michigan LDAP server a OpenLDAP server, jenž je možno stáhnout z http://www.openldap.org/ a ftp://terminator.rs.itd.umich.edu/ldap. Z komerčních řešení lze uvést například iPlanet Directory Server nebo Windows 2000 Server, kde se jako součást W2K instaluje ActiveDirectory a nativním rozhraním AD je právě LDAP.
include /etc/openldap/schema/core.schema include /etc/openldap/schema/cosine.schema include /etc/openldap/schema/inetorgperson.schema include /etc/openldap/schema/nis.schema TLSCertificateFile /usr/share/ssl/certs/slapd.pem TLSCertificateKeyFile /usr/share/ssl/certs/slapd.pem TLSCACertificateFile /usr/share/ssl/certs/slapd.pem database bdb suffix "dc=my-domain, dc=com" rootdn "cn=Manager, dc=my-domain, dc=com" rootpw {MD5}HESLO directory /var/lib/openldap-data index objectClass,uid,uidNumber,gidNumber eq index cn,mail,surname,givenname eq,subinitial defaultaccess none sizelimit 100000 replica host=ldap.my-domain.com binddn="cn=replicator,dc=my-domain,dc=com" bindmethod=simple credentials=""XXXXXXX" replogfile /var/lib/ldap/ldap.replog access to dn=".*ou=group,dc=my-domain,dc=com" by dn="cn=backup,ou=admins,dc=my-domain,dc=com" read by domain=.* read access to dn=".*ou=people,dc=my-domain,dc=com" by dn="cn=backup,ou=admins,dc=my-domain,dc=com" read by domain=.* read access to "dn=.*ou=admins,dc=my-domain,dc=com" by dn="cn=backup,ou=admins,dc=my-domain,dc=com" read by * compare access to "dn=.*" by dn="cn=backup,ou=admins,dc=my-domain,dc=com" read by * read
V tomto konfiguračním souboru musíme definovat, kde má LDAP při startu hledat schéma svého stromu. Dále je možné definovat DN správce databáze a jeho heslo a přístupové práva na daný objekt databáze.
passwd: files nisplus shadow: files nisplus group: files nisplus hosts: files nisplus ldap dns ethers: files netmasks: files protocols: nisplus [NOTFOUND=return] files rpc: files services: files nisplus automount: files nisplus aliases: files nisplusV tomto souboru obsahuje každý řádek uspořádaný seznam, který určuje pořadí prohledávání. Např. pro hosts se budou prohledávat nejprve lokální soubory, pak LDAP databáze a nakonec DNS databáze.
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
Pro práci s LDAPem slouží programy jako ldapsearch, ldapadd, ldapmodify a podobně. Všechny programy používají formát LDIF (LDAP Data Interchange Format), který vypadá například takto:
dn: uid=xcieslar,ou=People,dc=fi,dc=muni,dc=cz uid: xcieslar cn: xcieslar objectClass: account objectClass: posixAccount objectClass: shadowAccount userPassword:: e2NyeXB0fXg= loginShell: /bin/bash uidNumber: 13506 gidNumber: 10100 homeDirectory: /home/xcieslar gecos: Ivo Cieslar host: aisa host: erigona host: erinys host: gorgo host: nereus host: nymfe host: oreiasLDIF obsahuje jednu dvojici atribut: hodnota na jednom řadku. Tento výpis jsme získali příkazem:
ldapsearch -H ldap://ldap.fi.muni.cz -x -b uid=xcieslar,ou=People,dc=fi,dc=muni,dc=cz
Parametry znamenají:
-H URI LDAP serveru, kterému se položí otázka -b base otázky, teda podstrom ve kterém se má vyhledávat -x použije se jednoduchá autentizace místo SASLTento příkaz najde na serveru ldap.fi.muni.cz v podstromu 'dc=fi,dc=muni,dc=cz' všechny objekty, které mají hodnotu atributu uid rovnou 'xcieslar'. Příklad modifikace LDAP databáze:
dn: uid=xcieslar,ou=People,dc=fi,dc=muni,dc=cz changetype: modify add: description description: neco
ldapmodify -H ldaps://ldap.my-domain.com -W -x -D 'cn=user,ou=my-domain,dc=com' -f xcieslar.ldif Enter LDAP Password: XXXXXXX
Pokud máte všechny uživatele pěkně na jedno místě, hrozí riziko, že zrovna daný počítač s ldap serverem nebude přístupný a tudíž se nikdo nenaloguje. Proto můžete používat sekundární LDAP servery. Kvůli uchování konzistence je nutno obsah serverů synchronizovat. K tomu slouží speciální démon zvaný slurpd. V praxi to vypadá tak, že tenhle démon jen čeká na změny (které čte ze speciálního souboru, do kterého ukládá informace o provedených operacích slapd), když nějakou změnu zjistí, přečte si, jaké operace byly provedeny a pošle požadavek na jejich provedení sekundárnímu LDAP serveru.
Především je nutné v konfiguračním souboru LDAP serveru nastavit jestli se jedná o master nebo slave. U masteru to znamená přidat položky replica s příslušnými adresami sekundární LDAP serverů. Například:
replica uri=ldaps://slave.example.com:636 binddn="cn=Replicator,dc=example,dc=com" bindmethod=simple credentials=secret
V konfiguračním souboru slave serveru nesmíte hlavně nastavovat žádné položky replica a replogfile. Dále musíte nastavit vazbu na primární server pomocí položky uptdatedn (odpovídá příslušnému binddn= v položce replica na straně masteru). Konečným krokem je nakopírování databáze primárního serveru na sekundární (záleží na použitém backendu).
OpenLDAP
Adresářové
služby - úvod do problematiky
OpenLDAP 2.2
Administrator's Guide
LDAP
Implementation HOWTO
LDAP Linux HOWTO