Využití LDAPu v praxi

Linuxový intranetový/internetový server

Zdeněk Burda

Avnet s.r.o.

V Olšinách 75 Praha 10
          110 00

$Id: ldap.xml,v 1.14 2007-07-22 18:49:51 tsunami Exp $


Obsah

Úvod
1. TODO
1. Trochu teorie na začátek
1.1. Adresářové služby
1.2. Popis LDAPu
1.2.1. Distinguished name
1.2.2. Atributy
1.2.3. Object class
1.3. Popis LDIFu
2. Infrastruktura použité testovací sítě
3. LDAP protokol a důvod jeho použití
4. Adresářový server
4.1. Instalace
4.2. Konfigurace
4.2.1. Nástroje pro práci s adresářem
4.2.2. TLS
4.2.3. Replikace
4.2.4. Firewall
4.3. Ono to nefunguje!
5. Kerberos
6. Ověření uživatele pro přihlášení do systému
6.1. Jmenné služby
6.1.1. Datová struktura LDAPu
6.1.2. libnss-ldap
6.1.3. nscd
6.2. PAM
6.3. pam_ldap
6.4. pam_ccred
7. Domácí adresáře uživatelů
7.1. pam_mkhomedir
7.2. pam_mount
7.3. autofs
7.3.1. Instalace a konfigurace autofs
8. Poštovní subsystém
8.1. SMTP
8.2. IMAP/POP3
8.2.1. Uživatelé v systému
8.2.2. "Virtuální" uživatelé
8.3. LDAP jako adresář pro MUA
8.3.1. Thunderbird
8.3.2. Mutt
9. FTP
9.1. vsftpd
10. WWW
10.1. apache2
11. SAMBA
12. Překlad jmen počítačů na IP a naopak
12.1. Náhrada za /etc/hosts
12.2. DNS - Bind9
13. DHCP
14. VPN
15. INN
16. Fedora Directory Server
16.1. Instalace
A. RFC
B. Použité LDIF soubory
B.1. base.ldif
B.2. group.ldif
B.3. user.ldif
C. Odkazy na zdroje
D. Skripty pro správu uživatelů v LDAPu
D.1. Instalace a nastavení
D.2. Skripty ke stažení
Slovníček

Úvod

Toto je pracovní verze dokumentu, poslední verzi najdete vždy na http://ldap.zdenda.com.

Snad už všechny síťově operační systémy umožňují centralizovanou správu uživatelských účtů případně dalších informací. Pro ukládání informací o účtech je velmi vhodné použít adresář. Tento dokument popisuje jak nainstalovat a nastavit síťové služby s využitím adresářového serveru. Pokusím se co nejvíce využít free a opensource software (Linux, FreeBSD), ale také popíšu konfiguraci pro operační systémy Solaris a Microsoft Windows.

1. TODO

  • Zabezpečení připojení k LDAPu
  • Přepsat autofs tak aby to bylo srozumitelné
  • Rozepsat se víc o PAMu

Kapitola 1. Trochu teorie na začátek

1.1. Adresářové služby

Adresářová služba (dále budu používat pouze adresář) slouží jako centrální úložiště pro spoleřná data, která umí velmi rychle poskytovat. Data o které se adresářová služba stará jsou spíš neměnná, velmi rychle dohledatelná, nepotřebují transakční zpracování. Od adresářové služby je požadována velmi rychlá odpověď a stabilita (jedná se o centrální systém).

Data která se uchovávají v adresáři jsou o lidech (jméno uživatele, login,, telefon, adresa, konfigurace software atd.), data aplikací (konfigurace a umístění jednotlivých komponent systému a podobně) a jmenné služby (hosts, services, skupiny, uživatelé). Klienty adresáře jsou operační systémy, systémy pro správu přístupu k aplikacím, databáze, webový server, mailserver.

Adresář je optimalizován pro velký počet požadavků na čtení (tisíce čtení na jednu zápisovou operaci). Adresář není relační databáze, není optimalizován pro časté zápisy.

Nejčastěji používaným protokolem pro komunikaci s adresářovým serverem je LDAP.

1.2. Popis LDAPu

LDAP je standardizovaný komunikační protokol pro adresářové služby přes TCP/IP. LDAP data jsou uchovávána v záznamech, které jsou organizovány ve stromové struktuře (Directory Information Tree - DIT). Nejvyšší záznam v DIT se nazývá suffix nebo také root suffix.

Záznam v LDAPu se skládá ze tří základních prvků:

  • Distinguished name (DN) - unikátní název záznamu.
  • Atributy - popisují záznam
  • Object classes - určují typ záznamu

Které object class a atributy můžete u záznamu použít předepisuje directory schema. Je možné si schema upravit na míru, rozšířit tím záznamy o další atributy, které potřebujete.

1.2.1. Distinguished name

Každý záznam v LDAPu, tedy položka v jeho stromové struktuře (DTI) má přiřazené distinguished name (DN), které je unikátni. DN je složeno z atributů a jejich hodnot. Běžně se využívají atributy dc (domainComponent), o (organization), ou (organizationalUnit), uid (userid) a cn (common name), ale jejich využití není nutné.

Ukázka DN: uid=burdaz,ou=people,o=intranet,dc=example,dc=net

První atribut s hodnotou v DN se nazývají relative distinguished name (RDN). Pro naše vzorové DN je RDN uid=burdaz. Řetězec atributů a hodnot popisuje kde se záznam ve stromové struktuře (DIT) nachází.

1.2.2. Atributy

