Lightweight Directory Access Protocol: LDAP

Lukáš Holčík, xholcik1@fi.muni.cz


Obsah

  1. Co je LDAP?
  2. Implementace
  3. Instalace a konfigurace OpenLDAP
  4. Adresářová služba a adresář
  5. Schéma
  6. Nástroje pro práci s LDAP
  7. Autentizace a autorizace
  8. posixAccount a shadowAccount
  9. Příklady
  10. Zabezpečení
  11. Replikace
  12. NSCD
  13. Prameny

1. Co je LDAP?

Lightweight Directory Access Protocol je protokol určený k dotazování a modifikování obsahu adresářových služeb. Jedná se o odlehčenou verzi těžko implementovatelných protokolů definovaných v X.500 - především používá pro přenos TCP/IP, což napomohlo jeho rozšíření. Současná verze LDAP je LDAPv3 definovaná v RFC 3377. Pod pojmem LDAP se ale nerozumí jen přenosový protokol, ale také adresářový server.

2. Implementace LDAP

  1. Komerční: Sun (NIS), IBM, Microsoft (Active Directory), Apple (Open Directory), AOL/Netscape, Novell (eDirectory) a Oracle (Oracle Internet Directory)
  2. Open source: OpenLDAP

3. Instalace a konfigurace OpenLDAP

Instalace (Debian)

apt-get install slapd ldap-utils libnss-ldap libpam-ldap nscd gq
slapd: stand-alone LDAP server
ldap-utils: klientské utility
libnss-ldap: Name Service Switch, který umožňuje LDAP serveru fungovat jako Name service
libpam-ldap: LDAP moduly do PAM
nscd: Name Service Caching Daemon
gq: gtk klient

Konfigurace (slapd.conf)

# Schema and objectClass definitions
include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/inetorgperson.schema

# Schema check allows for forcing entries to
# match schemas for their objectClasses's
schemacheck     on

# ...

#######################################################################
# Specific Backend Directives for bdb:
# Backend specific directives apply to this backend until another
# 'backend' directive occurs
backend		bdb
checkpoint 512 30

#######################################################################
# Specific Directives for database #1, of type bdb:
# Database specific directives apply to this databasse until another
# 'database' directive occurs
database        bdb

# The base of your directory in database #1
suffix          "dc=localdomain"

# Where the database file are physically stored for database #1
directory       "/var/lib/ldap"

# Indexing options for database #1
index           uid objectClass eq

# Save the time that the entry gets modified, for database #1
lastmod         on

rootdn          "cn=admin,dc=localdomain"
rootpw          secret # lze zadat i hash vygenerovany pomoci slappasswd(8)

4. Adresářová služba a adresář

Adresářová služba

Aplikace, která čte, modifikuje a ukládá data v adresáři. Neměla by být zaměňována s adresářem, což je pouze databáze objektů, které ona zpřístupňuje. Adresářová služba je rozhraním k adresáři, provádí autentizaci a poskytuje přístup k datům.

Adresář

Je založený na modelu X.500: Jedná se o strom, v němž každý uzel je objektem tvořeným množinou pojmenovaných atributů. Každý atribut může mít jednu nebo více hodnot. Většina služeb používá strom s právě jedním vrcholem. Bývá zvykem, že struktura adresáře odráží organizační nebo geografickou strukturu. V dnešní době se často používají DNS jména pro jednotlivé úrovně adresáře. Dále mohou být objekty v databázi např. lidé, organizační celky, tiskárny, dokumenty, atd..

Každý uzel v adresáři je určen jednoznačným jménem: tzv. Distinguished Name (DN), které je složeno z Relative Distinguished Name (RDN) a z DN rodičovského elementu.

LDAP je binární protokol, proto se k popisu uzlů používá textový formát LDIF (LDAP Data Interchange Format). Uzel vyjádřený v LDIF může vypadat např. takto:

dn: cn=John Doe,dc=example,dc=com
cn: John Doe
givenName: John
sn: Doe
telephoneNumber: +1 555 6789
telephoneNumber: +1 555 1234
mail: john@example.com
manager: cn=Barbara Doe,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top

DN objektu nepatří mezi jeho atributy, je to název. LDAP nedefinuje pořadí atributů, takže server může vracet hodnoty v atributu, atributy v objektu a objekty ve výsledku vyhledávání v libovolném pořadí.


