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:

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






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: příznak je jeden z: /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