Autentizace, PAM, LDAP
Jiří Novotný, xnovotn5@fi.muni.cz
Obsah
Co je autentizace
Proces ověření identity osoby/programu, žádající přístup do systému.
Autentizace v UNIXu
Jedná se o přihlášení ke svému účtu. Účet má vždy aspoň tři následující důležité atributy:
- Uživatelské jméno (username, login).
- Řetězec, typicky 3-8 znaků dlouhý. Citlivý na velikost písmen; obvykle se ale používají jen znaky a-z a 0-9.
- UID (User ID)
- Číslo, typicky nezáporný integer, identifikující uživatele v systému. Používáno systémem při ověřování oprávněnosti přístupu uživatele ke zdrojům. Také se používá v datových strukturách.
- GID (Group ID)
- Totéž, co UID, jen neoznačuje samotného uživatele, ale jeho primární skupinu.
Klasická (tj. lokální) autentizace v UNIXu využívá tři důležité soubory:
/etc/passwd
- Obsahuje seznam+atributy místních uživatelských účtů. V minulosti obsahoval i hesla (hashe).
- Běžná oprávnění -rw-r--r--, vlastník root:root.
- Příklad a formát řádku:
user1:x:1000:1000:User1 Name,,,:/home/user1:/bin/bash
uživ_jméno:specifikace_pro_heslo:UID:GID:celé_jméno_nebo_komentář:[domovský_adresář]:[shell]
Další informace viz man 5 passwd.
/etc/shadow
- Obsahuje otisky hesel a další atributy (obvykle se vztahující k heslům) místních uživatelských účtů.
- Běžná oprávnění -r--------, vlastník root:root, nebo -rw-r----- s vlastníkem root:shadow.
- Příklad a formát řádku:
user1:$1$Xop0FYH9$IfxyQwBe9b8tiyIkt2P4F/:13262:0:99999:7:::
už_jméno:hash_hesla:naposledy_změněno:minimální_platnost:maximální_platnost:varování_předem:zamknutí_účtu:zamčeno_od:rezervováno
Vysvětlivky k některým atributům:
- hash_hesla - bývá ve tvaru $id$sůl$hash, kde id udává použitou hashovací funkci (např. 5 je SHA-256)
- naposledy_změněno, zamčeno_od - datum, vyjádřené počtem dnů od 1. 1. 1970
Další informace viz man 3 crypt, man 5 shadow.
Mezi další používané soubory patří:
- /etc/group, /etc/gshadow - analogické se soubory passwd/shadow; jedná se však o databázi skupin, ne uživatelů
UNIXové systémy se mohou v některých věcech (formát souboru /etc/passwd apod.) lišit - např. NetBSD nemusí být ve všech uvedených věcech shodné s GNU/Linuxem.
Name Services Switch (NSS)
Některé důležité systémové tabulky (jako je třeba již zmiňovaný seznam uživatelů v /etc/passwd) jsou uloženy lokálně v běžných souborech. To značně ztěžuje hromadnou správu, jelikož je třeba případné změny dělat na každém počítači zvlášť.
Jedním z řešení tohoto problému byl přesun těchto tabulek na nějakou centrálně dostupnou službu a úprava/doplnění systémových volání v C knihovně. Takové řešení bylo funkční, ale značně neflexibilní. Sun Microsystems pak postoupil o krok dále a vytvořil čistší NSS, které bylo později portováno i na další UNIXové systémy.
Princip je jednoduchý. V konfiguračním souboru jsou uvedeny tzv. databáze (ekvivalentní se systémovými tabulkami), pro které jsou uvedeny zdroje. Pokud je použito podporované systémové volání, je zavolán zdroj uvedený v konf. souboru. Příklad:
- V konfiguračním souboru je následující řádek:
hosts: dns files
- Nějaký program zavolá funkci gethostbyname().
- Podle uvedeného řádku se má napřed použít zdroj dns. Musí existovat NSS modul /lib/libnss_files.so.2, ze kterého se volá funkce _nss_dns_gethostbyname(). Ta požadavek zkusí obsloužit - položí dotaz DNS serveru - a vrátí (mj.) NSS návratový kód. Podle tohoto kódu se rozhodne, zda se požadavek zkusí opakovat u dalšího zdroje v pořadí (zde files).
Návratové kódy mohou být:
- Success - zdroj je přístupný a požadovaná informace v něm byla nalezena
- Notfound - zdroj je přístupný, ale požadovaná informace v něm nalezena nebyla
- Unavail - zdroj je nepřístupný
- Tryagain - zdroj je dočasně nepřístupný (např. přetížený)
Výchozí akcí pro návratový kód Success je ukončit prohledávání (Return). Naopak pro ostatní návratové kódy je výchozí akcí pokračovat s dalším zdrojem (Continue). Toto chování lze nicméně upravit:
hosts: dns [NOTFOUND=return] files
V tomto případě se zdroj files nikdy nebude prohledávat, pokud je zdroj dns přístupný (tj. DNS je považováno za autoritativní).
Mezi obvyklé NSS databáze patří např. passwd, shadow, group, hosts, protocols, services, aj.
Hlavní NSS zdroje jsou:
- files - místní soubor, obvykle /etc/databáze
- dns - místní DNS resolver >> DNS server
- db - místní databáze (tj. soubor .db)
- ldap - adresář přístupný přes LDAP (může vyžadovat konfiguraci v souboru /etc/libnss-ldap.conf - záleží na použitém NSS modulu)
- nis/nis+ - Network Information Service, popř. NIS+
Pochopitelně, každá kombinace typu databáze-zdroj nemusí být platná.
Další informace viz man nsswitch.conf.
Jelikož NSS zdroj nemusí být dostupný vždy (např. LDAP adresář může být dostupný jen ve vnitřní síti firmy), je možné výsledky NSS dotazů ukládat do vyrovnávací paměti (caching). Na to existuje několik nástrojů; často se používá nscd (name service cache daemon), který obvykle běží jako služba.
Tento démon poskytuje vyrovnávací paměť pro databáze passwd, group a hosts, přičemž pro každou z nich lze nastavit časovou platnost pro úspěšné i neúspěšné dotazy.
Další informace viz man nscd, man nscd.conf.
Pluggable Authentication Modules (PAM)
Pro tvůrce programů je UNIXová autentizace (i s použitím NSS) dost obtížná záležitost.
- Autentizační mechanismus musí být do programu zabudován. Pokud se mechanismus změní, musí se změnit i program.
- Program si musí autentizaci řešit úplně sám - OS obvykle poskytne jen určité údaje (např. username, UID, ... viz výše) a je na programu, jak s nimi naloží.
- Změna hesla může být obtížná až nemožná.
- Program si často prostě vede svoji vlastní databázi uživatelů. V takovém případě může nastat problém synchronizace seznamu uživatelů s jinou databází (nejčastěji systémovou, např. v /etc/passwd).
KonečnéMožné řešení: PAM - oddělení aplikací od informací o uživatelech.
Jinými slovy, pro různé metody autentizace oproti různým databázím uživatelů stačí, aby aplikace uměla pracovat s PAM.
Z čeho se PAM skládá? PAM je framework, do kterého patří:
- PAM knihovna (obvykle /lib/libpam.so) - poskytuje PAM API
- PAM moduly
- obvykle se nacházejí v adresáři /lib/security/
- to ovšem platí pro GNU/Linux; např. FreeBSD má jinou implementaci PAM, ve které jsou moduly v adresáři /usr/lib/
- konfigurační soubory
- adresář /etc/pam.d/, někdy postaru soubor /etc/pam.conf - hlavní nastavení
- /etc/security/ - nastavení jednotlivých modulů (těch, které to vyžadují/umožňují)
PAM poskytuje služby ve čtyřech oblastech, pro různé fáze autentizačního procesu. Tyto oblasti jsou označovány jako management groups.
- Auth - samotné ověření identity a přidělení oprávnění
- Account - ověření, zda uživatel již není přihlášen odjinud, kontrola možných omezení na účtu nebo heslu (např. platnost hesla může vypršet)
- Session - vytvoření/zrušení patřičného prostředí (např. připojení šifrovaného domovského adresáře po přihlášení uživatele), logování
- Password - změny vlastního (uživatel) i cizího (administrátor) hesla nebo jiného mechanismu
PAM modul je sdílená knihovna, která poskytuje nějakou funkčnost pro některé (nebo i všechny) tyto oblasti. Obvykle má dvě hlavní návratové hodnoty: OK (úspěch) a not-OK (selhání).
Jak již bylo uvedeno výše, konfigurace bývá uložena v adresáři /etc/pam.d/ a to modulárně - ve více souborech, které lze do sebe vkládat. Soubory se musí jmenovat po službě, kterou nastavují. Obsahem všech souborů jsou řádky v následujícím formátu:
Type Control Module [Module-arguments]
Služba
- Název, pod kterým se identifikuje aplikace, která volá PAM. Obvykle bývá napevno v aplikaci (i když např. vsftpd toto umožnuje nastavit).
- Jestli PAM název služby nezná (neexistuje soubor /etc/pam.d/sluzba), pouzije nastaveni pro sluzbu other.
- Pokud chceme mít stejné nastavení pro víc služeb, stačí mít pouze jeden konf. soubor + symbolické odkazy (např. pop3s -> pop).
Type
- Oblast (management group), na kterou se řádek vztahuje.
Control
Module
- Volaný modul, udaný s relativní cestou k výchozímu adresáři pro moduly (obvykle /lib/security/). Také je možné použít i absolutní cestu.
Module-arguments
- Argumenty pro daný modul, oddělené mezerou. Pokud sám argument obsahuje mezeru, musí být uzavřen v hranatých závorkách.
Řádek může mít ještě formát typu Type include|substack File - ze zadaného souboru se sem vloží všechny řádky pro oblast Type.
Dvě důležitá upozornění na závěr:
- Moduly se provádějí v pořadí v jakém jsou zapsány, odshora dolů. Tj. na pořadí výrazně záleží.
- Nerozlišují se malá/velká písmena, s výjimkou názvů/cest k souborům.
LDAP - Základní informace
Adresář
- (v IT/telekomunikačním významu)
- Něco jako kontejner/repozitář/omezená databáze obsahující různé typy objektů.
- Předpokládá se, že se v nich bude hlavně číst, procházet a vyhledávat. Modifikace jsou obvykle také možné, ale adresáře s vyšším objemem zápisových operací příliš nepočítají; např. nejsou podporovány transakce, nemusí disponovat vyrovnávací pamětí pro zápisy, atd. Obecně lze předpokládat, že na 1 zápis by mělo připadnout aspoň 1000 čtení.
- Data mohou být uložena různým způsobem; záleží na adresáři.
Adresářová služba
- Obecně aplikace pro práci s nějakým typem adresáře - poskytuje k němu přístup. Nemusí se vždy jednat o aplikaci, může to být také součást operačního systému.
Pod pojem adresářová služba se často zahrnuje i adresář.
LDAP
- Lightweight Directory Access Protocol
- Aplikační protokol (na nejvyšší vrstvě), pracuje na principu klient-server.
- Protokol pro přístup k adresářovým službám založených na skupině standardů X.500. To měl původně zajišťovat X.500 Directory Access Protocol (DAP), který tehdy vyžadoval síťování založené na OSI modelu (na návrhu X.500 se mj. podílela i organizace ISO:). LDAP vznikl jako odlehčená varianta, které stačí TCP/IP model.
- Nyní se používá převážně ve verzi 3, která je popsána v dokumentu RFC 4510.
- Specifikace definuje 4 modely, které jsou podrobněji popsány dále.
Někdy se označuje pojmem LDAP i server nebo adresář, pracující s protokolem LDAP.
Příklady adresářových služeb
Vzniklo před X.500: DNS, NIS, Doména Windows (předchůdce Active Directory).
Založeno na X.500/LDAP: Red Hat Directory Server, IBM Tivoli Directory Server, eDirectory, Active Directory, OpenLDAP, ad.
Informační (datový) model
Adresářové služby, které jsou založené na X.500/LDAP, reprezentují data ve stromové struktuře, nazvané Directory information tree (DIT). Jedná se o zakořeněný strom, jehož uzly i listy jsou jednotlivé záznamy v adresáři.
Záznam
- Základní objekt.
- Skládá se z atributů.
- Každý atribut v záznamu má přiřazenu aspoň jednu hodnotu.
Atribut
- (pokud se nehovoří o atributu v záznamu, má na mysli vždy atribut deklarovaný, ne již definovaný/instancializovaný)
- Je vždy nějakého typu. To znamená, že má definovanou nějakou syntax a případně i další pravidla nebo omezení.
- Typ atributu může být potomkem nějakého jiného typu; pak dědí všechny vlastnosti, které má jeho rodič. Rodičů může být i více.
- Má vždy aspoň jedno unikátní jméno.
- Vždy patří aspoň do jedné objektové třídy.
Objektová třída
- Je to skupina atributů.
- Určuje pro tyto atributy, jestli v této třídě mohou/musí být.
- Přiřazuje se k záznamům. Pokud má záznam přiřazenu nějakou objektovou třídu, řídí se jejími pravidly. Tj. tato třída určuje atributy, které záznam smí/musí obsahovat.
- Každý záznam musí mít přiřazenu aspoň jednu třídu.
- Záznam může mít přiřazeno více tříd, i když s určitými omezeními.
- Může být potomkem nějaké jiné třídy; pak dědí všechny vlastnosti, které má její rodič. Rodičů může být i více.
- Má vždy aspoň jedno unikátní jméno.
Schéma
- Obsahuje popisy atributů (tj. definice typů atributů) a definice objektových tříd.
- K tomu je používán jazyk Abstract Syntax Notation One, zkráceně ASN.1 notace.
- Některé atributy a objektové třídy nemusí být popsány v nějakém schématu, ale jsou přímo součástí příslušného LDAP serveru. Pak se jim říká operační atributy/třídy.
- Pokud atribut/třída mají nějakého rodiče, tento rodič nemusí mít popis v tom samém schématu.
- Je třeba, aby LDAP server měl k dispozici schémata, ve kterých jsou popsány všechny atributy/třídy, které tento server používá.
Jmenný model
Jak je uvedeno výše, jednotlivé objekty (tj. záznamy) jsou reprezentovány stromovou strukturou DIT.
U každého záznamu některé jeho atributy (obvykle pouze jeden atribut) tvoří identifikátor: Relative Distinguished Name (RDN). Tento identifikátor musí být jedinečný mezi všemi svými sourozenci ve stromové struktuře.
Řada, skládající se z RDN záznamu a RDN všech jeho předků až ke kořenu, tvoří tzv. Distinguished Name (DN). To jednoznačně identifikuje konkrétní záznam i jeho polohu v DIT.
Příklad DN: cn=Jan Novák,ou=zamestnanci,dc=firma,dc=cz
Příklad RDN: cn=Jan Novák
Funkční model
Zahrnuje dotazování, úpravy a autentizaci (které požaduje klient a provádí server) pomocí LDAP nad DIT. Konkrétní operace jsou:
Prohledávání (search)
- Je třeba nastavit aspoň od jakého záznamu se bude hledat, rozsah hledání a filtr.
- Dále je ještě možné např. omezit věci jako počet navrácených záznamů, max. čas hledání nebo nezajímavé atributy.
Srovnání (compare)
- Klient se dotazuje, jestli se nějaké atributy v nějakém záznamu shodují s nějakou hodnotou. Server odpovídá jen ANO či NE.
Smazání (delete)
- Mazaný záznam musí být list, tj. nesmí mít potomky.
Přejmenování (rename)
- Záznam musí vyhovět omezením popsaným výše v jmenném modelu.
Úprava (modify)
- Záznam musí vyhovět omezením popsaným výše v informačním modelu.
Přidání (add)
- Přidávaný záznam musí dostat rodiče.
- Dále platí požadavky pro operace přejmenování a úpravy, uvedené výše.
Připojení/odpojení (bind/unbind)
- Autentizace klienta oproti LDAP serveru + vytvoření relace. Ukončení relace + odhlášení.
Zrušení (abandon)
- Ruší nějakou operaci, kterou zrovna provádí server (např. prohledávání, které se už téhne příliš dlouho). Server zrušení operace klientovi nepotvrzuje.
Bezpečnostní model
V podstatě hlavně autentizace/autorizace klienta, dále ještě zabezpečení komunikace přes SSL/TLS.
Autentizace je možná více způsoby:
- Anonymní klient
- Nezabezpečené heslo
- Heslo přes TLS/SSL kanál
- Proxy uživatel
- Jiný uživatel, který může autentizovat přihlašovaného uživatele a dát o tom vědět LDAP serveru.
- PKI (klientským certifikátem)
- SASL (Simple Authentication and Security Layer)
- Framework, který definuje několik standardních mechanismů pro autentizaci.
- Je možno použít libovolný mechanismus, pokud ho podporují klient i LDAP server.
Při přihlášení heslem se obvykle zadává jako jméno uživatele DN objektu, který by měl mít atribut typu userPassword nebo authPassword.
Autorizace není součástí LDAP standardu. Některé LDAP servery ale implementují tzv. Access Control List (ACL). Obecně vzato: ACL určuje, kteří autentizovaní uživatelé mohou provádět které operace (viz funkční model) nad kterými záznamy (nebo i jednotlivými atributy).
LDIF
Standardní textový formát pro reprezentaci LDAP záznamů a změn na LDAP záznamech. Široce podporován. Používá se mj. pro:
- vytvoření nového stromu (DIT)
- hromadné přidávání nových záznamů
- hromadné úpravy záznamů
- export/import
Příklad jednoho záznamu ve formátu LDIF:
# Nejaky komentar, mozno pouze na cely radek
dn: cn=Robert Smith,ou=people,dc=example,dc=com
objectclass: inetOrgPerson
cn: Robert Smith
cn: Robert J Smith
cn: bob smith
sn: smith
uid: rjsmith
userpassword: rJsmitH
carlicense: HISCAR 123
homephone: 555-111-2222
mail: r.smith@example.com
mail: rsmith@example.com
mail: bob.smith@example.com
description: swell guy
ou: Human Resources
Literatura