5. Schéma

Obsah uzlů ve stromu je definován pomocí schémat. Schéma definuje atributy, které uzel musí/může obsahovat, a jejich formáty. Implementace OpenLDAP je distribuována s několika schématy uloženými jako /etc/ldap/schema/*.schema. Tyto definice jsou zohledněny direktivou "include" v /etc/ldap/slapd.conf:

include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/inetorgperson.schema

Jeden uzel ve stromu může být definován pomocí jednoho nebo více schémat. Ta se definují atributem objectClass (viz. příklad výše). Stejně jako objekty v adresáři jsou i schémata uspořádána v hierarchii na základě dědičnosti. Je-li objektu v objectClass priřazeno schéma, jsou mu automaticky přiřazeni i všichni předkové uvedeného schématu. Na vrcholu hierarchie dědičnosti je třída "top".

Specifikace schémat a návod k vytvoření vlastního schématu můžete najít na http://www.openldap.org/doc/admin23/schema.html


6. Nástroje pro práci s LDAP

Server (slapd)

slapcat - výpis celé databáze v LDIF formátu
slappasswd - vygeneruje hash hesla ve formátu použitelném ve slapd.conf
slaptest - zkontroluje správnost slapd.conf
slurpd - ldap replikační démon
slapd - ldap démon

Klient (ldap-utils)

ldapsearch - vyhledání
ldapadd, ldapmodify, ldapdelete - přidávávání, modifikace a mazání
ldapmodrdn - přejmenování rdn
ldappasswd - mění heslo ldap objektu
ldapwhoami - kdo jsem?

Můžeme použít i gtk klient GQ.


7. Autentizace a autorizace

Autentizace klienta serveru se označuje jako bind. Bind ověřuje heslo s atributem userPassword daného DN (-D 'uid=karel,dc=localdomain'). Důležité tedy je, že pro LDAP neexistuje externí záznam pro uživatele, nýbrž tito jsou uloženi v LDAP stromu spolu s ostatními objekty. Připojení bez uvedeného DN a hesla nastaví připojení do stavu anonymous.

Autorizace je nastavena v /etc/ldap/slapd.conf

Příklady konfigurace:

access to attrs=userPassword
        by dn="cn=admin,dc=localdomain" write
        by anonymous auth
        by self write
        by * none

Překlad: Pro všechny atributy userPassword nastav, že cn=admin,dc=localdomain je může měnit, anonymní uživatel se musí autentizovat nebo má smůlu, vlastník (ten, který se přihlásí pod DN objektu) ho může měnit a jinak ho nesmí nikdo ani číst.

access to *
        by dn="cn=admin,dc=localdomain" write
        by * read

Překlad: Nastav pro všechny objekty, že cn=admin,dc=localdomain je může měnit a všichni ostatní je mohou číst.

Pro úplnou specifikaci nastavení autorizace můžete nahlédnou na: http://www.openldap.org/doc/admin22/slapdconfig.html#Access Control

8. posixAccount, shadowAccount

Schémata, která jsou vystavěna tak, že mohou fungovat jako jako záznamy z /etc/passwd. Jsou určeny k autentizaci (PAM) a získávání informací (NSS) o uživatelích. Schémata posixAccount a shadowAccount z nis.schema:
objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount' SUP top AUXILIARY
        DESC 'Abstraction of an account with POSIX attributes'
        MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )
        MAY ( userPassword $ loginShell $ gecos $ description ) )

objectclass ( 1.3.6.1.1.1.2.1 NAME 'shadowAccount' SUP top AUXILIARY
        DESC 'Additional attributes for shadow passwords'
        MUST uid
        MAY ( userPassword $ shadowLastChange $ shadowMin $
              shadowMax $ shadowWarning $ shadowInactive $
              shadowExpire $ shadowFlag $ description ) )

9. Příklady

Často používané parametry:

-D 'cn=admin,dc=localdomain' : za koho se vydávám
-x : použij jednoduchou autentizaci
-W : zeptej se na heslo
-f /tmp/file.ldif : načti vstup ze souboru
-H ldap://ldap.fi.muni.cz : použitý LDAP server

Vyhledání

# vyhledání skupin na fi, jejichž členem je objekt s uid 'staudek'
$ ldapsearch -x -H ldap://ldap.fi.muni.cz -b 'ou=Group,dc=fi,dc=muni,dc=cz' \
    '(&(objectClass=posixGroup)(memberUid=staudek))'
Specifikace syntaxe pro vyhledávání vč. příkladů viz. RFC2254

Přidání

# vytvoření LDIF souboru pro přidání do adresáře
$ cat > /tmp/new.ldif << "EOF"
dn: uid=bond,dc=agaue,dc=lab,dc=fi,dc=muni,dc=cz
cn: bond
uid: bond
uidNumber: 10
gidNumber: 1000
homeDirectory: /home/bond
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: heslo
loginShell: /bin/bondshell
gecos: James Bond
description: chlapek
EOF

$ ldapadd -xW -D 'cn=admin,dc=agaue,dc=lab,dc=fi,dc=muni,dc=cz' \
        -f /tmp/new.ldif

Modifikace

cat > /tmp/modify.ldif << "EOF"
dn: uid=bond,dc=agaue,dc=lab,dc=fi,dc=muni,dc=cz
changetype: modify
replace: loginShell
loginShell: /bin/bash
-
delete: description
EOF

$ ldapmodify -xW -D 'cn=admin,dc=agaue,dc=lab,dc=fi,dc=muni,dc=cz' \
        -f /tmp/modify.ldif

Mazání

$ ldapdelete -xW -D 'cn=admin,dc=agaue,dc=lab,dc=fi,dc=muni,dc=cz' \
        'uid=bond,dc=agaue,dc=lab,dc=fi,dc=muni,dc=cz'

10. Zabezpečení

LDAPv3 používá 3 druhy autentizace. Anonymous, simple a přes SASL. Anonymous je spojení bez bind, simple je přenos hesla v plaintextu a SASL je Simple Authentication and Security Layer pomocí balíku Cyrus SASL ( http://asg.web.cmu.edu/cyrus/download/). Podrobně popsaná je spolupráce se SASL na http://www.openldap.org/doc/admin23/sasl.html.

11. Replikace

O replikaci se stará démon slurpd, který je součástí balíku slapd. Při konfiguraci slapd.conf rozlišujeme, jestli se jedná o master server nebo slave server. Konfigurace master:

replogfile /var/lib/ldap/ldap.replog
replica uri=ldap://slave.localdomain
        binddn="cn=Replicator,dc=localdomain" #  DN se zapisem do databaze
        bindmethod=simple credentials=secret

Konfigurace slave:

updatedn cn=Replicator,dc=localdomain

Více viz. http://www.openldap.org/doc/admin23/replication.html


12. Praktické použití pro autentizaci uživatelů

Konfigurace PAM

Tady potřebujeme mít nainstalovanou knihovnu /lib/security/pam_ldap.so. Aby naše programy používaly LDAP přes PAM, musíme doplnit příslušné řádky do souborů v /etc/pam.d/*. Např. pro /etc/pam.d/login:

auth        required      pam_nologin.so
auth        sufficient    pam_ldap.so
auth        sufficient    pam_unix.so shadow use_first_pass
auth        required      pam_deny.so

account     sufficient    pam_unix.so
account     sufficient    pam_ldap.so
account     required      pam_deny.so

Potom nastavíme PAM, aby uměl komunikovat s LDAPem (/etc/pam_ldap.conf(5)):

host 127.0.0.1
base dc=localdomain

Konfigurace Name Service Switch

Pro spolupráci ldap s NSS máme nainstalovanou knihovnu nss_ldap. S nastavením NSS začneme u souboru /etc/nsswitch.conf, kde připíšeme "ldap" tam, kde cheme, aby se ldap používal. Řetězec "ldap" znamená, že pro vyhledávání se použije knihovna libnss_ldap.so.

passwd:     files ldap
shadow:     files ldap
group:      files ldap
Dále musíme nastavit NSS, aby stejně jako PAM věděl, jak má komunikovat s LDAPem. Do souboru /etc/libnss-ldap.conf napíšeme:
host 127.0.0.1
base dc=localdomain

Více viz. libnss-ldap.conf(5)


13. NSCD

Abychom zabránily dotazům na LDAP server pokaždé, když pustíme příkaz typu ls -l /home, je dobrým nápadem nakonfigurovat na stanicích nscd, aby kešoval tato data. Dokud jsou data v keši platná, používají se namísto dotazování se znovu na server. Konfigurace (/etc/nscd.conf(5)):

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

14. Prameny