Kerberos, PAM
Jan Provazník, xprovazn@fi.muni.cz
Obsah
Kerberos - úvod
Kerberos je autentizační systém, který umožňuje bezpečný přístup
ke vzdáleným prostředkům na nezabezpčené síti bez opakovaného zadání hesla.
Klient se vůči cílovému serveru autentizuje pomocí lístku, ne pomocí hesla.
Autentizace je založena na důveřování třetí straně (KDC - označení pro KAS a
TGS).
Autentizace probíhá následujícím způsobem:
1) Klient pošle Autentizačnímu serveru Kerbera (KAS, Kerberos Authentication
Server) žádost o lístek pro TGS (Ticket-Granting Server - server, od kterého
získá klient lístek pro cílový server na který se chce přihlásit).
2) Autentizační server najde klienta ve své databázi a vygeneruje dočasný
klíč, který bude použit při komunikaci mezi klientem a TGS. Tento klíč
KAS zašifruje tajným klíčem klienta (získá ho z klientova hesla, které má v
databázi). Dále vytvoří TGT (Ticket-Granting Ticket, lístek pro získání
dalších lístků z TGS) a zašifruje ho tajným klíčem TGS (klíč zná jen KAS a
TGS). V TGT je mimo jiné obsažen i dočasný klíč. Obě tyto zprávy pošle
zpět klientovi.
3) Klient rozšifruje první zprávu (pomocí svého hesla) a získá tak dočasný
klíč pro komunikaci s TGS. Klient vytvoří tzv. autentizátor (authenticator),
který se skládá z jeho jména, adresy a časové značky. Autentizátor
zašifruje dočasným klíčem, který získal od KAS. Dále klient pošle TGS žádost o
lístek pro cílový server, žádost obsahuje jméno serveru, TGT (který je
zašifrovaný klíčem TGS) a zašifrovaný autentizátor.
4) TGS rozšifruje TGT svým tajným klíčem a získá dočasný klíč, kterým
rozšifruje autentizátor a zkontroluje jeho údaje (adresu s adresou, ze které
přišel požadavek, časovou značku s aktuálním časem). Pokud to sedí, vytvoří
nový dočasný klíč pro komunikaci mezi klientem a cílovým serverem (na který
se chce klient přihlásit) a začlení ho do lístku, kterým se uživatel bude
prokazovat cílovému serveru. Lístek také obsahuje jméno klienta, jeho adresu,
časovou značku a dobu platnosti lístku. Lístek zašifruje tajným klíčem
cílového serveru, dále zašifruje nový dočasný klíč starým klíčem sezení (klíč,
sdílený TGS a klientem). Obě zprávy pošle klientovi.
5) Klient rozšifruje druhou zprávu a získá dočasný klíč pro komunikaci s
cílovým serverem, který vytvořil TGS. Vytvoří nový autentizátor a zašifruje
ho dočasným klíčem. Cílovému serveru pošle lístek, který obdržel od TGS
(zašifrovaný klíčem cílového serveru) a zašifrovaný autentizátor.
6) Cílový server rozšifruje lístek a autentizátor (tj. lístek vytvořený TGS)
a zase zkontroluje časovou značku a adresu (u lístku i autentizátoru).
V tuto chvíli cílový server ví, že klient je ten, za koho se vydává a navíc
znají klient a cílový server tajný klíč, který můžou požít pro bezpčnou
komunikaci.
Pro aplikace vyžadující oboustrannou autentizaci může server poslat zpět
klientovi zprávu zašifrovanou dočasným klíčem, která obsahuje časovou značku
zvýšenou o 1.
Verze
MIT - původní implementace, vyvinutá na Massachusetts Institute
of Technology v US, dříve byla distribuce omezena pouze na US
a Kanadu (kvůli omezenému exportu šifrovacích algoritmů z US),
v současné době bez omezení, aktuální je verze krb5-1.3.2
Heimdal - volně šiřitelná implementace Kerbera, bez omezení,
má odlišný kód, ale autentizační protokol je kompatibilní s MIT verzí,
nekompatibilní je ovšem část týkající se správy KDC (kadmin)
Terminologie
Pro konfiguraci Kerbera je vhodné znát tyto pojmy:
- principal - název, pod kterým se ukládají entity v KDC. Skládá
se ze tří částí
- jméno uživatele, případně služby
- instance - tato část může být nulová, u počítačů je to celé
jméno počítače
- realm (oblast)
jenik@FI.MUNI.CZ
host/speo-alpha.fi.muni.cz@FI.MUNI.CZ
- realm - logické označení sítě tvořené KDC serverem a klienty
FI.MUNI.CZ
Instalace, konfigurace (MIT verze)
Aktuální verzi (binární i zdroj) je možné stáhnout z
http://web.mit.edu/kerberos/www/dist/index.html.
1) Server
Nainstalovat balíčky krb5-libs, krb5-server, krb5-workstation (případně
ekvivalent těchto balíčků v různých distribucích). Spustitelné programy se
instalují většinou do /usr/kerberos/(s)bin.
upravit /etc/krb5.conf
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
ticket_lifetime = 24000
default_realm = FI.MUNI.CZ
#ma se oblast pro pocitac urcovat z DNS TXT zaznamu
dns_lookup_realm = false
#pokud neni v definici oblasti uveden KDC server, ma se urcit z DNS SRV
#zaznamu
dns_lookup_kdc = false
[realms]
FI.MUNI.CZ = {
kdc = speo-alpha.fi.muni.cz:88
kdc = speo-alpha-1.fi.muni.cz:88 #2 sekundarni servery
kdc = speo-alpha-2.fi.muni.cz:88
admin_server = speo-alpha.fi.muni.cz:749
default_domain = fi.muni.cz
}
[domain_realm]
#pokud zacina teckou, jde o jmeno domeny, jinak je to jmeno pocitace
.fi.muni.cz = FI.MUNI.CZ
fi.muni.cz = FI.MUNI.CZ
[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf
[appdefaults]
#hodnoty, ktere mohou byt pouzity kerberovskymi aplikacemi
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}
a také /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
#cesta k access control list souboru - program kadmin z nej urcuje,
#jaka prava maji jednotlivi uzivatele pri pristupu k databazi uzivatele
acl_file = /var/kerberos/krb5kdc/kadm5.acl
#soubor obsahujici slova, ktera nemohou byt pouzita jako heslo - pokud
#nenastavim, zadna kontrola se neprovadi
dict_file = /usr/share/dict/words
#pouziva se programem kadmin pri pristupu k databazi
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
#jak se ma KDC chovat vuci paketum z protokolu Kerberos IV
v4_mode = nopreauth
[realms]
FI.MUNI.CZ = {
master_key_type = des-cbc-crc
supported_enctypes = arcfour-hmac:normal arcfour-hmac:norealm arcfour-hmac:onlyrealm des3-hmac-sha1:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal des-cbc-crc:v4 des-cbc-crc:afs3
}
Potom příkazem /usr/kerberos/sbin/kdb5_util create -s vytvoříme
databázi, ve které budou uloženy klíče pro definovanou oblast (realm).
(Parametrem -s vytvoříme soubor, ve kterém bude uložen klíč pro server.)
Pokud chceme používat program kadmin (a nejen kadmin.local), musíme ještě
upravit soubor /var/kerberos/krb5kdc/kadm5.acl, ve kterém definujeme,
kteří uživatelé mohou upravovat databázi:
*/admin@FI.MUNI.CZ *
Správa databáze (modifikace uživatelů) se dělá pomocí programů kadmin nebo
kadmin.local.
Protože ještě v databázi není žádný uživatel, ani admin, musíme příkazem
/usr/kerberos/sbin/kadmin.local -q "addprinc username/admin" vytvořit
alespoň jednoho admina - pokud budeme používat i kadmin a uživatele, kteří
se budou autentizovat pomocí kerbera.
Teď už stačí spustit démony krb5kdc a (nepovinně) kadmind. KDC běží
defaultně na portu 88, kadmind na portu 749
2) Klient
-synchronizace časů na serveru a klientech (ntp apod.)
-jsou potřeba balíky krb5-libs a krb5-workstation
-potřeba upravit /etc/krb5.conf - může být stejný jako na serveru.
3) Aplikační server
Každý server potřebuje soubor /etc/krb5.keytab, aby se mohl autentizovat
vůči KDC. Je to zašifrovaný klíč počítače, který by měl být přístupný pouze
pro roota. Abychom mohli vytvořit tento soubor, musíme napřed přidat tento
počítač do kerberovské databáze. Přidáme ho příkazem v kadmin módu:
addprinc -randkey host/speo-alpha.fi.muni.cz
a následně příkazem
ktadd -k /etc/krb5.keytab host/speo-alpha.fi.muni.cz
vytvoříme
požadovaný soubor /etc/krb5.keytab.
Sekundární servery (replikace)
Klientské aplikace pro Kerbera jsou vytvořeny tak, aby v případě výpadku
primárního serveru mohly použít sekundární server.
Stejně jako u aplikačních serverů se vytvoří /etc/krb5.keytab a servery se
přidají do databáze. Servery se nastaví pro šíření/propagaci databáze tak,
že se na každém vytvoří soubor /var/krb5kdc/kpropd.acl a ten
bude obsahovat všechny KDC servery:
host/speo-alpha.fi.muni.cz@FI.MUNI.CZ #primarni
host/speo-alpha-1.fi.muni.cz@FI.MUNI.CZ #a dva seknudarni
host/speo-alpha-2.fi.muni.cz@FI.MUNI.CZ
Spustíme na všech sekundárních serverch démona kpropd.
Nakonec z primárního serveru rozdistribuujeme databázi:
/usr/kerberos/sbin/kdb5_util dump /var/krb5kdc/slave_datatrans
a pro každý sekundární server:
/usr/kerberos/sbin/kprop -f /var/krb5kdc/slave_datatrans
Distribuci je vhodné spouštět pravidelně např. pomocí cronu.
Nástroje
- kinit - získá TGT z autentizačního serveru
- klist - vypíše momentálně vlastněné lístky
- kdestroy - smaže momentálně vlastněné lístky
- kpasswd, krsh, ksu...
PAM - úvod
Hlavní myšlenkou PAMu je, aby programy byly nezávislé na konkrétních
autentizačních postupech. Aplikace chce obvykle vědět, zda má službu
poskytnout nebo ne, ale nezajímá ji, jakým způsobem je kontrola uživatele
realizována.
Linux-PAM (Pluggable Authentication Modules for Linux) je systém modulů,
který ovládá autentizační úlohy aplikací (za předpokladu, že daná aplikace
podporuje Linux-PAM). Nejdůležitější vlastností PAMu je, že administrátor
může úpravou seznamu modulů libovolně určovat podmínky autentizace.
PAM - konfigurace
Konfigurace je zpravidla v souboru /etc/pam.d/jmeno_aplikace, takže
například /etc/pam.d/sshd.
Soubor obsahuje řádky formátu:
sekce příznak modul prametry_pro_modul
sekce je:
- auth - slouží k autentizaci uživatele
- account - předpokládá se, že byla ověřena identita uživatele, slouží
ke kontrole platnosti hesla, zda je přístup povolen v tuto dobu, atd.
- session - nastavení, které se týkají sezení (nastavení proměnných,
připojení adresářů, chroot)
- password - moduly pro aktualizaci uživatelova hesla
příznak je jeden z:
- required - povinný - modul, který při kontrole neuspěje sice způsobí
zamítnutí přístupu, ale až po provedení ostatních modulů ze stejné sekce
- requisite - bezpodmínečný - od required se liší okamžitým oznámením
neůspěchu
- sufficient - postačující - modul může ukončit/přeskočit další
kontroly a vrátit celkový výsledek ůspěch, ale jen pokud tento modul uspěl
a stejně tak i všechny předchozí
- optional - úspěch nebo neúspěch nepovinných modulů se nezahrnuje
do celkového výsledku
/etc/pam.d/xlock:
auth sufficient pam_unix.so nullok
auth sufficient pam_krb5.so use_first_pass
auth required pam_deny.so
Podpora PAMu v unixech
PAM je podporován ve většině unixů (nenašel jsem žádný, který by ho
nepodporoval) - Linuxu, NetBSD, FreeBSD, Solaris, Irix a další
Odkazy
How the Kerberos Protocol Works
Kerberos documentation
RFC 1510
PAM