Atributy popisují záznam, který je obsahuje. Atributy obsahují různá data jako jsou jméno, číslo telefonu, email... Definice každého atributu je součástí schematu. Definice obsahuje informace o datovém typu, jestli je citlivý na velikost písmen, jestli může být atribut uveden v jednom záznamu jednou nebo vícekrát.

  • cn - plné jmeno - Zdeněk Burda
  • sn - příjmení - Burda
  • uid - unikátní identifikátor (použitelný například jako login to aplikací) - burdaz
  • userpassword - heslo - nějaký hash hesla
  • email - emailová adresa - nejaky.email@example.net

1.2.3. Object class

1.3. Popis LDIFu

Kapitola 2. Infrastruktura použité testovací sítě

  • srv.example.net

    • OS: GNU/Linux Debian
    • Shell
    • IP: 10.0.0.10

    Pouze shell server, na kterém si uživatelé můžou dělat co chtějí. Domácí adresáře uživatelů jsou mountované z serveru file.example.net automounterem přes NFS.

  • www.example.net

    • OS: GNU/Linux Debian
    • HTTP
    • FTP
    • IP: 10.0.0.11

    Web server a FTP server, zpřístupňuje uživatelské souboury veřejnosti. Uživatelské adresáře jsou mountované z počítače file.example.net přes NFS. Na serveru nemá žádný uživatel shell konto.

  • mail.example.net

    • OS: GNU/Linux Debian
    • SMTP
    • IMAPs
    • POP3s
    • IP: 10.0.0.12

    Mail server, který přijímá a odesílá poštu uživatelů, skenuje ji proti virům a spamu. Emaily se ukládají na server file.example.net. Na serveru nejsou žádná uživatelská shell konta. Server zpřístupňujě poštu uživatelům pomocí IMAPs nebo POP3s protokolu. Podle plánované zátěže lze samozřejmě jednotlivé služby rozdělit na více počítačů.

  • ldap.example.net

    • OS: GNU/Linux Debian stable (Sarge)
    • LDAP
    • IP: 10.0.0.13

    Na tomto stroji běží adresářový server. Stroj je velmi důležitý, proto na něm nejsou žádné další služby a také na něm nejsou žádná uživatelská konta.

  • ldap2.example.net

    • OS: GNU/Linux Debian
    • LDAP
    • IP: 10.0.0.14

    Server slouží jako záloha v případě výpadku ldap.example.net.

  • file.example.net

    • OS: GNU/Linux Debian
    • NFS
    • SAMBA
    • IP: 10.0.0.15

    Na tomto serveru jsou všechny soubory uživatelů, jejich pošta, weby a domácí adresáře. Je to prostě file server. Soubory sdílíme přes SAMBU (pro hlavně MS Windows) a přes NFS.

  • gw.example.net

    • OS: GNU/Linux Debian
    • VPN
    • Vnější firewall
    • IP: 10.0.0.1

    Server slouží jako vnitřní firewall a také jako VPN brána.

Obrázek 2.1. Struktura testovací sítě

Struktura testovací sítě


Kapitola 3. LDAP protokol a důvod jeho použití

??? vychází z protokolu ???, zjednodušuje jeho komunikační protokol, ale bežné použití nabízí více zajímavých funkcí než X.500. Tak jako X.500 i LDAP nabízí datový model pro adresář a protokol pro dotazy a jeho aktualizaci. Více informací najdete v RFC (příloha A – „RFC) a na webu OpenLDAPu. LDAP protokol není určen pro transakce, proto nekonkuruje klasickým SQL databázím. Protokol LDAP je optimalizován na čtení.

Kapitola 4. Adresářový server

4.1. Instalace

Instalace čehokoliv co je součástí distribuce Debian je docela pohodová. Skládá se většinou ze spuštění programu apt-get a někdy je potřeba trochu přiohnout konfigurák dané aplikace. U OpenLDAPu je pro instalaci následující postup: spustíte instalaci pod uživatelem root pomocí příkazu apt-get install slapd a vyplníte doménu (Obr. 4.1 – „instalace slapd - zadání domény“), organizaci(Obr. 4.2 – „instalace slapd - zadání organizace“), zadáte heslo admina (Obr. 4.3 – „instalace slapd - heslo admina“) a zvolíte >No< pro zakázání LDAPv2(Obr. 4.4 – „instalace slapd - zákaz LDAPv2“).

  • Doména: example.net
  • Organizace: Example Org
  • Heslo: demo1234
  • LDAPv2: No

Obrázek 4.1. instalace slapd - zadání domény

instalace slapd - zadání domény

Obrázek 4.2. instalace slapd - zadání organizace

instalace slapd - zadání organizace

Obrázek 4.3. instalace slapd - heslo admina

instalace slapd - heslo admina

Obrázek 4.4. instalace slapd - zákaz LDAPv2

instalace slapd - zákaz LDAPv2

4.2. Konfigurace

Konfigurace adresářového serveru je uložena v souboru /etc/ldap/slapd.conf, schémata jsou v adresáři /etc/ldap/schema/. Po instalaci by měl být soubor slapd.conf připraven pro běžné použití.

Obsah mého konfiguračního souboru /etc/ldap/slapd.conf, který vygeneroval instalátor (nic jsem v něm neměnil):

include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
schemacheck on
pidfile /var/run/slapd/slapd.pid
argsfile /var/run/slapd.args
loglevel 0
modulepath /usr/lib/ldap
moduleload back_bdb
backend bdb
checkpoint 51230
database bdb
suffix "dc=example,dc=net"
directory "/var/lib/ldap"
index objectClass eq
lastmod on

access to attrs=userPassword
  by dn="cn=admin,o=example,dc=net" write
  by anonymous auth
  by self write
  by * none
  
access to dn.base="" by * read

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

4.2.1. Nástroje pro práci s adresářem

