Autentizační systémy -Kerberos, PAM

Jiří Caha, xcaha@fi.muni.cz


Obsah


Kerberos

Historie

V roce 1983 vzniká v MIT (Messachusetts Institute of Technology) projekt Athena (prostředí pro distribuované výpočty). V rámci tohoto projektu bylo třeba vytvořit distribuovaný autentizační systém (pro AAA - authentication, autorization, accounting) zvaný Kerberos, jehož první veřejná verze byla dostupná už v roce 1987 pod názvem Kerberos v4.
První zkušenosti s tímto systémem odhalily však některé nedostatky, a systém se dočkal redefinice jako Kerberos v5 v roce 1993 v podobě RFC 1510.
První kompletní referenční implementace vychází v MIT v roce 1996.

Ve spojených státech však v té době platí silné omezující podmínky pro export kryptografických protokolů mimo území USA. Proto vzniká v roce 1997 zcela volně šiřitelná evropská implementace Heimdal.
Heimdal (aktualní verze 0.6.3) se však snaží zachovávat kompatibilitu jak s Kerberem v4 tak s Kerberem v5.

(Z dalších volně šiřitelných implementací Kerbera 5 ještě zmiňme shishi ve verzi 0.0.18)

Základní vlastnosti

Kerberos je od počátku navržen tak, aby autentizace neprobíhala zasíláním hesel, ale pomocí lístku, které pak mohou putovat i přes nezabezpečenou síť. Autentizace je založena na důvěryhodné třetí straně (KDC, Key Distribution Center).

Kerberos v4 využívá(l) symetrické kryptografie (DES) Zatímco Kerberos v5 je založen na kryptografii s veřejným klíčem (PKC, public key cryptogtaphy) - konkrétněji pak na Denning-Soccoove modifikaci Needham-Schroederova tří-stranného autentifikačního protokolu.

Princip

Kerberos používá dva typy důvěryhodných stran (ze kterých se skládá KDC):

Každý uživatel sdílí tajný klíč s AS. Tento tajný klíč není nikdy posílán po síti. Místo něj se ale posílají tzv. lístky. AS slouží k autentizaci uživatele. Komunikace s AS probíhá obvykle jednou za sezení.

Uživatel obdrží od AS TGS ticket pro komunikaci s TGS, u něhož žádá o server ticket pro každou službu kterou využívá v rámci jednoho sezení. Komunikace se serverem (službou) pak probíhá pomocí server ticket, jehož součástí je i symetrický klíč pro zabezpečenou komunikaci client-server.

 +---------------+     +--------------+  
 | Kerberos      |     | Ticket       |  
 | Authentication|     | Granting     |  
 | Server  (AS)  |    /| Server (TGS) |        
 +---------------+   / +--------------+
       |            /                   (1) request TGT ticket       
       |(1)        /(2)                 (2) request server ticket
       |          /                     (3) request service      
 +---------------+ (3) +--------------+  
 |   Client      |-----|Server/service|       
 +---------------+     +--------------+
Princip komunikace:
(1) client:
Klient se autentifikuje u AS = požádá o TGT lístek.
Klient tedy pošle AS svůj Client.name.
(1) AS:
AS vyhledá klienta v databázi sdílených klíčů a podle nalezeného klíče vytvoří (hash sdíleného klíče) tajný klíč key_C-AS.
Zároveň vygeneruje dočasný klíč tmpkey_C-TGS pro komunikaci Client-TGS, a tento klíč zašifruje pomocí key_C-AS.
Dále vytvoří TGT lístek: (Client.name, TGS.name, Client.address, tmpkey_C-TGS), který pak zašifruje pomocí tajného klíče TGS key_AS-TGS.
Zašifrované Ekey_C-AS(tmpkey_C-TGS) a Ekey_AS-TGS(Client.name,TGS.name,Client.address,tmpkey_C-TGS) pak pošle klientovi
(1) client:
Klient si dokáže vytvořit key_C-AS ze znalosti sdíleného klíče s AS (=autorizace klienta) a rozšifrovat dočasný klíč tmpkey_C-TGS pro komunikaci s TGS.
(1)
Komunikace Client-AS probíhá jen jednou za sezení. Uživatel tak např. zadává heslo jen jednou, i když využívá několik různých služeb. Vlastní už totiž TGT ticket, díky kterému mu TGS vydává lístky pro jednotlivé servery/služby.
(2) client:
Chce-li nyní klient použít server, požádá TGS o lístek:
vytvoří tzv. authenticator= (Client.name, Client.address, timestamp1) a zašifruje jej pro TGS pomocí tmpkey_C-TGS. Zašifrovaný authenticator pošle spolu s TGT lístkem a názvem požadované služby TGS.
(2) TGS:
TGS dokáže pomocí svého klíče rozšifrovat TGT lístek, tím získá klíč tmpkey_C-TGS, kterým zase rozšifruje authenticator a ověří platnost všech položek (timestamp1, Client.address, ...).
Vytvoří dočasný klíč tmpkey_C-S pro komunikaci Client-Server.
Vytvoří server-ticket který obsahuje (Client.name,Server.name, Client.address, ticket.lifetime, timestamp,tmpkey_C-S), a zašifruje tento lístek pomocí klíče key_TGS-S sdíleného spolu se serverem.
Klientovi pak pošle takto zašifrovaný lístek a klíčem tmpkey_C-TGS zašifrovaný tmpkey_C-S.
(2) client:
Klient si rozšifruje dočasný klíč tmpkey_C-S pro komunikaci se serverem.
Zároveň obdržel lístek pro použití serveru (služby).
(3) client:
Klient nyní vytvoří nový authenticator obsahující (Client.name,Client.address,timestamp2) zašifrovaný pomocí klíče tmpkey_C-S. A pošle jej spolu se server-ticket serveru.
(3) server:
Dešifruje lístek a authenticator, a ověří platnost všech položek. pošle zpět klientovi zašifrovaný timestamp2+1.
(3)
I další komunikace Client-Server probíhá šifrovaně pomocí tmpkey_C-S.

