LDAP - Lightweight Directory Access Protocol

Tomáš Kramoliš, xkramol@fi.muni.cz


Obsah


Adresářová služba

LDAP je příkladem tzv. adresářové služby (directory service). To znamená, že klientům poskytuje přístup k nějak organizovaným a strukturovaným datům podobně jako třeba telefonní seznam. Databáze může obsahovat např. seznam zaměstnanců, jejich jména, e-maily, telefony, informace o jejich UNIXovských účtech, uživatelská nastavení programů. Také třeba informace o různých přístrojích (kopírky, ...), kancelářích - jejich umístění, čísla budov,...

Optimalizováno je především vyhledávání. Předpokládá se, že modifikace údajů nebude příliš častá.


Původ

Nejprve ITU (International Telecommunication Union) vytvořila sérii e-mailových standardů vyžadující adresář jmen (a dalších informací) přístupný napříč sítěmi - X.500. Součástí je DAP (Directory Access Protocol) - protokol pro přístup k síťové adresářové službě.

DAP je ovšem dost težkopádný, operuje přes všechny vrstvy OSI, je výpočetně náročný.

V roce 1993 tak vzniká jeho odlehčená verze LDAP (Lightweight Directory Access Protocol). Původně fungovaly LDAP servery jako brány mezi uživatelem a DAP serverem. Časem se přešlo na čistě LDAPovské servery.


Implementace LDAP serverů

OpenLDAP, Apache Directory Server, CA eTrust Directory, Fedora Directory Server , Red Hat Directory Server, Novell eDirectory, Sun Directory Server Enterprise Edition IBM SecureWay Directory, IBM Tivoli Directory Server, Windows Server 2003 Active Directory, Siemens DirX, Oracle Internet Directory, tinyldap, ...


Struktura LDAP databáze

Adresář je tvořen stromem objektů (záznamů) a tvoří tak directory information tree (DIT).
Objekt je tvořen množinou atributů.
Atribut má jméno, tedy i typ a popis, a aspoň jednu hodnotu.
Definice atributů je popsána schematem (formát ASN.1).

Na jedné úrovni stromu má každý objekt různé Relative Distinguished Name (RDN). Objekt je v celé stromové hierarchii jednoznačně určen svým Distinguished Name (DN), což je RDN objektu a RDN jeho předchůdců ve stromu. Je to tedy stejný koncept jako relativní a absolutní cesta k souboru.

Příklad:
DN: uid=kas,ou=People,dc=fi,dc=muni,dc=cz
RDN: uid=kas


Zprovoznění OpenLDAP serveru

  1. Stáhnout software - OpenLDAP download page: http://www.openldap.org/software/download/.
  2. Konfigurace, kompilace
    configure
    make depend
    make
    make test - volitelně (několik minut)
    su -c 'make install' - implicitně instaluje do /usr/local
  3. Konfigurace slapd.conf(5)
    Implicitní umístění: /usr/local/etc/openldap/slapd.conf
    	include         /usr/local/etc/openldap/schema/core.schema
    	include         /usr/local/etc/openldap/schema/cosine.schema
    	include         /usr/local/etc/openldap/schema/nis.schema
    
    	# BDB database definitions
    	database        bdb
    	suffix          "dc=lab,dc=fi,dc=muni,dc=cz"
    	directory       /usr/local/var/openldap-data
    
    	rootdn          "cn=Manager,dc=lab,dc=fi,dc=muni,dc=cz"
    	rootpw          secret
    
    Databází může být více pod jedním serverem i různých druhů.
    rootdn je DN správce databáze, rootpw jeho heslo (může být uvedena hash, viz. slappasswd(8)).
  4. Spuštění slapd(8) (/usr/local/libexec/slapd)

Manipulace s databází

Pro přidání záznamů online je potřeba postup podobný tomuto:
Vytvořit textový soubor s přidávanými záznamy ve formátu LDIF.
Např. soubor example.ldif:

	dn: dc=lab,dc=fi,dc=muni,dc=cz
	objectclass: dcObject
	dc: lab

	dn: cn=Manager,dc=lab,dc=fi,dc=muni,dc=cz
	objectClass: organizationalRole
	cn: Manager
	description: Directory Manager
Do databáze se záznamy uloží například příkazem:
	ldapadd -xW -D 'cn=Manager,dc=lab,dc=fi,dc=muni,dc=cz' -f example.ldif

Další nástroje

ldapadd, ldapmodify, ldapdelete - přidávání, modifikace a mazání
ldapmodrdn - přejmenování RDN
ldappasswd - mění heslo ldap objektu