Pro práci s adresářem z příkazové řádky lze využít nástroje ldapsearch (Obrázek 4.5 – „ldapsearch“) ldapadd, ldapmodify a ldapdelete. Práce s těmito programy není příliš příjemná, ale na druhou stranu je jejich funkčnost 100%. Pro ulehčení práce používám v shellu následující aliasy:

  • alias ldap-add='ldapadd -h ldap.example.net -x -D "cn=admin,dc=example,dc=net" -w demo1234' - slouží pro přidání záznamu do LDAPu, záznam se zapisuje po spuštění programu.

  • alias ldap-search='ldapsearch -h ldap.example.net -x -D "cn=admin,dc=example,dc=net" -b "dc=example,dc=net" -w demo1234' - jako parametr při spouštění aliasu se zadává vyhledávací maska

  • alias ldif-add='ldapadd -h ldap.example.net -x -D "cn=admin,dc=example,dc=net" -w demo1234 -f' - jako parametr při spouštění aliasu je třeba zadat ldif soubor, který chcete do LDAPu přidat

Samozřejmě existují i grafické nástroje, použitelný jsou například gq (Obrázek 4.7 – „gq“) nebo luma (Obrázek 4.6 – „Luma“).

Snad každý normální programovací jazyk má knihovny pro práci s LDAPem, tak vám nic nebrání v tom abyste si napsali nástroje jaké potřebujete.

Obrázek 4.5. ldapsearch

ldapsearch

Obrázek 4.6. Luma

Luma

Obrázek 4.7. gq

gq

4.2.2. TLS

4.2.3. Replikace

Adresářový server je velmi důležitý pro běh celého systému, proto je vhodné zajistit jeho zálohu. OpenLDAP podporuje replikaci, démon slapd se nastaví tak aby všechny změny zapisoval do logu. Spustí se samostatný daemon slurpd, který sleduje log a změny zasílá dalším adresářovým serverům. Slurpd je LDAP klient, proto nezpomeňte na Kerberos ticket pro autentikaci do adresářových serverů. Sluprd musí mít ACL pro zápis do všech objektů na replikačních LDAP serverech.

4.2.4. Firewall

Pro přístup k LDAP serveru z venčí je třeba povolit porty 389/tcp (LDAP) a 636/tcp (LDAPs).

4.3. Ono to nefunguje!

Když mi nějaké nastavení programu nevracelo správné výsledky, tak mi pomohlo spostit LDAP server v terminálu ručně s parametrem -d: slapd -d 256, pak je totiž vidět na co se klient ptá a jakou dostane odpověď. Když si pod tou odpovědí neumíte nic představit, tak stačí klientův dotaz spustit ručně pomocí našeho aliasu ldap-search.

Kapitola 5. Kerberos

Kapitola 6. Ověření uživatele pro přihlášení do systému

Všechna nastavení ukázaná v této kapitole jsou provedena na počítači srv.example.net. Samozřejmě je můžete udělat na jakémkoliv jiném počítači v síti.

Pokud provedete standardní instalaci OS Linux, ověřují se uživatelé proti databázi uživatelů, která je uložena v souborech /etc/passwd a /etc/shadow. Seznam uživatelských skupin je v souboru /etc/group. V některých UNIXových sítích se můžete setkat s využíváním NIS případně NIS+ pro centrální správu uživatelů. My provedeme konfiguraci, která umožní využítí adresářového serveru.

6.1. Jmenné služby

6.1.1. Datová struktura LDAPu

Pro uložení informací o uživatelích do LDAPu potřebujeme vytvořit vhodné struktury.

dn: ou=hosts,dc=example,dc=net
ou: hosts
objectClass: top
objectClass: organizationalunit

dn: ou=rpc,dc=example,dc=net
ou: rpc
objectClass: top
objectClass: organizationalUnit

dn: ou=services,dc=example,dc=net
ou: services
objectClass: top
objectClass: organizationalUnit

dn: ou=networks,dc=example,dc=net
ou: networks
objectClass: top
objectClass: organizationalUnit

dn: ou=people,dc=example,dc=net
ou: people
objectClass: top
objectClass: organizationalUnit

dn: ou=group,dc=example,dc=net
ou: group
objectClass: top
objectClass: organizationalUnit

dn: ou=aliases,dc=example,dc=net
ou: aliases
objectClass: top
objectClass: organizationalUnit

Uživatele pak založíme podle následující šablony:

dn: uid=tsunami,ou=people,dc=example,dc=net
objectclass: top
objectclass: posixAccount
objectclass: inetorgperson
objectclass: shadowAccount
objectclass: organizationalPerson
uid: tsunami
cn: Zdenek Burda
sn: Burda
mail: zdenda@zdenda.com
userPassword: {MD5}bpvs4ZFICfuEkxRkF+ci9g==
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 100
homeDirectory: /home/tsunami
gecos: Zdenek Burda
shadowLastChange:10877
shadowMin: 0
shadowMax: 999999
shadowWarning: 7
shadowInactive: -1
shadowExpire: -1
shadowFlag: 0

Není potřeba vkládat všechny informace při zakládání účtu, spoustu z nich lze nastavit někdy v budoucnu. Pro nás jsou povinné pouze: cn, gidNumber, homeDirectory, sn, uid, uidNumber.

Pokud používáte autofs pro připojování domácích adresářů ze serveru, nezapomeňte vytvořit uživateli na serveru domácí adresář.

Založíme skupinu users:

dn: cn=users,ou=group,dc=example,dc=net
objectclass: top
objectclass: posixGroup
cn: users
gidNumber: 100
memberuid: tsunami

6.1.2. libnss-ldap