Konfigurace

Popsaná konfigurace je pro verzi z MIT na Red Hat Linux 9 Aktualní verze krb5-1.3.5 je možné stáhnout z http://web.mit.edu/kerberos/dist/index.html.

Konfigurace KDC

Je doporučeno zprovoznit DNS a časovou synchronizaci (ntp).
Nainstalovat balíčky krb5-libs,krb5-server,krb5-workstation (pro GUI konfiguraci pak např. gnome-kerberos).
Upravit soubor /etc/krb5.conf, např.:
     [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
      dns_lookup_realm = false
      dns_lookup_kdc = false
     [realms]
      FI.MUNI.CZ = {
        kdc = agaue-alpha.fi.muni.cz:88
	admin_server = agaue-alpha.fi.muni.cz:749
	default_domain = fi.muni.cz
      }
     [domain_realm]
      .fi.muni.cz = FI.MUNI.CZ
      fi.muni.cz = FI.MUNI.CZ
     [kdc]
      profile = /var/kerberos/krb5kdc/kdc.conf
     [appdefaults]
      pam = {
       debug = false
       ticket_lifetime = 36000
       renew_lifetime = 36000
       forwardable = true
       krb4_convert = false
      }
Upravit soubor /var/kerberos/krb5kdc/kdc.conf, např:
   [kdcdefaults]
    acl_file = /var/kerberos/krb5kdc/kadm5.acl
    dict_file = /usr/share/dict/words
    admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
    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
    }
Vytvořit databázi pomocí kdb5_util:
/usr/kerberos/sbin/kdb5_util create -s
příkaz create vytváří databázi klíčů pro Kerberos realm. Parametr -s vytvoří soubor, ve kterém bude uložen hlavní klíč serveru. Pokud žádný soubor neuvedeme, bude se náš Kerberos server (krb5kdc) při každém spuštění na tento klíč ptát.
Upravíme soubor /var/kerberos/krb5kdc/kadm5.acl:
tento soubor používá kadmind pro zjištění kteří uživatelé (principals) mají přístup k databázi a s jakou úrovní.
*/admin@FI.MUNI.CZ *
Utilita kadmin komunikuje s kadmin serverem po síti, a k autentifikaci používá Kerbera, proto pokud chceme vytvářet prvního uživatele, musíme jej vytvořit pomocí kadmin.local:
/usr/kerberos/sbin/kadmin.local -q "addprinc username/admin"
Kerbera spustíme příkazy:
   /sbin/service krb5kdc start
   /sbin/service kadmin  start
   
Uživatele nyní můžeme přidávat příkazem addprinc u kadmin.
Pro získání lístku slouží kinit, pro jejich vypsání klist, a zrušení kdestroy.

Konfigurace klienta

Opět je doporučena synchronizace času.
Nainstalované balíčky krb5-libs a krb5-workstation.
Upravit soubor /etc/krb5.conf (obvykle může být stejný jako u KDC).
addprinc -randkey host/agaue-alpha.lab.fi.muni.cz
ktadd -k /etc/krb5.keytab host/agaue-alpha.fi.muni.cz

Odkazy

http://cryptnet.net/fdp/admin/kerby-infra/en/kerby-infra.html - Kerberos Infrastructure HOWTO
http://www.redhat.com/docs/manuals/linux/RHL-9-Manual/ref-guide/s1-kerberos-server.html - Red Hat Linux Reference Guide (Chapter 17. Kerberos).

PAM

V dřívějších dobách si autentifikaci uživatelů přistupujících k dané aplikaci musela obstarat aplikace sama.
Tento přístup má několik nevýhod: nejen že to je zcela proti filozofii unixových systému (kde každý program děla jednu věc, ale dělá ji dobře), ale hlavně nedovoluje jednoduchou změnu autentizačních mechanizmů. Linux-PAM (Pluggable Authentication Modules for Linux) je systém modulů dovolující aplikacím nezávislost na autentizačních mechanizmech, které jsou plně pod správou systému PAM.
Aplikace pak samotný proces autentizace (realizovaný heslem, biometrikami, čipovými kartami, ...) přenechává na knihovně libpam.
Důležitou součástí systému PAM jsou autentizační moduly (dynamické objektové soubory) umístěné v adresáři /lib/security/ nebo /usr/lib/security/.

