Hlavní navigace

Poznámky k LDAP

30. 8. 2006
Doba čtení: 12 minut

Sdílet

Dnešní článek popisuje konfiguraci OpenLDAP serveru pro centrální správu autentizace. Zaměřuje se především na úskalí špatně zdokumentovaná nebo vůbec opomenutá v materiálech dostupných na internetu. Text uvádí rovněž základní konfiguraci klientů, aby bylo možno využít databázi LDAPu i pro autentizaci na jiných počítačích.

Konfigurace v tomto článku je přizpůsobena podmínkám distribuce Gentoo, ale lze ji jednoduše modifikovat i pro ostatní.

1. Instalace

Budete potřebovat: OpenLDAP a moduly pam_ldap a nss_ldap (to kvůli autentizaci uživatelů). To by mělo stačit pro sdílení autentizace do shellu. Pro další služby musíte doinstalovat příslušné propojovací moduly. Pokud budete provozovat LDAP v rámci sítě (LDAP packety mimo 127.0.0.1, např. při sdílení uživatelů mezi více servery), důrazně doporučuji vše instalovat s podporou SSL. Samotný proces instalace je závislý na distribuci, proto jej zde nebudu popisovat.

2. Konfigurace — slapd.conf

Někde v adresáři /etc najdete soubor slapd.conf. Jeho umístění je závislé na distribuci, v Gentoo jej najdete v adresáři /etc/openldap. Předdefinovaných údajů si moc nevšímejte, některé zde zůstávají od LDAP v. 1.

Uvedený soubor lze rozdělit do tří logických celků. Nejprve to jsou datová schémata pro konkrétní služby — důležité je uvést přinejmenším následující:

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

Schémata totiž uvádějí implicitní strukturu záznamů v databázi LDAP, tak, jak ji rozpoznávají jednotlivé propojovací moduly. Bez schémat byste se nepřihlásili k ničemu.

Další sekcí jsou řekněme „obecná ustanovení“. Jsou to deklarace platné pro celý server a nezávislé na implementaci. Zde je třeba zdůraznit, že žádný z běžně dostupných materiálů neuvádí všechna podstatná nastavení. Základní pravidlo zní: žádné mezery před direktivou. Vzpomínám si na několik bezesných nocí vyplněných hledáním chyby v SSL, než jsem se na jakémsi zapadlém diskusním fóru dočetl, že problémy způsobuje právě zmíněná mezera. Víceméně povinné deklarace následují.

allow bind_v2  # abyste mohli používat LDAP funkce PHP
password-hash {md5} # nebo nějakou jinou; vyberte si z SMD5, SHA, SSHA, CRYPT

Tady jedna drobná poznámka: atribut CLEARTEXT určuje, že heslo superuživatele bude v konfiguračním souboru uloženo jako prostý text. Je to zároveň implicitní varianta, takže nezapomeňte některou z hashovacích funkcí vybrat!

loglevel 255 # pro debugging, do logu se dostane takřka vše. Později snižte.
pidfile  /var/run/openldap/slapd.pid

Podle Gentoo-LDAP-HOWTO „slapd gentoo init skript nevytváří pid správně“. Problém bude v uživatelském oprávnění, protože Gentoo spouští slap démona pod uživatelem ldap.

TLSCertificateFile /etc/openldap/servercrt.pem
TLSCertificateKeyFile /etc/openldap/serverkey.pem
TLSCACertificateFile /etc/openldap/cacert.pem

Cesty k certifikátům. Opět různé příručky popisují způsob generování SSL certifikátů různě, ale neupozorňují na základní problém: LDAP (a Samba a Apache atd.) nepracují dobře se sebou podepsanými certifikáty. Vždy je lépe si zahrát na certifikační autoritu a vyrobit si vlastní klíč. Samozřejmě ideální je certifikát podepsaný skutečnou autoritou, což ovšem není zadarmo. Jak na generování certifikátu? Nejprve se porozhlédněte po skriptu CA.sh, v Gentoo je v adresáři /etc/ssl/misc. Přejděte si do příslušného adresáře a spusťte