Pro správnou funkci systému jmenných služeb (NSS) potřebujeme podporu pro ldap. V Debianu se nachází v samostatném balíčku libnss-ldap. Při instalaci (apt-get install libnss-ldap) nás instalátor vyzve pro zadání některých údajů:

  • LDAP server: ldap.example.net
  • DN of search base: dc=example,dc=net
  • LDAP verze: 3
  • login: No
  • make configuration readable/writeable by owner only: No

Na závěr vás instalátor upozorní, že konfigurační soubor /etc/nsswitch.conf nebude upraven automaticky.

Všechny volby libnss-ldap lze samozřejmě nastavit ručně v souboru /etc/libnss-ldap.conf případně kdykoliv po nainstalování pomocí rekonfigurace (dpkg-reconfigure libnss-ldap).

Pro naší potřebu upravíme v /etc/nsswitch.conf následující řádky:

passwd: ldap files
shadow: ldap files
group: ldap files

6.1.3. nscd

Jak již z názvu nscd (name service caching daemon) vyplývá, slouží tento program pro kešování informací získávaných z NSS. Doporučuje se použití nscd, proto si ho nainstalujeme i my. Program je součástí snad každé normální distribuce, takže i v Debianu ho najdeme: apt-get install nscd, konfigurační soubor je /etc/nscd.conf.

Pokud provádíte změny v datech a chcete je okamžitě promítnout do chování systému, je třeba osvěžit cache pomocí /etc/init.d/nscd reload, jinak se vám může stát, že smažete uživatele a on je pořád vidět při použití příkazu id a podobně i když už se do systému nepřihlásí.

6.2. PAM

Systém autentozačních modulů PAM zajišťuje bezpečné ověření uživatele. Systém PAM je plně programovatelný a umožňuje nezávislost programů na konkrétních autentizačních postupech.

Základem systému PAM jsou připojovatelné moduly, dynamicky linkované knihovny, a najdeme je v /lib/security.

Pam umožňuje autentizaci uživatele (auth), kontrolu účtu (account), správu relace (session) a změnu hesla (password).

Konfigurace PAM systému se většinou nachází v /etc/pam.conf a v /etc/pam.d/.

6.3. pam_ldap

PAM modul pam_ldap slouží k ověření přihlášení proti LDAPu. Pro jeho správnou funčnost je třeba nastavit informace o LDAPu v /etc/pam_ldap.conf (vyzve vás k tomu skript při instalaci balíčku libpam-ldap v debianu). Obsah souboru /etc/pam_ldap.conf může vypadat třeba takto:

base dc=example,dc=net
host 127.0.0.1
ldap_version 3
pam_password md5
rootbinddn cn=admin,dc=example,dc=net

Vlastní ověřování proti LDAPu je třeba nastavit v konfiguraci PAMu:

/etc/pam.d/common-auth

auth    sufficient      pam_ldap.so
auth    sufficient      pam_unix.so nullok_secure use_first_pass

/etc/pam.d/common-account

account sufficient pam_ldap.so
account sufficient pam_unix.so use_first_pass

/etc/pam.d/common-password

password   sufficient  pam_ldap.so
password   sufficient  pam_unix.so use_authok nullok obscure min=6 max=16 md5

/etc/pam.d/common-session

session required        pam_ldap.so
session required        pam_unix.so
session required        pam_mkhomedir.so skel=/etc/skel/ umask=077

6.4. pam_ccred

V případě výpadku LDAP serveru případně poruchy nějakého síťového prvku vzniká docela nepříjemný problém s ověřením uživatele přes síť proti adresířovému serveru. Částečně se dá řešit pomocí PAM modulu pam_ccred, který umožňuje kešovat přihlašovací informace.

/etc/pam.d/common-auth:

auth    sufficient      pam_unix.so
auth    [authinfo_unavail=ignore success=1 default=die] pam_ldap.so use_first_pass
auth    [default=done]  pam_ccreds.so action=validate use_first_pass
auth    [default=done]  pam_ccreds.so action=store use_first_pass
auth    [default=done]  pam_ccreds.so action=update use_first_pass

/etc/pam.d/common-account:

account sufficient      pam_unix.so nullok_secure
account sufficient      pam_ldap.so
account required        pam_permit.so

Přihlásíme se do systému, když normálně funguje LDAP server a zkontrolujeme jeslti se nám uložily informace do cache.

vodik:/var/cache# cc_dump 
Credential Type  User             Service  Cached Credentials  
----------------------------------------------------------------------------------
Salted SHA1      tsunami          any     80141f0721cf1eeaca6d182db474ed7eeec0925e

Máme také možnost vyzkoušet, jestli cache obsahuje správné údaje zkušebním přihlášením:

vodik:/var/cache# cc_test -validate any tsunami heslo /var/cache/.security.db 
pam_cc_validate_credentials: Success

Zastavte LDAP server (/etc/init.d/slapd stop) a zkuste se přihlásit

[uzivatel@vodik]$ su - tsunami
Password: 
You have been logged on using cached credentials.
tsunami@vodik:~$

Kapitola 7. Domácí adresáře uživatelů

Pokud chcete umožnit uživatelům přihlášení na kterémkoliv správně nastaveném počítači na síti, je třeba zpřístupnit domácí adresáře.

7.1. pam_mkhomedir

Jednou z možností, jak zajistit uživateli domácí adresář, je jeho vytvoření při prvním přihlášení do systému. Toto řešení je použitelné například když zakládáte uživatele zápisem do LDAPu z nějakého webového rozhraní a nechcete řešit vytváření domácích adresářů. Pozor, adresář se vytvoří na každém stroji, kde neexistuje. pam_mkhomedir není zrovna dobrý nápad, pokud chcete centralizovat domácí adresáře uživatelů, ale hodí se třeba na serveru, kde chcete automaticky vyrábět domácí adresáře při prvním přihlášení uživatele. Při vytvoření se uživateli do domácího adresáře automaticky nakopíruje obsah /etc/skel/.