Konfigurace

Konfigurační soubory

Ve starších verzích byl konfigurační soubor /etc/pam.conf, novější verze má pro každou aplikaci (schopnou pracovat s PAM) zvláštní konfigurační soubor nacházející se v adresáři /etc/pam.d/ (např. /etc/pam.d/reboot). Soubor /etc/pam.conf se pak bere na vědomí jen v případě, že adresář /etc/pam.d/ neexistuje.
Struktura /etc/pam.conf je:    service-name    module-type    control-flag    module-path    args
Struktura /etc/pam.d/<service-name> je:    module-type    control-flag    module-path    args
Kde:
service-name
Jméno služby/aplikace.
Speciální service-name OTHER je rezervovaný pro defaultní autentifikační mechanismus. Zde je dobrým zvykem zakázat vše, co není vysloveně povoleno:
#%PAM-1.0
 # This is /etc/pam.d/other
 auth		required	pam_deny.so
 auth		required	pam_warn.so
 account	required	pam_deny.so
 account	required	pam_warn.so
 password	required	pam_deny.so
 password	required	pam_warn.so
 session	required	pam_deny.so
 session	required	pam_warn.so
module-type
Jeden ze čtyř možných typů modulu:
auth
autentizace uživatele (heslem, biometrikami, ...);
account
provádí se další ověřování přístupu k službě, které však nemá nic společného s ověřováním identity uživatele (např. přístup jen v určitou dobu,...);
session
provádí se před a po skončení služby. Stará se o správu sezení. Může např. nastavovat proměnné prostředí, omezovat systémové prostředky, chroot, logovaní, ...
password
provádí aktualizaci uživatelských autentizačních tokenů (heslo, otisk prstu, ...). Obvykle také umožňuje kontrolu "kvality" hesla (délka, odolnost proti slovníkovému útoku).
control-flag
používá se k definici reakce na (ne)úspěšné ukončení modulu. Moduly stejného typu se spouštějí v sérii (jeden po druhém). Kontrolní příznaky pak určují reakci při skončení modulu. Aplikace se ale nedozví jak skončil který modul, místo toho obdrží jen celkovou odpověď success/fail. Od Linux-PAM v0.60 lze kontrolní příznak definovat jedním ze dvou způsobů:
pomocí jednoho z klíčových slov:
required
jeho neúspěch způsobí zamítnutí, ale až po provedení ostatních modulů ze stejné oblasti.
requisite
liší se od required okamžitým oznámením neúspěchu.
Např. při přihlašování přes nespolehlivý kanál nám nedovolí zadávat heslo.
sufficient
modul s tímto příznakem může okamžitě ukončit kontroly s výsledkem success, pokud tento modul uspěl a žádný z předchozích modulů nezamítl přístup. Jinak je modul ignorován a pokračuje se dál v kontrole.
Využívá se převážně pro přeskočeni zdlouhavých kontrol, pokud službu požaduje superuživatel.
optional
(ne)úspěch těchto modulů se nezahrnuje do celkového výsledku.
Nebo pomocí propracovanější syntaxe, ve které je kontrolní příznak tvaru:
   [value1=action1 value2=action2, ...]
module-path
cesta k modulům. Implicitně (pokud není zadána cesta absolutní) se hledá v /usr/lib/security/ (/lib/security/).
args
argumenty předávané modulu při jeho spuštění.

Příklad modulu

pam_localuser
vyžaduje uživatele uvedeného v /etc/passwd
pam_krb5
autentizace přes Kerberos 5
pam_succeed_if
úspěch tohoto modulu závisí na širší charakteristice uživatelova účtu (LOGIN,UID,GID,SHELL,HOME).
pam_cracklib
kontrola odolnosti hesla.
pam_limits
nastavování limitu (/etc/security/limits.conf).
pam_time
přístup jen v určitou dobu (/etc/security/time.conf).
pam_warn
slouží pro zápis do syslogu.

Příklad konfiguračního souboru

/etc/pam.d/login
  #%PAM-1.0
  auth       required     pam_securetty.so
  #kontrola, zda pristupujeme pres bezpecny kanal
  auth       required     pam_stack.so service=system-auth
  #vyhodnoce se ulozi na zasobnik
  auth       required     pam_nologin.so
  #kontrola zda neexistuje soubor /etc/nologin
  account    required     pam_stack.so service=system-auth
  password   required     pam_stack.so service=system-auth
  session    required     pam_stack.so service=system-auth
  session    optional     pam_console.so

Odkazy

http://www.kernel.org/pub/linux/libs/pam/ - Linux-PAM
http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/ - online dokumentace
http://www.root.cz/clanek/478 - PAM -- správa autentizačních mechanismů
http://www.root.cz/clanek/495 - PAM -- použití v praxi