# ./CA.sh -newca

tím vytvoříte vlastní CA certifikát, jímž budete podepisovat klíč a certifikát LDAP serveru. Jednotlivé položky vyplňte dle vlastního uvážení, ovšem Common Name musí být úplný doménový název počítače, na němž běží LDAP server (musí odpovídat záznamu v DNS). Teď spusťte

# openssl req -new -nodes -keyout newreq.pem -out newreq.pem

což vygeneruje žádost o certifikaci a privátní klíč LDAP serveru. parametr -nodes je nutný, protože OpenLDAP pracuje pouze s nekryptovanými soukromými klíči [3]. Teď ještě podepsat žádost:

# ./CA.sh -sign

a máte vše, co potřebujete. CA certifikát je v souboru cacert.pem, Gentoo jej uložilo do adresáře /etc/ssl/misc/demoCA. Ostatní soubory, newreq.pem a newcert.pem máte v aktuálním adresáři. Zkopírujte si sem i CA certifikát a proveďte následující příkazy:

# cp cacert.pem /etc/openldap/cacert.pem
# mv newcert.pem /etc/openldap/servercrt.pem
# mv newreq.pem /etc/openldap/serverkey.pem
# chmod 600 /etc/openldap/serverkey.pem

Pokud se proti LDAP serveru budou autentizovat uživatelé na jiných strojích, musíte na ně rovněž nakopírovat soubor cacert.pem. Uživatel, pod kterým bude OpenLDAP spouštěn, musí mít právo čtení všech tří souborů!

Následuje nastavení samotné databáze. Narozdíl od relačních databází nejsou jednotlivé záznamy LDAPu uspořádány do tabulek, ale do stromu. Každý záznam může mít více potomků, ale má jen jednoho přímého předka. Na nejvyšším místě stromu je záznam suffix, který definuje kořen. Jednotliví potomci mají v rámci svého Distinguished Name uvedenu úplnou cestu ke kořeni.

database    ldbm   # typ databáze; může být například bdb (Berkeley DB)
suffix      "dc=kin.vslib,dc=cz"   # kořen stromu
directory   /var/lib/openldap-data/  # adresář s databází
rootdn      "cn=root,dc=kin.vslib,dc=cz"  # záznam superuživatele
rootpw      [TAJNE] # šifrované heslo
index       objectClass     eq

Označení kořenu záleží na vás, je zvykem, že sestává z nejvyšší společné doménové adresy počítačů, které budou LDAPu využívat (v našem případě katedra informatiky TU v Liberci, tedy kin.vslib) a domény 1. řádu příslušné počítači, na němž LDAP poběží (v našich podmínkách tedy cz, resp. eu nebo com nebo tak něco), ale samozřejmě to není povinné. Oceníte to v momentě, kdy budete ze záznamů získávat informace o uživatelích a jejich strojích — v tomto případě obdržíte jednoduše doménové jméno počítače, ev. uživatelské jméno a e-mail uživatele přímo z Distinguished Name.

Co je důležité: přesvědčte se, že uživatel ldap (nebo jiný, pod kterým bude LDAP server spouštěn) může zapisovat do adresáře uvedeného v direktivě directory. Hash hesla superuživatele (může se jmenovat úplně jinak a nemusí mít vůbec záznam v /etc/passwd, tedy vůbec nemusí pro systém existovat) vytvoříte příkazem

# slappasswd -h {MD5}

Opět máte na výběr z metod uvedených výše. Budete dvakrát dotázáni na heslo a pokud se oba řetězce shodují, bude na standardní výstup vypsán hash, který tak jak je vlepíte za direktivu rootpw. Heslo není při generování testováno proti slovníku, de facto vám bude povolen libovolný neprázdný řetězec. Smysl posledního řádku vám prozatím může zůstat utajen, je ale vhodné upozornit, že definice pravidel indexu musí být unikátní, tj. pokud byste někdy v budoucnu chování objectClass měnili nebo doplňovali, musíte tento řádek zakomentovat.