Použití pam_mkhomedir je docela jednoduché, stačí v souboru /etc/pam.d/common-session upravit říst session přibližně do podoby:

session required        pam_ldap.so
session required        pam_unix.so
session required        pam_mkhomedir.so skel=/etc/skel/ umask=077

7.2. pam_mount

Pokud máte více počítačů propojených do sítě a chcete umožnit přístup k uživatelským datům z kteréhokoliv počítače, lze využít PAM modul pam_mount. pam_mount po ověření uživatele umí namountovat adresáře třeba ze sítě nebo z nějakého šifrovaného souboru. Je možné mountovat svazky pomocí SMB protokolu a podobně.

7.3. autofs

Klasický UNIXový nástroj autofs (automounter) umožňuje automatické připojování svazků ze sítě. Po přihlášení uživatele se namountuje jeho domácí adresář přes NFS z nějakého centrálního fileserveru. Autofs má jednu velkou výhodu, umožňuje definovat konfiguraci v LDAPu a tím i centralizovanou správu.

7.3.1. Instalace a konfigurace autofs

V distribuci Debian je autofs dostupný v samostatném baliíčku. Instalace je jednoduchá: apt-get install autofs.

Konfigurace autofs se provádí v soubour /etc/auto.master, pravděpodobně tam budete mít zakomentované nastavení pro adresář /net, pokud tuto volbu odkomentujete a autofs restartujete, budete mít možnost "procházet" sítí NFS serverů. Procházení je docela příjemné a rychle se na něj zvyká. Prostě jen napíšete cd /net/server/ a vidíte co má server nasdílené. Jako server lze uvést buď IP adresu nebo přímo doménový název počítače.

Pro automatické mountování domácích adresářů je třeba výchozí konfiguraci autofs trochu rozšířit. Do souboru /etc/auto.master přidejte řádek

/home /etc/auto.home

Soubor /etc/auto.home sice neexistuje, ale to nám nevadí, založíme si ho. Jeho obsah:

* -rw       server:/export/home/&

První položka na řádku specifikuje uživatelské jméno, protože chceme mountovat adresáře všech uživatelů ze sítě, necháme tam hvězdičku. Jako druhý údaj na řádku jsou uvedeny parametry pro moun no a na konci je uvedeno místo, kde se mají mountované adresáře hledat. & úplně na konci zastupuje uživatelské jméno.

Jak to celé funguje? Řekněme, že máme uživatele v LDAPu a u každého je uveden jako domácí adresář /home/username. Všechny domácí adresáře máme na jednom společném NFS serveru a jsou na něm umístěny v /export/home/, tento adresář je vyexportován přes NFS. Na všech pracovních stanicích máme nastaveno uvěřování uživatelů proti LDAPu a také na nich máme nastavené autofs. Uživatel se pak přihlásí. Proti LDAPu se ověří jeho heslo, získaká se informace o tomkde má domácí adresář (/home/username). Autofs automaticky podle konfigrace vytvoří adresář /home/username a namountuje do něj server:/export/home/username. Po odhlášení uživatele ze stanice se přestane adresář /home/username používat a autofs ho odmountuje a vymaže.

Pokud máte na nějakém adresáři nastavené autofs (/net, /home), tak vám systém ani jako uživateli root neumožní změny tohoto adresáře. Je to standardní chování třeba na Solarisu a spousta nováčků je z toho lehce zmatených...

7.3.1.1. Autofs a LDAP

Pro podporu LDAPu v autofs je třeba doinstalovat balíček autofs-ldap. V adresáři /usr/share/doc/autofs-ldap/ najdete příklady konfigurace.

Pro to abyste mohli začít používat ldap a autofs dohromady potřebujete upravit soubor /etc/ldap/slapd.conf, konkrétně musíte přidat

include         /etc/ldap/schema/autofs.schema
7.3.1.1.1. Nastavení s využitím /etc/auto.master

Ukážeme si jak by vypadala konfigurace nastíněná v předchozím odstavci do LDAPu.

Do souboru /etc/auto.master je třeba zapsat odkaz do LDAPu. Použití LDAPu se může zdát jako zbytečné, ale je třeba si uvědomit, že použitím LDAPu centralizujeme konfiguraci autofs do jednoho jediného místa a všechny změny pak budou snadné.

/home  ldap://ldap.example.com/ou=auto.indirect,dc=example,dc=net

Ještě je třeba udělat vhodný záznam do LDAPu a máme hotovo.

dn: ou=auto.indirect,dc=example,dc=net
objectClass: top
objectClass: automountMap
ou: auto.indirect


dn: cn=/,ou=auto.indirect,dc=example,dc=net
objectClass: automount
cn: /
automountInformation:   file.example.com:/export/home/&

Jistě jste si všimli, že cn=/. Lomítko v tomto případě funguje jako zástupný znak hvězdička.

Nyní stačí restartovat autofs a případně sledovat /var/log/syslog, kdyby se náhodou objěvily nějaké chyby. Pokud chcete vidět na co se autofs ptá LDAP serveru, spusťte slapd s parametrem -d 256.

7.3.1.1.2. auto.master přímo v LDAPu

Automounter umožňuje držet kompletní konfiguraci v LDAPu. Pro aktivaci této fukce je třeba zapsat do /etc/nsswitch.conf

automounter: ldap

Samozřejmě je možné kombinovat ldap i soubory, ale musíte to do /etc/nsswitch.conf zapsat:

automounter: ldap files

Pokud řádek pro automounter neexistuje, vytvořte ho.

