Kerberos a PAM
Dan Keder <keder@fi.muni.cz>
Obsah
- Kerberos
- Pam
Kerberos
Čo je Kerberos?
Kerberos je protokol zaisťujúci autentifikáciu v nezabezpečenej
sieti. Je určený pre model klient-server: klient si overí identitu
servera a server si overí identitu klienta. Je založený na symetrickej
kryptografii a vyžaduje tretiu osobu, ktorej musia dôverovať obaja
učastníci spojenia (klient aj server). Kerberos zabraňuje odpočúvaniu
spojenia, "replay" útoku (odchytenie a retransmisia údajov útočníkom) a
zabezpečuje integritu dát. Za určitých okolností je náchylný na DoS
útoky.
V UNIXovom svete sa v súčasnosti bežne vyskytujú 2 implementácie
Kerbera -- MIT Kerberos a Heimdal. Vlastnú implementáciu má
aj Microsoft. Formálna špecifikácia Kerbera 5 je popísaná v RFC1510
z roku 1993 a najnovsie v RFC4120 z roku 2005.
História
Kerberos vznikol na MIT ako súčasť projektu Athena. Tento projekt
vznikol v roku 1983 a jeho cieľom bolo vytvoriť pre užívateľov
jednotné pracovné prostredie nezávislé na použitom hardware a ktoré
by bolo maximálne škálovateľné (až 10 000 pracovných staníc).
Verzia 1, 2 a 3 bola určená pre internú potrebu MIT. Od verzie 4
je Kerberos verejne dostupný pod licenciou podobnou BSD, ale vláda
USA zakázala jeho distribúciu do zahraničia, pretože obsahoval
implementáciu kryptografického algoritmu DES.
Preto vznikla v Kráľovskom technologickom inžtitúte (Kungliga
Tekniska Högskolan) v Stockholme alternatívna implementácia
Kerbera 4 - KTH-KRB. Je založená na osekanej verzii MIT Kerbera,
ktorá neobsahuje kryptografické funkcie.
Heimdal, implementácia Kerbera 5, bola vydaná prakticky tou istou
skupinou ľudí ako KTH-KRB.
Ako funguje Kerberos
Kerberos funguje na princípe prideľovania tzv. lístkov (tickets),
pomocou ktorých sa preukazuje identita užívateľov. V sieti existuje tzv.
Centrum distribúcie kľúčov (Key Distribution Center, KDC), ktoré sa
skladá z dvoch logických častí:
- Autentizačný server (Authentication Server, AS)
- Lístkový server (Ticket Granting Server, TGS)
Kerberos si udržuje databázu tajných kľúčov. Každý klient alebo server v
sieti zdieľa s Kerberom tajnú informáciu - kľúč. Na základe znalosti tohto
kľúča sa preukazuje totožnosť užívateľov. Ak chce klient komunikovať so
serverom, Kerberos vygeneruje jednorázový 'session key', ktorý
sa použije na zabezpečenie spojenia medzi klientom a serverom.
Podrobnejší popis procesu autentizácie:
- Užívateľ zadá do systému svoj login a heslo.
- Počítač (klient) vypočíta hash hesla užívateľa. Tento hash
sa stane tajným kľúčom užívateľa.
- Klient pošle Autentizačnému serveru (AS) "žiadosť o službu"
(service request). Žiadosť není šifrovaná a obsahuje login
užívateľa, neobsahuje jeho heslo ani tajný kľúč.
- AS sa pozrie, či má daného užívateľa v databáze. Ak áno, odošle
klientovi:
- "Client/TGS session key" zašifrovaný tajným kľúčom užívateľa.
- "Ticket-granting ticket" (TGT) zašifrovaný tajným kľúčom TGS.
Tento lístok obsahuje:
- ID klienta
- sieťovú adresu klienta
- časovú platnosť lístka
- "Client/TGS session key"
- ...
- Klient dešifruje "Client/TGS session key". Tento kľúč použije
na ďalšiu komunikáciu s TGS.
- Klient požiada TGS server o lístok. Pošle mu 2 správy:
- "Ticket-granting ticket" a ID požadovanej služby.
- Autentifikátor zložený z ID klienta a času (timestamp). Je
zašifrovaný kľúčom "Client/TGS session key".
- TGS dešifruje autentifikátor pomocou "client/TGS session key", ktorý
dostal v TGT a pošle klientovi:
- "Client-server ticket" zašifrovaný kľúčom požadovanej služby
(kľúčom serveru). Obsahuje:
- ID klienta
- sieťovú adresu klienta
- čas platnosti
- "Client-server session key"
- "Client-server session key" zašifrovaný kľúčom
"Client/TGS session key".
- Teraz sa vie klient autentizovať serveru:
- Pošle "Client-server ticket" zašifrovaný tajným kľúčom serveru.
- Nový autentifikátor, zašifrovaný pomocou kľúča
"Client-server session key". Správa obsahuje :
- Server dešifruje tiket svojím tajným kľúčom a pošle klientovi správu,
ktorou potvrdí svoju identitu. Táto správa obsahuje timestamp,
ktorý poslal klient, zväčšený o 1 a je zašifrovaná kľúčom "Client/server
session key".
- Klient dešifruje potvrdenie kľúčom "klient/server session key" a
overí, či je timestamp správny. Ak áno, klient môže serveru
dôverovať a využívať jeho služby.
TGT a pridelené lístky expirujú v definovanom čase, takže klient musí občas
žiadať o obnovenie lístka (ticket renewal). Pomocou TGT lístka
klient získava lístky na konkrétne služby od konkrétnych serverov.
Prideľovanie týchto dalších lístkov je z hľadiska užívateľa
transparentné a nevyžaduje od neho žiadnu dodatočnú interakciu.
Heimdal
V ďalšom texte sú popísané vlastnosti a konfigurácia Heimdalu.
Kompilácia a inštalácia
Heimdal používa GNU autoconf, takže je prítomná obligátna
trojica ./configure && make && make
install
. Skript configure
akceptuje
rôzne prepínače, ktoré ovplivňujú funkcionalitu Heimdalu (dá sa
zapnúť napr. podpora IPv6, LDAP, openssl). Všetky prepínače sú
popísané v manuáli alebo po zadaní ./configure
--help
. Alternatívne môzete samozrejme využiť
balíčkovací systém vašej obľúbenej distribúcie.
Konfigurácia
/etc/krb5.conf
Konfigurácia Kerbera 5. Tento súbor nemusí byť v /etc, ak je
nastavená premenná prostredia KRB5_CONFIG
,
tento súbor sa hľadá v adresári uvedenom v tejto premennej.
/var/heimdal/kdc.conf
Konfigurácia KDC. Tento súbor má rovnakú syntax ako krb5.conf(5) a
je načítaný skôr, takže nastavenie uvedené v ňom má vyššiu
prioritu.
Kerberos pracuje s administratívnou doménou zvanou realm. Realm
obsahuje údaje o tzv. principáloch, čo sú vlastne užívatelia
(klienti) a servery, ktorí sa budú chcieť navzájom autentizovať.
Údaje o principáloch sú uložené v databáze. Každý užívateľ
Kerbera musí mať v databáze svoj záznam a tieto záznamy sú
asociované s konkrétnym realmom. Realmov môže byť viac a sú
definované v konfiguračnom súbore.
Príklad jednoduchého konfiguračného súboru:
$ cat /etc/krb5.conf
[libdefaults]
default_realm = LAB.FI.MUNI.CZ
ticket_lifetime = 600
clockskew = 60
default_etypes = des3-hmac-sha1 des-cbc-crc des-cbc-md5
default_etypes_des = des3-hmac-sha1 des-cbc-crc des-cbc-md5
[appdefaults]
dns_lookup_kdc = false
dns_lookup_realm = false
[realms]
LAB.FI.MUNI.CZ = {
kdc = speo_beta.lab.fi.muni.cz:88
admin_server = speo_beta.lab.fi.muni.cz:749
}
[domain_realm]
.lab.fi.muni.cz = LAB.FI.MUNI.CZ
lab.fi.muni.cz = LAB.FI.MUNI.CZ
[logging]
kdc = SYSLOG
admin_server = SYSLOG
default = SYSLOG
Ďalšie možné sekcie sú [kdc] a [kadmin], ktoré definujú nastavenie
KDC a administratívneho servera.
Názvy realmov sa podľa konvencie píšu veľkými písmenami a mali by sa
zhodovať s doménovým názvom, ak neexistuje pádny dôvod prečo by tomu
malo byť inak.
Ak sa zhoduje názov realmu s doménovým názvom, v ktorom máme
Kerbera, nemusíme uvádzať sekcie [libdefaults] a
[domain_realm]. Ak máme v DNS SRV záznam pre náš
realm alebo CNAME záznam v tvare kerberos.my.realm
,
môžeme vynechať aj sekciu [realm]. Toto chovanie
tiež ovplivňujú parametre dns_lookup_kdc
a
dns_lookup_realm
. Viac informacií o konfigurácii
DNS je v manuáli Kerbera.
Vytvorenie a práca s databázou
Teraz môžeme vytvoriť databázu, ktorá skladuje údaje o principáloch.
Implicitne je databáza uložená vo /var/heimdal
, ale
v konfiguračnom súbore sa dá cesta predefinovať.
Príkazom kstash sa vygeneruje nový master-key, ktorým bude šifrovaná
databáza. Heslo sa zároveň uloží do
/var/heimdal/m-key
. Práve tento
súbor by sme mali zálohovať, pretože bez neho je nám databáza k
ničomu.
$ mkdir /var/heimdal
$ kstash
Master key:
Verifying password - Master key:
Pustíme program kadmin na lokálnu databázu (prepínač -l) a
inicializujeme náš realm príkazom init. Nového principála
pridáme príkazom add. Ak chceme spravovať iný realm ako
defaultný, môžme použiť prepínač -r REALM.
$ kadmin -l
kadmin> init LAB.FI.MUNI.CZ
Realm max ticket life [unlimited]:
Realm max renewable ticket life [unlimited]:
kadmin> add janko_mrkvicka
Max ticket life [1 day]:
Max renewable life [1 week]:
Principal expiration time [never]:
Password expiration time [never]:
Attributes []:
janko_mrkvicka@LAB.FI.MUNI.CZ's Password:
Verifying - janko_mrkvicka@LAB.FI.MUNI.CZ's Password:
Ďalšie príkazy:
- help
- delete - zmaže principála z databázy.
- get - vypíše záznamy vyhovujúce zadanému výrazu
- modify - zmena atribútov daného principála, napr. max. doba
platnosti lístkov, expirácia účtu a pod.
- list - vypíše zoznam principálov v databáze podľa zadanej
masky.
Ak máme databázu vytvorenú, môžeme spustiť démonov kdc a kadmind a
skúsiť požiadať o TGT:
$ kinit janko_mrkvicka
janko_mrkvicka@LAB.FI.MUNI.CZ's Password:
$ klist
Credentials cache: FILE:/tmp/krb5cc_0
Principal: janko_mrkvicka@LAB.FI.MUNI.CZ
Issued Expires Principal
Mar 10 09:21:21 Mar 10 09:31:21 krbtgt/LAB.FI.MUNI.CZ@LAB.FI.MUNI.CZ
Kerberizácia servera
Ak chceme na serveri používať autentizáciu pomocou Kerbera, musíme
ho správne nastaviť. K tomu potrebujeme dostať na server
konfiguračný súbor
/etc/krb5.conf
a súbor
/etc/krb5.keytab
.
krb5.keytab
obsahuje názov principála (názov servera v databáze
Kerbera) a svoj tajný kľúč. Kľúč je tajná informácia, takže tento
súbor by mal mať reštriktívne prístupové práva.
kadmin> add --random-key host/my.host.name
Max ticket life [unlimited]:
Max renewable life [unlimited]:
Attributes []:
kadmin> ext host/my.host.name
kadmin> exit
Príkaz ext bez parametrov extrahuje keytab do súboru
/etc/krb5.keytab. Pomocou parametru je možné špecifikovať iný
cieľový súbor.
Kerberizácia klienta
Stačí na klienta skopírovať súbor /etc/krb5.conf
a možeme používať
kerberizované programy (kinit, klist...)
Replikácia databázy
Niekedy je vhodné mať záložné (slave) servery s bežiacim
serverom v prípade, že hlavný server prestane fungovať. Je preto
žiadúce, aby všetky servery mali rovnakú databázu, čo dosiahneme
pomocou replikácie. Na replikáciu databázy slúžia programy hprop
a hpropd. hpropd je spúšťaný na slave serveroch zvyčajne démonom
inetd. Aby replikácia fungovala, musi byť v databáze na každom
slave serveri principál hprop. Existuje tiež inkrementálna
replikácia, keď sa na slave servery posielajú len zmeny. Popis
nastavenia replikácie je v manuáli.
Cross-realm
Čo sa stane, ak klient potrebuje komunikovať so serverom z iného
realmu? Lokálny KDC nemá prístup ku kľúčom cudzieho realmu, takže
nemôze bezpečne vygenerovať "Client-server session key".
Tento problém sa rieši tak, že klient si od svojho lokálneho KDC
vypýta TGT platné v cudzom realme. Lokálne KDC sa spojí s cudzím KDC
a získa TGT, ktore pošle klientovi. Klient následne môže
požadovať od cudzieho KDC lístky k serverom v cudzom realme. Aby
tento mechanizmus fungoval, zúčastnené realmy si musia
doverovat. Je možná jednosmerná alebo obojsmerná dovera.
Presný postup konfigurácie je uvedený v manuáli, v podstate spočíva v
pridaní špeciálnych pomenovaných principálov do oboch realmov.
Súhrn užitočných programov
- kadmin(8) - administrácia databázy
- kinit(1) - získanie TGT
- klogin(1) - overí totožnosť užívateľa a spustí novú session.
- klist(1) - vypíše aktuálne pridelené lístky.
- kpasswd(1) - zmena hesla
- kdestroy(1) - odstráni pridelené lístky
- ktutil(1) - správa keytabov
- ksu - kerberizovaný su
- hprop(8), hpropd(8) - replikácia databázy
Rozdiely medzi MIT Kerberom a Heimdalom
Protokoly, ktoré používajú MIT Kerberos a Heimdal, sú kompatibilné a obe
implementacie vedia spolu pekne spolupracovať.
Toto však neplatí o protokole, ktorý používa utilitka kadmin. Tento
protokol nie je štandardizovaný a obe implementácie majú svoj vlastný
kadmin. Teda ak chceme používať obe implementácie zároveň, nesmieme
zabudnúť, že s Heimdalom nefunguje kadmin z MIT Kerbera a naopak.
Menšie rozdiely medzi MIT Kerberom a Heimdalom su tiež v API a su
popísané v manuáli Heimdalu v kapitole 9.4.
Odkazy
PAM (Pluggable authentication modules)
Čo je PAM
PAM je sada knižníc, ktorá integruje viaceré nízko-úrovňové autentifikačné
mechanizmy do jedného API. Použitie stabilného API rozhrania umožňuje
oddeliť detaily a spôsob autentizácie od logiky konkrétneho programu.
PAM bolo vyvinuté v Sun Microsystems a podporovaný je napr. v systémoch
AIX, HP-UX, Solaris, Linux, FreeBSD, MacOS X a NetBSD. PAM je súčasťou
štandardu XSSO (X-Open Single Sign-On Service).
PAM sa skladá z knižnice libpam, oproti ktorej sú linkované aplikácie,
ktore PAM využívajú, a z rôznych modulov, ktoré poskytujú konkrétne
autentizačné funkcie. Moduly sa zvyčajne nachádzajú v
/lib/security
(Solaris a niektoré UNIXy
/usr/lib/security
) a sú do pamäti zavádzané dynamicky, Z toho
vyplýva, že operačný systém musí podporovať dynamické linkovanie
knižníc.
Konfigurácia
Konfigurácia PAMu je uložená v súbore /etc/pam.conf
alebo vo viacerých súboroch v adresári /etc/pam.d
. Ak
tento adresár existuje, súbor pam.conf
sa ignoruje.
Konfiguračný súbor
/etc/pam.conf
obsahuje riadky vo formáte:
[service] [type] [control] [module-path] [module-args]
Syntax súborov v
/etc/pam.d/
je rovnaká, až na pole
[service]. Toto pole sa neuvádza a namiesto neho sa použije názov
konfiguračného súboru.
Každý riadok predstavuje pravidlo, ktoré sa uplatní pri autentizáii
v danom programe, pričom pravidlá sa môžu reťaziť. Tým sa môžu
kombinovať rôzne autentizačné mechanizmy, ako napriklad zadanie hesla
na klávesnicu + snímanie odtlačku prstov a pod.
Polia v konfiguračnom súbore majú nasledovný význam:
[service]
Väčšinou je to názov aplikácie, ktora využíva služby PAMu. Napr. su,
login. Existuje tiež kľúčové slovo 'other', ktore nastavuje implicitnú
konfiguráciu, ktorá sa použije, keď danému programu nevyhovie žiadna iná
konfigurácia (teda neexistuje konfigurácia, kde [service] ==
"nazov_programu").
[type]
Jedno z kľúčových slov 'account', 'auth', 'password' a 'session'.
account
-- ako overiť existenciu a platnosť
užívateľského účtu, práva k danej službe a pod.
auth
-- ako overiť identitu užívateľa.
password
-- zmeny autentizačných mechanizmov
(napr. zmeniť heslo a overiť, či je dostatočne silné a pod.)
session
-- definuje, čo sa má stať pred
udelením oprávnenia a po jeho odobratí. Napr. pripojenie
domovského adresára užívateľa, auditing a pod.
[control]
Može byť jedno z nasledujúcich:
- requisite - zlyhanie modulu spôsobí okamžité ukončenie
autentizačného procesu.
- required - zlyhanie modulu spôsobí zlyhanie autentizácie,
ale až po skončení ostatných zreťazených modulov.
- sufficient - úspech tohoto modulu postačuje na úspešnú
autentizáciu (pokiaľ predtým nezlyhal modul s 'required')
- optional - úspech alebo zlyhanie tohoto modulu sa berie do
úvahy iba vtedy, ak je to jediný modul daného typu asociovaného
s touto službou.
- include - nová direktíva, spôsobí vloženie pravidiel zo
súboru špecifikovaného v [module-path].
Je možné tiež presne špecifikovať, aká akcia sa má vykonať v
závislosti na návratovom kóde modulu. Viac v pam(8).
[module-path]
Absolútna alebo relatívna cesta k modulu. Relatívna cesta je relatívna
vzhľadom k /lib/security.
[module-arguments]
Argumenty modulu oddelené medzerou. Dokumentované sú pre každý modul
zvlášť.
Príklad konfiguračného súboru:
$ cat /etc/pam.d/login
#%PAM-1.0
auth required pam_securetty.so
auth required pam_stack.so service=system-auth
auth required pam_nologin.so
account required pam_stack.so service=system-auth
password required pam_stack.so service=system-auth
session required pam_stack.so service=system-auth
$ cat /etc/pam.d/system-auth
#%PAM-1.0
auth required pam_env.so
auth sufficient pam_unix.so likeauth nullok
auth required pam_deny.so
account required pam_unix.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 required pam_deny.so
session required pam_limits.so
session required pam_unix.so
Užitočné moduly
- pam_krb5.so -- autentizácia Kerberom.
- pam_time.so -- kontrola prístupu podľa času.
- pam_stack.so -- načítanie konfigurácie zo súboru
uvedeného ako argument.
- pam_securetty.so -- kontrola terminálu podľa /etc/securetty.
- pam_nologin.so -- kontrola existencie /etc/nologin.
- pam_unix.so -- štandartný unixový autentizačný modul.
- pam_limits.so -- nastavenie kvót.
- pam_deny.so -- autentizácia vždy zlyhá.
- pam_warn.so -- logovanie.
Na záver malá poznámočka: ak si zmažeme konfiguráciu PAMu, vymkneme
sa tým zo svojho vlastného systému. Jeden zo spôsobov, ako sa z toho
dostať, je nabootovať v single-user režime a napísať si nový
konfiguračný súbor.
Odkazy