3. Konfigurace — ldap.conf

Pravděpodobně někde blízko souboru slapd.conf naleznete i ldap.conf. Pozor! Gentoo (a jiné distribuce) rozeznávají dva různé soubory ldap.conf, ten, co nás teď zajímá, je v Gentoo rovněž v adresáři /etc/openldap a jeho obsah se podobá následujícímu výpisu:

BASE         dc=kin.vslib, dc=cz
URI          ldaps://ldap.kin.vslib.cz/
TLS_CACERT /etc/openldap/cacert.pem
TLS_REQCERT  allow

Tento soubor by měl být i na všech klientských počítačích. Oproti často zdůrazňované nutnosti deklarovat porty já doporučuji nechat vše, jak to je. Implicitní porty jsou

ldap            389/tcp    # Lightweight Directory Access Protocol
ldap            389/udp
ldaps           636/tcp    # LDAP over SSL
ldaps           636/udp

podle záznamu v /etc/services. Pro běžné účely to bohatě stačí, nepředpokládá se, že byste poskytovali LDAP služby přes firewall. Direktivu BASE a URI samozřejmě modifikujte podle svých potřeb, důležitá je cesta k CA certifikátu a jeho požadování kdykoli při přístupu na server. Tím do značné míry zabráníte nešifrovaným spojením mimo server.

Ještě zbývá maličkost. Zjistěte, kde v rc skriptech vašeho systému startuje LDAP a kde jsou uloženy jeho spouštěcí parametry. Gentoo je načítá ze souboru /etc/conf.d/slapd, který by měl obsahovat pouze následující řádek:

OPTS="-h 'ldaps:// ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock'"

Nyní můžete server spustit. Gentoo to zajistí skriptem /etc/init.d/slapd s parametrem start. Pokud se LDAP server nenastartuje ihned, bude asi někde problém… Zkuste tedy server spustit ručně, ale zjistěte si cestu k serveru. V Gentoo to bude vypadat následovně:

# /usr/lib/openldap/slapd -h 'ldaps:// ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock' -u ldap -g ldap

Pokud server skončí se sérií chyb typu „Can't connect…“, pravděpodobně je chyba v oprávněních ke čtení/zápisu. Zkuste server spustit bez parametrů -u a -g jako root a uvidíte. Rozeběhne-li se server, znamená to, že jste skutečně někde opomněli nastavit práva. Je třeba zajistit, aby uživatel ldap měl možnost zápisu do adresáře s databází, do souboru /var/run/openldap/fslapd.sock (tedy do adresáře /var/run/openldap a právo čtení všech tří souborů TLS.

Abyste otestovali, zda server skutečně pracuje, spusťte

# ldapsearch -D "cn=root,dc=kin.vslib,dc=cz" -W

kde samozřejmě upravíte text v uvozovkách podle vašeho záznamu rootdn v souboru slapd.conf. Měli byste obdržet výpis

# extended LDIF
#
# LDAPv3
# base <> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1

což je v pořádku, protože jsme do databáze zatím nic nevložili. Tím je základní konfigurace ukončena a můžeme importovat záznamy ze souborů /etc/passwd, /etc/shadow a /etc/group.

4. Import uživatelů

Firma PADL Software Pty Ltd. vytvořila mimo jiné sadu Perl skriptů nazvanou MigrationTools. Tyto skripty ohromně zjednodušují práci při importu uživatelů do databáze LDAPu. Uživatelé Gentoo je mohou nainstalovat pomocí emerge, pokud máte distribuci, v níž nejsou obsaženy, můžete si je stáhnout z www stránek firmy. Po nainstalování je třeba udělat drobnou změnu v konfiguračním souboru migrate_common.ph, který nejspíš naleznete v adresáři /usr/share/migrationtools, resp.  /usr/local/share/migrationtools.

