Systémy pro sdílení uživatelů (LDAP)

Ivo Cieslar, xcieslar@fi.muni.cz


Obsah


Princip protokolu

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.


Co je to LDAP

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.


Co je adresář

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í.


Jak jsou informace strukturované

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|
	|...            | |      | |...            |
	+---------------+ |      | +---------------+
			  |      |
			...      ...

Odkazování informací

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.


LDAP schéma

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.


Software

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.


Konfigurace OpenLDAP

slapd.conf

Hlavní konfigurační soubor OpenLDAPu je /etc/openldap/slapd.conf a může vypadat takto:
	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.

nsswitch.conf

Tento soubor definuje jakým způsobem se mají pro různé systémové tabulky vyhledávat informace. To znamená napr. pro databázi uživatelů nebo překlad jmen (DNS) nebo pro databázi služeb (standardně v /etc/services). Soubor vypadá například takto:
	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 nisplus
V 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.

nscd a nscd.conf

nscd (Name Service Cache Daemon) je démon, který vytváří cache pro dotazy na různé systémové tabulky. Konfigurační soubor se nachází v /etc/nscd.conf a vypadá například takto:
	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


Práce s LDAP

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: oreias
LDIF 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 SASL

Tento 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:


Replikace údajů (slurpd)

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.

Stručně jak na to

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).


Literatura

OpenLDAP
Adresářové služby - úvod do problematiky
OpenLDAP 2.2 Administrator's Guide
LDAP Implementation HOWTO
LDAP Linux HOWTO