Obsah nahrazující původní /etc/auto.master v LDAPu vypadá následovně:

dn: ou=auto.master,dc=example,dc=net
ou: auto.master
objectClass: top
objectClass: automountMap

dn: cn=/home,ou=auto.master,dc=example,dc=net
objectClass: automount
cn: /home
automountInformation: ldap://ldap.example.net/ou=auto.indirect,dc=example,dc=net

dn: cn=/-,ou=auto.master,dc=example,dc=net
objectClass: automount
cn: /-
automountInformation: ldap://ldap.example.net/ou=auto.direct,dc=example,dc=net

V naší konfiguraci direct mapy nepoužíváme, ale přesto zde uvedu příklad.

dn: ou=auto.direct,dc=example,dc=net
objectClass: top
objectClass: automountMap
ou: auto.direct

dn: cn=/usr/local,ou=auto.direct,dc=example,dc=net
objectClass: automount
cn: /usr/local
automountInformation:   file.example.net:/usr/local/

Kapitola 8. Poštovní subsystém

Když už máme všechny uživatele v LDAPu, tak by to chtělo nakonfigurovat i SMTP server aby pro ně přijímal poštu případně aby jim dovolil poštu odeslat.

8.1. SMTP

8.2. IMAP/POP3

Příklad nastavení IMAP a POP3 serveru pro spolupráci s LDAPem předvedu na programu dovecot, který je dostupný ve většině moderních distribucí.

8.2.1. Uživatelé v systému

Pokud máte uživatelská konta v LDAPu a operační systém je nakonfigurován tak aby byli vidět jako uživatelské účty v systému, nemusíte dovecot nijak složitě řešit. Mainstalujte ho, předhoďte mu SSL certifikáty, nastavte jaké protokoly budete používat a spusťte ho. V dovecot.conf nechte standardně zvolený passdb pam a userdb passwd.

8.2.2. "Virtuální" uživatelé

Dovecot umožňuje použít různé backendy pro ukládání informacé o uživatelských kontech, jedním z nich je i LDAP. Pokud vyhradíme samostatný stroj pro IMAP/POP3 server, nemusíme ho nastavovat tak aby byli uživatelé dostupní v systému, je to tak bezpečnější. Nastavíme dovecot tak aby si šahal pro informaci o uživateli do LDAPu.

8.3. LDAP jako adresář pro MUA

Většina poštovních klientů umí použít adresářový server jako zdroj pro získávání kontaktů.

8.3.1. Thunderbird

Jako zdroj pro kontakty si přídáme LDAP následujícím postupem.

  • Pustíme Thunderbird a otevřeme adresář (Ctrl+2)

  • V adresáři zvolíme File->New->LDAP Directory... (Obrázek 8.1 – „Thunderbird - Address Book“)

  • Vyplníme údaje potřebné pro připojení k LDAP serveru (Obrázek 8.2 – „Thunderbird - Address Book - Directory Server Properties“)

    • Name: ldap.example.net

    • Hostname: ldap.example.net

    • Base DN: ou=people,dc=example,dc=net

    Na screenshotu je vyplněná ještě položka Bind DN. Tato položka umožní přihlášení k LDAPu pod konkrétním uživatelem. Využijete jí, pokud máte v LDAPu zakázán anonymní přístup. O heslo budete požádání při prvním přístupu do LDAPu.

  • Dále si zapneme automatické doplňování adres i pro LDAP

Obrázek 8.1. Thunderbird - Address Book

Thunderbird - Address Book

Obrázek 8.2. Thunderbird - Address Book - Directory Server Properties

Thunderbird - Address Book - Directory Server Properties

Obrázek 8.3. Thunderbird - Options - Composition

Thunderbird - Options - Composition

8.3.2. Mutt

Mutt (spolu s PINE) je jeden z nejpoužívanějších textových MUA v UNIXovém světě. I mutt umí spolupracovat s LDAPem při výběru adres během psaní nového emailu. Sice neumí s LDAPem spolupracovat nativně, ale přes pomocný skript, ale to nám přece nevadí :-). Na Internetu nalezenete různé skripty, jeden z nich sem dám jako příklad. Návod na rozchození je na začátku skriptu. Pokud se nemusíte k LDAPu přihlašovat jménem a heslem, nechte nastavení prázdné ($username = "";, $password = "";).

#! /usr/bin/perl -Tw
# 2005-02-24: Fixed for AD/Exchange 2003 & Unicode characters,
# anders@bsdconsulting.no If you find this script useful, let me know. :-)
#
# 2000/2001: Original version obtained from Andreas Plesner Jacobsen at
# World Online Denmark. Worked for me with Exchange versions prior to Exchange
# 2000.
#
# Use it with mutt by putting in your .muttrc:
# set query_command = "/home/user/bin/mutt-ldap.pl '%s'"
#
# Then you can search for your users by name directly from mutt. Press ^t
# after having typed parts of the name. Remember to edit configuration
# variables below.

use strict;
use Encode qw/encode decode/;
use vars qw { $ldapserver $domain $username $password $basedn };

# --- configuration ---
$ldapserver = "domaincontroller.yourdomain.com";
$domain = "YOURDOMAIN";
$username = "myuser";
$password = "mypassword";
$basedn = "ou=companyxy,dc=companyxy,dc=tld";
# --- end configuration ---

#my $search=shift;
my $search=encode("UTF-8", join(" ", @ARGV));

if (!$search=~/[\.\*\w\s]+/) {
  print("Invalid search parameters\n");
  exit 1;
}

use Net::LDAP;

my $ldap = Net::LDAP->new($ldapserver) or die "$@";

$ldap->bind("$domain\\$username", password=>$password);