$DEFAULT_BASE = "dc=kin.vslib,dc=cz";
$EXTENDED_SCHEMA = 1;
# Následující řádky zakomentujte (nemáte-li nataženo schéma mail)
#$DEFAULT_MAIL_DOMAIN = "padl.com";
#$DEFAULT_MAIL_HOST = "mail.padl.com";

Implicitní bázi samozřejmě upravte podle vlastní konfigurace. Komentáře u posledních dvou řádků jsou nutné, pokud nehodláte sdílet i loginy pro e-mailové služby (tomu bude věnován některý z dalších dílů). Nyní můžete zahájit přípravu migrace:

# export ETC_SHADOW=/etc/shadow
# cd /usr/share/migrationtools
# ./migrate_base.pl > /tmp/base.ldif
# ./migrate_group.pl /etc/group /tmp/group.ldif
# ./migrate_hosts.pl /etc/hosts /tmp/hosts.ldif
# ./migrate_passwd.pl /etc/passwd /tmp/passwd.ldif

Teď máte v příslušných souborech LDIF uloženy informace o uživatelích v podobě stravitelné LDAPem. Vlastní migrace proběhne v následujících krocích:

# ldapadd -D "cn=root,dc=kin.vslib,dc=cz" -W -f /tmp/base.ldif
# ldapadd -D "cn=root,dc=kin.vslib,dc=cz" -W -f /tmp/group.ldif
# ldapadd -D "cn=root,dc=kin.vslib,dc=cz" -W -f /tmp/passwd.ldif
# ldapadd -D "cn=root,dc=kin.vslib,dc=cz" -W -f /tmp/hosts.ldif

Nezapomeňte po ukončení migrace všechny soubory LDIF smazat z adresáře /tmp. Tento adresář bývá dostupný všem pro čtení i zápis a potenciální útočník by si mohl zde přečíst privátní informace vašich uživatelů.

5. Konfigurace PAM

Další konfigurace už je záležitostí klientů. Pokud i na localhostu čerpáte z databáze LDAPu, musíte ji samozřejmě dokončit i tam. Ujistěte se, že klient má nainstalovány balíky nss_ldap a pam_ldap (a PAM — bez něj to prostě nepůjde). Nové verze PAMu mají veškerou konfiguraci soustředěnu do adresáře /etc/pam.d, ale konkrétní obsah tohoto adresáře závisí na distribuci. Důležitý je soubor system-auth, kde jsou uloženy obecné parametry autentizace uživatelů. Pokud nepoužíváte nějaké speciální autentizační metody, bude stačit, když původní soubor nahradíte následujícím textem:

#%PAM-1.0

auth            required        pam_env.so
auth            sufficient      pam_unix.so likeauth nullok
auth            sufficient      pam_ldap.so use_first_pass
auth            required        pam_deny.so

account         required        pam_unix.so
account         sufficient      pam_ldap.so

password        required        pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3
password        sufficient      pam_unix.so nullok md5 shadow use_authtok
password        sufficient      pam_ldap.so use_authtok
password        required        pam_deny.so

session         required        pam_limits.so
session         required        pam_unix.so
session         optional        pam_ldap.so

Není třeba příliš bádat nad obsahem. V podstatě to znamená, že pro autentizaci bude nadále PAM považovat za postačující shodu s LDAPem, ale pokud uživatel nebude v LDAPu nebo použije jiné heslo, bude ověření provedeno na základě souborů /etc/group, /etc/passwd a /etc/shadow. Zároveň je třeba nastavit konfiguraci pam_ldap v jeho hlavním konfiguračním souboru, který se bohužel jmenuje ldap.conf. V Gentoo jej najdete v adresáři /etc, jinde se budete muset orientovat podle syntaxe souboru. Dá se říct, že narozdíl od konfiguračního souboru OpenLDAP klientu jsou direktivy v tomto souboru psány malými písmeny (jasně, je to dost hloupá charakteristika, ale asi nejvýstižnější) a taky je tento soubor podstatně delší. Měli byste jej upravit zhruba do následující podoby:

