LDAP
LDAP (Lightweight Directory Access Protocol) je definovaný protokol pro ukládání a přístup k datům na adresářovém serveru. Podle tohoto protokolu jsou jednotlivé položky na serveru ukládány formou záznamů a uspořádány do stromové struktury (jako ve skutečné adresářové architektuře). Je vhodný pro udržování adresářů a práci s informacemi o uživatelích (např. pro vyhledávání adres konkrétních uživatelů v příslušných adresářích, resp. databázích). Protokol LDAP je založen na doporučení X.500, které bylo vyvinuto ve světě ISO/OSI, ale do praxe se ne zcela prosadilo, zejména pro svou „velikost“ a následnou „těžkopádnost“.
Protokol LDAP již ve svém názvu zdůrazňuje fakt, že je „odlehčenou“ (lightweight) verzí, odvozenou od X.500 (X.500 – Mezinárodní standard, vyvinutý spolkem International Consultative Commitee of Telephony and Telegraphy, pro formátování elektronických zpráv přenášených přes sítě nebo mezi počítačovými sítěmi).
Aplikace funguje na bázi klient-server. V komunikaci využívá jak synchronní, tak asynchronní mód. Součástí LDAP je autentizace klienta. Při provádění požadavku lze nedokončený požadavek zrušit příkazem abandon.
Adresářový server
Adresářový server umožňuje uchovávat různé typy dat. Je ale optimalizován pro data, která nevyžadují příliš časté aktualizace. Na rozdíl od relačních databází také adresářový server nepodporuje složité transakce a kontrolu referenční integrity. Tuto starost musíme v případě potřeby naprogramovat v samotné aplikaci.
Můžeme tedy říci, že je vhodným místem pro ukládání specifických informací - a to ve standardizované formě. Z přívlastku „standardizovaná“ vyplývá, že nasazení adresáře je výhodné, když uchovávaná data zapadají do definovaného standardu. Můžou jimi být třeba informace o společnostech, zaměstnancích, uživatelských účtech atd. Právě pro tyto typy dat má adresářový server předdefinována schémata (=seskupení definic tříd a atributů. Každý záznam pak musí být instancí jedné ze tříd). To vyplývá především z poptávky, adresářové služby bývají nejčastěji využívány k centralizaci dat (uživatelských, zaměstnaneckých atd.), a proto jsou pro tyto účely dostupná i schémata.
Pokud jsou totiž data ukládána způsobem definovaným pevnou specifikací, nic nebrání jejich obecnému využití ve vícero aplikacích. Ačkoli vývojáři netuší nic o konkrétní struktuře, znají alespoň nutnou „obálku“, ve které musí být data uložena. Opírají se o předdefinovaná jména atributů a mohou tak předpokládat, že v hodnotě určitého atributu je zastoupena očekávaná hodnota (např. pro uživatelské jméno je rezervován atribut uid, pro heslo k uživatelskému účtu zase userPassword). Adresářový server umožňuje spravovat informace centrálně, odděleně od konkrétní aplikace. Spojením těchto dvou vlastností (oddělená správa a specifikací určená forma) je jednoduše možné docílit toho, že k různým aplikacím přistupujeme pod stejnými uživatelskými údaji.
Tvorba vlastních schémat a objektových tříd bývá umožněna, je nutné ji ale využívat s rozmyslem. Při implementaci samotné aplikace byste totiž museli požadovat i integraci Vašeho schématu do adresářového serveru zákazníka. Snižuje se tedy výhoda snadné integrace aplikace do existujícího IT prostředí zákazníka, kterou technologie adresářových služeb nabízí.
Informační model
Úkolem informačního modelu LDAP je definovat datové typy a informace, které lze v adresářovém serveru ukládat. Data jsou uchovávána ve stromové struktuře pomocí záznamů. Pod pojmem záznam si můžeme představit souhrn atributů (dvojice jméno - hodnota). Atributy nesou informaci o stavu daného záznamu. Záznamy, uložené v adresáři, musí odpovídat přípustnému schématu. Pod pojmem schéma si představme soubor povolených objektových tříd a k nim náležících atributů. Z faktu, že každý záznam je instancí objektové třídy, vyplývá, že musí obsahovat všechny atributy vedené u dané objektové třídy jako povinné. Mimo to může obsahovat i atributy nepovinné, nicméně opět musí vybírat pouze z množiny příslušící dané objektové třídě. Viz příklad konkrétní definice objektové třídy, např. třídy person ve schématu (např. v serveru OpenLDAP je tato třída součástí základního schématu core.schema).
objectclass (2.5.6.6 NAME 'person' DESC 'RFC2256: a person' SUP top STRUCTURAL MUST (sn $ cn) MAY (userPassword$telephoneNumber$seeAlso$description))
Vidíme, že každá objektová třída je v počátku své definice jednoznačně určena svým ID a jménem. V informačním modelu je definována i dědičnost objektových tříd pomocí definice následující za klíčovým slovem SUP. Můžeme tak snadno určit, na které objektové třídě je definovaná třída založena. Následují pak definice povinných a nepovinných atributů.
I atributy musí být definovány v souboru schématu.
attributetype (2.5.4.4 NAME ('sn' 'surname') DESC 'RFC2256: last (family) name(s) for which the entity is known by' SUP name)
Výše uvedený příklad ukazuje definici atributu pro příjmení. I atribut musí být definovaný jednoznačným ID. A i atribut může být podle zákonů dědičnosti odvozen od svého předchůdce. V tomto případě je atribut sn (nebo surname) odvozen od atributu name.
Podrobnější informace o definování objektových tříd a atributů je možno hledat v literatuře či definici samotných schémat – např. v serveru OpenLDAP se jedná o soubory v adresáři etc/schema.
Je nutné připojit konstatování, že záznam nemusí být instancí pouze jedné objektové třídy. Ty jsou ve schématu uspořádány hierarchicky. A mohou být trojice různých druhů, od kterých se pak odvíjí možnost jejich využití a kombinace v definici záznamu.
- Abstract – samy nemohou být vzorem pro tvorbu záznamu. Slouží pouze jako předloha pro odvození dalších tříd.
- Structural – třídy odvozené. Právě ony slouží jako hlavní předloha pro tvorbu záznamu. Každý záznam musí ve své definici obsahovat odkaz alespoň na jednu ze strukturálních tříd. Může se dokonce odvolávat na více než jednu, ale v tomto případě musí být třídy v dědičném vztahu (např. osoba - zaměstnanec). Nelze vytvářet záznam na základě strukturálních tříd ze dvou větví (zaměstnanec - místnost).
- Auxiliary – třídy doplňkové. Takové třídy můžeme v libovolném počtu připojovat k definici záznamu. Rozšiřují počet přípustných atributů u daného záznamu.
Jmenný model
Úkolem jmenného modelu LDAP je definovat, jakým způsobem budou data v adresáři organizována a jak je možné se na ně odkazovat.
Každý záznam musí být jednoznačně identifikovatelný pomocí svého rozlišovacího jména (DN = Distinguished Name) v rámci celého stromu serveru. Musí být také jednoznačný pomocí relativního rozlišovacího jména (RDN = Relative Distinguished Name) v rámci jedné úrovně větve v adresáři. RDN se skládá ze jména a hodnoty identifikujícího atributu. Není vhodné za RDN považovat např. atribut pro křestní jméno s hodnotou Jana (givenName=Jana), protože nositelů tohoto jména může být na dané úrovni více. Vhodněji vybraným atributem může být např. emailová adresa (atribut mail) nebo uživatelské jméno pro vstup do nějakého systému (atribut uid).
K záznamům přistupujeme pomocí cesty. Cesta je synonymem pro výše zmíněné rozlišovací jméno DN. Rozlišovací jméno je závislé na zvoleném sufixu a na poloze záznamu v adresářovém stromu. Sufix je část rozlišovacího jména, která je společná všem záznamům, často bývá odvozena od lokality, nebo od internetové domény. To proto, aby zaručila danému adresáři jedinečnost (i v rámci celého světa). Např. sufix patřící firmě ABC by mohl mít následující podobu: dc=abc, dc=cz (dc je povinným atributem objektové třídy dcObject, zastupující komponenty internetové domény). Sufix je ale pouze jednou z částí, pomocí které identifikujeme záznam v rámci adresáře. A zatímco ten je pro každý záznam v adresáři shodný, další část rozlišovacího jména se musí pro každý záznam lišit. Při tvorbě rozlišovacího jména postupujeme „zdola nahoru“, na rozdíl od tvorby cest v klasickém adresářové struktuře, kde postupujeme od kořene „shora dolů“. Rozlišovací jméno poskládáme z relativních rozlišovacích jmen předchůdců daného záznamu.
Rozlišovací jméno zaměstnance z adresářového serveru firmy ABC může mít následující podobu: uid=jana.jiraskova, dc=abc, dc=cz. Zatímco pro stejného zaměstnance platí relativní rozlišovací jméno uid=jana.jiraskova.
Funkční model
Funkční model umožňuje pomocí základních operací manipulovat a přistupovat k záznamům v adresáři a měnit či zjišťovat tak jejich stav.
- Autentizační operace: Slouží k přihlášení a odhlášení uživatele pro komunikaci s adresářovým serverem. Jsou jimi míněny především operace bind a unbind. Na úspěšném provedení operace bind závisí výsledky aktualizačních a dotazovacích operací nad adresářem.
- Aktualizační a dotazovací operace: Každý adresářový server podporuje základní operace s daty, jako je vyhledávání (search), přidávání (add), mazání (delete), porovnávání (compare) a modifikace (modify) záznamů. Tyto operace bývají často spjaté s nastavením bezpečnostního modelu. Opět je můžeme provádět buď přímo pomocí pomocných programů, které bývají součástí jednotlivých implementací adresářového serveru (např. server OpenLDAP umožňuje využít přímo programů ldapadd.exe pro přidávání, ldapmodify.exe pro modifikaci atd.), nebo pomocí knihoven jednotlivých programovacích jazyků.
Bezpečnostní model
Úkolem bezpečnostního modelu je zabránit přístupu neoprávněné osoby k informacím v adresáři.
Autentizace
Úkolem autentizace je ověření identity uživatele, který se snaží o spojení s adresářovým serverem. Uživatel může být autentizován několika způsoby.
- Anonymní autentizace – v rámci operace bind nejsou serveru předávány žádné informace nesoucí identitu či heslo uživatele.
- Jednoduchá autentizace – pomocí DN a hesla (atributu userpassword). Tuto autentizaci je možno provádět i na bezpečném kanále TLS/SSL. V tomto případě nejprve dojde k výměně certifikátů obou stran (serveru i klienta). Teprve po ověření těchto certifikátů dojde k otevření spojení a vyvolání operace bind.
- Proxy autentizace – využívá existence definovaného uživatele, který má právo nahlížet na hesla ostatních uživatelů. Autentizace požadovaného uživatele tedy probíhá přes tento mezičlánek, který může například pomocí operace compare porovnat platnost zadaných údajů.
- PKI autentizace – založená na principu PKI digitálních certifikátů, které jsou uloženy v definovaném atributu userCertificate. Při pokusu o autentizaci je uživatel požádán o zadání svého hesla a autentizován je po srovnání digitálních certifikátů na straně klienta a serveru. Tento druh autentizace je obtížný jak pro uživatele, tak pro administrátory serveru, protože obě strany musí své certifikáty v případě potřeby aktualizovat.
- SASL mechanizmus – disponuje množstvím zásuvných modulů, které můžeme využít pro autentizaci uživatele.
V adresářovém serveru proběhne autentizace úspěšně v případě, že dané uživatelské jméno bude připadat nějakému existujícímu záznamu. A rozlišovací jméno tohoto záznamu obsahuje atribut s heslem (userPassword) se stejnou, jako zadanou, hodnotou.
Podobným způsobem probíhá i autentizace správce celého adresáře, jehož rozlišovací jméno definujeme v konfiguračním souboru implementace adresářového serveru (např. OpenLDAP). Jen s tím rozdílem, že danému uživateli přísluší heslo, které není uchováno v adresáři, ale ve zmíněném konfiguračním souboru.
To sebou přináší i nutná bezpečnostní opatření. Jelikož hesla jsou velmi citlivá a nepřejeme si jejich zveřejnění, můžeme v adresářovém serveru využívat možností jejich ukládání v šifrované podobě (podle dostupných šifrovacích algoritmů). Implementace adresářových serverů nejednou obsahují programy pro šifrování hesel (např. v OpenLDAP můžeme využít programu slappasswd.exe, který podporuje jako výchozí algoritmus SSHA, můžeme jej však atributem programu změnit). Veškerá hesla je tedy doporučeno ukládat v šifrované podobě – jak atributy userPassword, tak i heslo správce adresáře v konfiguračním souboru.
K některým operacím není nutné být autentizován, záleží na nastavení přístupových práv, pak můžeme využít i anonymní autentizace.
Autorizace
Autorizace úzce souvisí s mechanizmem autentizace a nastupuje po jejím úspěšném ukončení. Jejím úkolem je zajistit, aby měl autentizovaný uživatel přístup pouze k datům a operacím, ke kterým je oprávněn. Tato problematika tedy úzce souvisí s nastavením přístupových práv k záznamům a atributům.
Přístupová práva můžeme nastavit až na úroveň jednotlivých atributů. Pokud se jedná o adresář, ve kterém ukládáme přístupové informace jednotlivých uživatelů, mohlo by se nám zdát vhodné toto nastavení: Uživatel má právo write na všechny své atributy, právo read na atributy ostatních uživatelů, mimo atributu userPassword ostatních uživatelů, na které nemá právo ani read (nemá právo si ho tedy vůbec prohlížet). Nastavení pak může v konfiguračním souboru serveru OpenLDAP vypadat následovně:
access to * by self write by * read access to attr = userPassword by self write by * none
Nastavení přístupových práv jsou velmi mocná. Mimo zmíněných práv read, write a none existují další. Např. právo compare umožňuje znát výsledek porovnávací operace, aniž by uživatel musel mít právo dané atributy číst.
Odkazy
Reference
Literatura
- THOMAS, M.T.: Zabezpečení počítačových sítí bez předchozích znalostí. CP Books. 1. vyd. Brno 2005.
- MATHEW N., STONES R.: Linux Programujeme profesionálně. CP Books. 1. vyd. Brno 2003.
- BOLLINGER G., NATARAJAN B.: JSP Java Server Pages – podrobný průvodce začínajícího tvůrce. Grada Publishing. 1. vyd. Praha 2003.