my $mesg = $ldap->search (
  base => $basedn,
  filter => "(|(cn=*$search*) (rdn=*$search*) (uid=*$search*) (mail=*$search*))",
  attrs => ['mail','cn']
);

$mesg->code && die $mesg->error;

print(scalar($mesg->all_entries), " entries found\n");

foreach my $entry ($mesg->all_entries) {
  if ($entry->get_value('mail')) {
    print($entry->get_value('mail'),"\t",
      decode("UTF-8", $entry->get_value('cn')),"\tFrom Exchange LDAP database\n");
  }
}
$ldap->unbind;

Kapitola 9. FTP

FTP je docela nebezpečný protokol, standardně přenáší vše včetně loginu a hesla nezašifrované. Pokud se pro něj rohodnete můžete rovnou na serveru vypnout SSH a používat místo něj třeba telnet.

Místo FTP používám raději SCP nebo SFTP, konkrétně scponly shell s uživateli v chrootu. Výhoda tohoto řešení je, že je bezpečné, relativně snadno nastavitelné (nastavíte scponly jako uživatelův shell a on se pak připojuje přes ssh protokol) a hlavně pro většinu operačních systémů máme použitelné klientské programy. Ve Windows je dostupný program WinSCP, v UNIXových operačních systémech zase klasický scp z příkazového řádku nebo třeba gFTP v grafice.

Jasně, někdo může namítnout, že lze použít FTP over SSL. FTP přes SSL je problém, neexistuje moc kvalitních grafických klientů a když už, tak jsou v javě (nenažrané) nebo komerční. Taky je složitější nastavení. Pokud se někdo spokojí s textovým klientem pro ftp, tak doporučuji lftp, umí snad všchno na co si vzpomenete.

9.1. vsftpd

Když už se někdo rozhodne pro provoz FTP serveru, tak většinou doporučuju program vsftpd. Vsftpd podporuje PAM. V Debianu je konfigurační souboru PAMu pro vsftpd /etc/pam.d/vsftpd. Pokud vám funguje přihlášení uživatele do systému s ověřením proti LDAPu, tak ten samý uživatel se může přihlásit i na FTP.

Teda až když to povolíte v /etc/vsftpd.conf. Povolte si local_enable=YES, write_enable=YES, anonymous_enable=NO a chroot_local_user=YES. Tohle je samozřejmě pouze základní nastavení jen pro demonstraci "že to funguje".

Pokud požíváte automounter pro uživatelské domácí adresáře, tak se nemusíte ničeho bát, normálně se vše přimountuje a uživatel se i přes ftp dostane ke svým datům.

Kapitola 10. WWW

Když už nám funguje LDAP, tak proč se třeba nepřihlašovat do nějaké firemní webové aplikace a ověřovat to proti němu?

10.1. apache2

Pro ověřování proti LDAPu použíjeme mod_auth_ldap. Předpokládám, že umíte nastavit ověřování třeba proti souboru s hesly, takže vynechám všechnu teorii a dám se pouze ukázku konfiguračního soubrou. Stejně máte vše v manuálu k apache web serveru.

Doporučuji překlopit apache na HTTPS, jinak vám budou lítat systémová hesla v plaintextu po síti. Následující ukázka umožní přihlášení uživatele jeho běžným loginem (položka uid v ldifu) a jeho standardním heslem.

AuthType Basic
AuthName "Restricted area"
AuthLDAPURL ldap://ldap.example/net:389/ou=people,dc=example,dc=net?uid?sub?(objectClass=*)
require valid-user

Kapitola 11. SAMBA

Kapitola 12. Překlad jmen počítačů na IP a naopak

V LDAPu je možné uchovávat i záznamy o IP aresách a názvech strojů.

12.1. Náhrada za /etc/hosts

První možnost, často i dostačující, je použít záznamy o počítačích a jejich IP adresách pro překlad pomocí NSS. Vlastně tím postavíme LDAP někam na úrověň souboru /etc/hosts.

Pro spuštění překladu jmen na IP pomocí záznamů v LDAPu zapište (upravte) do souboru /etc/nsswitch.conf řádek

hosts:    files ldap dns mdns

Do LDAPu pak vkládáme jednotlivé záznamy o počítačích pomocí následujícího LDIFu.

dn: cn=hostname,ou=hosts,dc=example,dc=net
cn: hostname
objectclass: device
objectclass: ipHost
ipHostNumber: 192.168.0.10

12.2. DNS - Bind9

Pro DNS server Bind9 existuje patch, který přidává podporu pro LDAP jako backend. Patch se jmenuje bind9-sdb-ldap

Kapitola 13. DHCP

Kapitola 14. VPN

Kapitola 15. INN

Kapitola 16. Fedora Directory Server

16.1. Instalace

Z webu http://directory.fedora.redhat.com/wiki/Download stáhněte instalační balíček pro vaší distribuci (pro mojí Fedoru 5 je to fedora-ds-1.0.2-1.FC5.i386.opt.rpm". Pokud nepoužíváte Fedoru, je možné si FDS přeložit ze zdrojových souborů - dělal jsem to pro FC5, když ještě oficiální balíček neexistoval a šlo to celkem bez problémů.

Balíček nainstalujte a jako uživatel root spusťte konfigurační skript /opt/fedora-ds/setup/setup. Nejprve vás vyzve k odsouhlasení licenčního ujednání a zkontroluje systém (provede kontrolu dostupné paměti a podobně). V dalším kroku vás vyzve k volbě způsobu konfigurace, používám výchozí možnost 2 - Typical - some customization (default), pokud v dalším kroku zadáte jako hostname serveru jeho fqdn, tak na všechny další požadavky akorát můžete bouchnout do enteru případně zadat nové heslo.