Offline nástroje

slapadd - vytvoření databáze.
slapindex - znovuvytvoření indexů.
slapcat - export databáze do souboru v LDIF.

Vyhledávání

Například pomocí ldapsearch(1):
	ldapsearch -x -H ldap://ldap.fi.muni.cz -b 'ou=Group,dc=fi,dc=muni,dc=cz' \
		'(&(objectClass=posixGroup)(memberUid=staudek))'
Parametr -x zapíná použití jednoduché autentizace místo SASL.
-b searchbase určuje kořen prohledávaného podstromu.
Filtr obsahuje atributy a příslušné hodnoty, které musí hledaný objekt obsahovat (např.: (mail=john*)). Tyto výrazy lze použít jako operandy prefixově zapsaných logických operátorů. Př.:
	(&(objectClass=person)(|(givenName=John)(mail=john*)))

Řízení přístupu

Konfigurační soubor slapd.conf může obsahovat nastavení přístupových práv k objektům a atributům. Za uživatele, jejichž práva jsou nastavována, se považují objekty v databázi. Neexistuje tedy žádný externí seznam uživatelů - je nutné se vydávat za objekt (přepínač -D u lpdasearch).

Příklad nastavení práva zápisu všech objektů pro Managera a čtení pro ostatní:

     access to *
            by dn="cn=Manager,dc=lab,dc=fi,dc=muni,dc=cz" write
            by * read


PAM, NSSwich a nscd

LDAP může fungovat jako zdroj systémových tabulek. Do databáze se uloží informace o uživatelích podobně, jako je tomu v /etc/passwd a /etc/shadow. Formát těchto objektů určují třídy posixAccount, posixGroup a shadowAccount ze schématu nis.schema.

Třída posixAccount:

	objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount'
		DESC 'Abstraction of an account with POSIX attributes'
		SUP top AUXILIARY
		MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )
		MAY ( userPassword $ loginShell $ gecos $ description ) )

Konfigurace PAM

Aby se uživatelé mohli přihlašovat přes LDAP nebo přes shadow, je potřeba mít v /etc/pam.d/login řádky podobné těmto:

	auth        sufficient    pam_ldap.so
	auth        sufficient    pam_unix.so nullok try_first_pass
Dále je potřeba nadefinovat LDAP server v /etc/ldap.conf:
	host 127.0.0.1
	base dc=lab,dc=fi,dc=muni,dc=cz

Konfigurace NSSwich

NSSwich komunikuje s LDAP serverem pomocí knihovny nss_ldap.so. Tuto možnost lze v souboru /etc/nsswitch.conf lze nastavit například takto:

	passwd:     files ldap
	shadow:     files ldap
	group:      files ldap
Také používá /etc/ldap.conf.

Daemon nscd

Name service cache daemon nscd slouží k ukládání odpovědí LDAP (a DNS) serveru do cache. Sníží se tak provoz na síti a zatížení serveru.
Konfigurace v /etc/nscd.conf(5):

	enable-cache            passwd          yes
	positive-time-to-live   passwd          600
	...


Replikace

Propagaci databáze zajišťuje daemon slurpd(8).

Master i slave server by na měli mít stejný slapd.conf soubor, až na nastavení replikace. Pokud už master má existující databázi, je potřeba ji zkopírovat na slave - např. celý adresář s databází, nebo pomocí slapcat a slapadd.

Konfigurace replikace (slapd.conf):
Master:

	replica uri=ldap://slave.example.com
		binddn="cn=Manager,dc=lab,dc=fi,dc=muni,dc=cz"
		bindmethod=simple credentials=secret
	replogfile /usr/local/var/ldap.replog
Slave:
	updatedn cn=Manager,dc=lab,dc=fi,dc=muni,dc=cz
	updateref ldap://master.example.com
Master server zapisuje informace o změnách databáze do replogfile. Replikační daemon slurpd tento log sleduje a pokud dojde ke změně, pošle změny slave serveru pomocí LDAP. Autorizuje se jako binddn (tj. totéž jako updatedn). Nedoporučuje se, aby binddn byl stejný jako rootdn, ale jiný objekt s právem zápisu ve slave db. Pokud se někdo pokouší provést změny na slave serveru, je odkázán na updateref server.

OpenLDAP Software 2.3 Administrator's Guide:
Note: ldapmodify(1) and other clients distributed as part of OpenLDAP Software do not support automatic referral chasing (for security reasons).

Zdroje