ssl start_tls
ssl on
suffix  "dc=kin.vslib, dc=cz"

uri ldaps://ldap.kin.vslib.cz/
pam_password md5

ldap_version 3
bind_policy             soft
pam_filter              objectclass=posixAccount
pam_login_attribute     uid
pam_member_attribute    memberuid

nss_base_passwd ou=People,dc=kin.vslib,dc=cz
nss_base_shadow ou=People,dc=kin.vslib,dc=cz
nss_base_group  ou=Group,dc=kin.vslib,dc=cz

scope one

URI počítače s LDAP serverem upravte dle potřeby, stejně tak suffix. Tento soubor určuje, do se bude dít po předání správy autentizace LDAPu. Opět nemá smysl uvádět explicitní číslo portu, lepší je na firewallu otevřít alespoň port 636. Direktiva bind_policy udává, jak moc bude klient při startu vyžadovat přítomnost LDAP serveru. Hodnota soft znamená, že klient se pouze dvakrát dotáže na přítomnost serveru a pokud ho nenajde, skončí. To je vhodná konfigurace pro server, protože ten se logicky před startem vlastních síťových služeb nikam připojit nemůže. Klient zde může mít hodnotu hard, protože se předpokládá, že LDAP server v okamžiku startu klientského počítače již běží. Jinak opakuje dotaz po 4, 8, 16, 32 a 64 sekundách, než skončí. Tři řádky před poslední direktivou uvádějí, odkud ze stromu LDAP se mají autentizační informace brát. Pro vás je důležité změnit directory context ( kin.vslib, cz) podle vašich podmínek.

Soubor ldap.conf teď ve stejné podobě rozdistribuujte na všechny klientské počítače. Ještě je potřeba upravit soubory /etc/nsswitch.conf, aby autentizovaní uživatelé dostali shell:

passwd:      ldap compat
shadow:      ldap compat
group:       ldap compat

Upravte JENOM uvedené položky! Zatím nás jiné nezajímají, do budoucna můžete třeba zkusit nahradit DNS záznamy LDAPem, ale prozatím nám stačí jen tyto tři. Na systémech kompilovaných proti libc5 bez NYS (varianta Name Information Service) není volba compat k dispozici, použijte tedy volbu files. Pokud nevíte, o čem je řeč, opište úpravu z citace. Teď už stačí jen vyzkoušet konfiguraci (při nastartovaném LDAPu):

# getent passwd|grep 0:0

Mělo by se vám vrátit několik (minimálně dva) řádků s následujícím obsahem:

root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash

Pokud vše funguje, můžete si pogratulovat, podařilo se vám importovat do LDAPu všechny stávající uživatele. Doporučuji ještě vyzkoušet vzdálené přihlášení k serveru, jak jste zvyklí (zpravidla přes SSH). Fungující přihlášení znamená fungující LDAP (nebo přinejmenším nefunkční LDAP, který ale nebrání autentizaci obvyklým způsobem).

root_podpora

V dalších poznámkách k LDAPu si řekneme, jak naimportovat uživatele ze Samby a jak jejich autentizace sjednotit.

Literatura:

[1] OpenLDAP Software 2.3 Administra­tor's Guide. University of Michigan, 1998 – 2005. [online] www.openldap.org/doc/admin23/guide.pdf .
[2] BENÁK, K. Použití adresářových služeb v informačních systémech. Diplomová práce. FSv ČVUT, Praha 2004. [online] ldap.benak.net/diplom.pdf .
[3] OpenLDAP Faq-O-Matic: How do I use TLS/SSL? [online] www.openldap.org/faq/data/cache/185.html .

Byl pro vás článek přínosný?