Příloha A. RFC

  • RFC 1558: A String Representation of LDAP Search Filters

  • RFC 1777: Lightweight Directory Access Protocol

  • RFC 1778: The String Representation of Standard Attribute Syntaxes

  • RFC 1779: A String Representation of Distinguished Names

  • RFC 1781: Using the OSI Directory to Achieve User Friendly Naming

  • RFC 1798: Connectionless LDAP

  • RFC 1823: The LDAP Application Programming Interface

  • RFC 1959: An LDAP URL Format

  • RFC 1960: A String Representation of LDAP Search Filters

  • RFC 2251: Lightweight Directory Access Protocol (v3)

  • RFC 2307: LDAP as a Network Information Service

  • DCE/OS-RFC 86.0: Unified Login with Pluggable Authentication Modules

Příloha B. Použité LDIF soubory

B.1. base.ldif

Definice základních struktur adresáře

dn: ou=Hosts,dc=example,dc=net
ou: Hosts
objectClass: top
objectClass: organizationalUnit

dn: ou=Rpc,dc=example,dc=net
ou: Rpc
objectClass: top
objectClass: organizationalUnit

dn: ou=Services,dc=example,dc=net
ou: Services
objectClass: top
objectClass: organizationalUnit

dn: nisMapName=netgroup.byuser,dc=example,dc=net
nismapname: netgroup.byuser
objectClass: top
objectClass: nisMap

dn: ou=Mounts,dc=example,dc=net
ou: Mounts
objectClass: top
objectClass: organizationalUnit

dn: ou=Networks,dc=example,dc=net
ou: Networks
objectClass: top
objectClass: organizationalUnit

dn: ou=People,dc=example,dc=net
ou: People
objectClass: top
objectClass: organizationalUnit

dn: ou=Group,dc=example,dc=net
ou: Group
objectClass: top
objectClass: organizationalUnit

dn: ou=Netgroup,dc=example,dc=net
ou: Netgroup
objectClass: top
objectClass: organizationalUnit

dn: ou=Protocols,dc=example,dc=net
ou: Protocols
objectClass: top
objectClass: organizationalUnit

dn: ou=Aliases,dc=example,dc=net
ou: Aliases
objectClass: top
objectClass: organizationalUnit

dn: nisMapName=netgroup.byhost,dc=example,dc=net
nismapname: netgroup.byhost
objectClass: top
objectClass: nisMap

B.2. group.ldif

UNIXové skupiny (/etc/group), které používám na všech serverech. Migrovat do LDAPu úplně všechny skupiny systému je možné pouze v případě, že používáte jeden operční systém a pokud je to Linux, tak i pouze jednu distribuci. Mezi jednotlivými OS jsou totiž trochu jinak přiřazeny čísla skupin k názvům. Jediné co snad souhlasí vždy je, že skupina root ma GID 0 :-).

dn: cn=users,ou=Group,dc=example,dc=net
objectClass: posixGroup
objectClass: top
cn: users
userPassword: {crypt}x
gidNumber: 100

B.3. user.ldif

LDIF použitý pro založení uživatele

 
dn: cn=Zdenek Burda,ou=People,dc=example,dc=net
objectclass: top
objectclass: posixAccount
objectclass: inetorgperson
objectclass: shadowAccount
objectclass: organizationalPerson
uid: tsunami
cn: Zdenek Burda
sn: Burda
userPassword: {MD5}bpvs4ZFICfuEkxRkF+ci9g==
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 100
homeDirectory: /home/tsunami
gecos: Zdenek Burda, iForce, 391
shadowLastChange:10877
shadowMin: 0
shadowMax: 999999
shadowWarning: 7
shadowInactive: -1
shadowExpire: -1
shadowFlag: 0

Příloha C. Odkazy na zdroje

Příloha D. Skripty pro správu uživatelů v LDAPu

D.1. Instalace a nastavení

Intalace skriptů je docela jednoduchá, vytvořte si podadresář někde v domácím adresáři uživatele root a do něj skripty nakopírujte. V souboru ldap-scripts.conf správně nastavte přístupové údaje do LDAPu. Skripty jsem psal relativně na rychlo jen na zkoušku, jestli to bude fungovat, takže všchny chyby hlaste.

Slovníček

adresář

Adresář je specializovaná databáze navržená pro časté čtení a občasné aktualizace. Adresář lze snadno replikovat pro zvýšení dostupnosti.

DAP

Directory Access Protocol, ???

Distinguished Name

Název záznamu v LDAP databázi.

GSSAPI

GSSAPI (Generic Security Services Application Programming Interface) je účelově podobný protokol jako SASL, ale SASL definuje síťový protokol, kdežto GSSAPI definuje programovací rozhraní. GSSAPI je jednou z metod podporovaných v SASL. GSSAPI využívá například Kerberos.

NSS

Name Service Switch je systém pro konfiguraci zdrojů pro získávání různých systémových údajů (uživatelé, skupiny, resolver). Hlavní konfigurační soubor této služby je /etc/nsswitch.conf. Typické zdroje jsou soubory, DNS, NIS a LDAP.

PAM

Pluggable Authentication Module zajišťuje nezávislost programů na konkrétních autentizačních postupech. Systém PAM se skládá z autentizačních modulů, jejichš konfigurací může administrátor nastavit potřebné parametry ověřování.

SASL

Simple Authentiction and Security Layer je protokol pro klient-server autentizaci přes síť. Poskytuje několik možností pro klienta a server k domluvení metody autentizace. Možné je například ověření pomocí plain-text hesla, databáze hesel umožňující přenos ve formátu hashe nebo GSSAPI.

slapd

LDAP server.

slurpd

Aplikace zajišťující replikaci LDAP serveru.