Kerberos a PAM

Ondrej Kocian  <kocian dot on at gmail dot com>

Obsah

PAM

Pluggable Authentication Modules najdeme dnes jiz na spuste Unix-like systemech. Vznikl na myslence umoznit programum nezavislost na konkretnich authentizacnich postupech. Pri potrebe autentizace dana aplikace zavola funkci z PAM, ta s uzivatem autentizaci uskutecni a aplikaci akorat vrati, jak to vsechno dopadlo. To dava prostor moznostem v autentizaci - otisk pristu, sitnice..


Puvodne vyvinut firmou Sun Microsystem priblizne v roce 1995, nyni je pod licencu GPL (Linux-PAM) nebo BSD (OpenPAM), o hlavni vyvoj se stara Red Hat. Nasel vyuziti ve spouste UNIX-like systemu, kde je povetsinou jiz defaultne k najiti.

PAM se stara o ctyri oblasti:

Zakladem tohoto systemu jsou pripojitelne autentizacni moduly - sdilene objektove soubory (/lib/security):

pam_krb5.so -- autentizace Kerberem
pam_time.so -- kontrola pristupu podle casu
pam_stack.so -- nacitani konfigurace ze souboru uvedeneho jako argument
pam_securetty.so -- kontrola terminalu podle /etc/securetty
pam_nologin.so -- kontrola existence /etc/nologin
pam_unix.so -- standartni autentizacni modul
pam_limits.so -- kvoty
pam_deny.so -- autentizase zakazana vzdy (napr u other pro vetsi bezpecnost)
pam_warn.so -- logy.

Pristup aplikace probiha pres 2 vrstvy: systemova knihovna libpam - tim aplikace dostava k dispozici autentizacni sluzby, druha je systemova konfigurace - zde se urcuje co vsechno musi uzivatel splnit. Tu najdeme najdeme povetsinou v adresari /etc/pam.d/, kde jsou konfiguracni soubory pojmenovane nazvem programu. Napriklad authentizace pres program login vypada zhruba takto:

# cat /etc/pam.d/login #%PAM-1.0
#type control module-path [module-args]
auth required pam_securetty.so
auth requisite pam_nologin.so
auth required pam_unix.so nullok
auth required pam_tally.so onerr=succeed file=/var/log/faillog
# use this to lockout accounts for 10 minutes after 3 failed attempts
#auth required pam_tally.so deny=2 unlock_time=600 onerr=succeed file=/var/log/faillog
account required pam_access.so
account required pam_time.so
account required pam_unix.so
#password required pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3
#password required pam_unix.so md5 shadow use_authtok
session required pam_unix.so
session required pam_env.so
session required pam_motd.so
session required pam_limits.so
session optional pam_mail.so dir=/var/spool/mail standard
session optional pam_lastlog.so

Kerberos

Kerberos je sitovy protokol, snazi se zajistit bezpecnost (pocita s "vetrelcem" uvnitr site schopneho provoz kdekoli na siti odposlechnout, vysilat zpet do site nebo se vydavat se za nekoho jineho). Vyvinula ho MIT (Massachusetts Institute of Technology) pro ochranu sitovych sluzeb poskytovanych projektem Athena (1984-1991, X window System). Jmeno nese po velkem 3 hlavem psovi z recke mytologie, strazci Hades - buh podsveti.

Puvodne Kerberos stoji na symetricke kryptografii, duverihodne treti strane, tajne sdilene informaci (client - treti strana) a casovych znamkach. Rozsireni Kerberos pak umoznuje pouziti public-key kryptografie pri autentizaci. Pouziva na spouste Unix-like systemech ale taky ho napriklad pouziva Win 2000, XP, Vista, Server 2003 a 2008 jako standartni autentizacni metodu.

Komunikace na siti

Jako jeho zaklad je pouzit Needham-Schroeder protokol a nezbytna je tu prave treti strana KDC (key distribution center), ta se sklada ze dvou casti:
KDC obsahuje databazi tajnych klicu kazdeho na siti a taky generuje session key ktery se pak pouziva pro sifrovanou komunikaci dvou entit.


A - klient
B - sluzba, druha strana
TGT - {A address,Timestamp - expirace do, Ask (session key A)}^Kkdc
TGS - Ticket Granting Server
Ask - A session key
AS - Authentification Server
Ka - symetricky klic A
Kb - symetricky klic B
Kab - symetricky klic pro komunikaci mezi AB
Kkdc - symetricky klic KDC

Zadost o TGT a session key pro dalsi komunikaci s TGS:

A -> AS : A
AS -> A : TGT, {Ask}^Ka

Zadost o prideleni listku pro pozadovanou sluzbu:

A -> TGS : {TGT, ID sluzby},{A Timestamp, ID sluzby}^Ask
TGS -> A : {ID sluzby, A address, validity period,Kab}^Kb, {Kab}^Ask

Identifikace sluzby a klienta:

A -> B : {ID sluzby, A address, validity period,Kab}^Kb,{A,A Timestamp}^Kab
B -> A : {A TimeStamp + 1}^Kab

Instalace

Momentalni verze: Kerberos 5 Realise 1.6.3 [home], BSD licence

Heimdal je implementace Kerberos 5, momentalni verze 1.1 [home], BSD licence. Vyvorena Royal Institutem of Technology ve Svedsku. Implementuje programy jako je rsh, telnel, popper atd.
Bud z package manageru (napr emerge Heimdal), nebo primo ze zdrojovych kodu.

Konfigurace

Dva asi nejdulezitejsi soubory jsou krb5.conf (mel by byt umisten v /etc) a kdc.conf (jeho umisteni v krb5.conf).
Oba pouzivaji stejny system:
[section1]
   a-subsection = {
      var = value1
      other-var = value with {}
      sub-sub-section = {
         var = 123
      }
   }
   var = some other value
[section2]
   var = yet another value

krb5.conf:

[libdefaults]
  ticket_lifetime = 600
  default_realm = EXAMPLE.COM
  default_etypes = des3-hmac-sha1 des-cbc-crc des-cbc-md5
  default_etypes_des = des3-hmac-sha1 des-cbc-crc des-cbc-md5

[realms]
  EXAMPLE.COM = {
  kdc = kerberos.example.com:88
  admin_server = kerberos.example.com:749
  }

[kdc]
  profile = /krb5/var/krb5kdc/kdc.conf

[logging]
  kdc = CONSOLE
  kdc = SYSLOG:INFO:DAEMON

Uplny priklad na http://www.ornl.gov/~jar/krb5conf.txt.

libdefaults
zivotnost listku, sifrovaci algoritmy
login
promenne vyuzivany login programem - jesli pouzivat ci nepouzivat heslo pro ziskani V5/V4 ticket, program, cesta k nemu
appdefaults
promenne pro aplikace
realms
informace o jednotlivych oblastech (realm), cesty k jejich KDC
domain_realm
seznam pro prevod z hostname ci domain (uvozeny ".") jmena na Kerberos realm name
     .mit.edu = ATHENA.MIT.EDU
      mit.edu = ATHENA.MIT.EDU

logging
popisuju jak jednotlive programy vyporadaji s logy
      kdc = FILE:/krb5/lib/krb5kdc/kdc.log
      admin_server = FILE:/krb5/lib/krb5kdc/adm.log
      default = FILE:/krb5/lib/krb5kdc/log.log
 
capaths
nehierarchicke seznamy oblasti mezioblasti ktere se pouziji pri cross-realm autentizaci - tedy autentizaci pres oblasti. Taky ho pouziva koncova sluzba kdyz hleda duverihodne oblasti.

kdc.conf:

[kdcdefaults]
    kdc_ports = 88

[realms]
    dsdoe.ornl.gov = {
        profile = /etc/krb5.conf
        database_name = /krb5/var/krb5kdc/principal
        admin_database_name = /krb5/var/krb5kdc/kadm5_adb
        admin_database_lockfile = /krb5/var/krb5kdc/kadm5_adb.lock
        admin_keytab = FILE:/krb5/var/krb5kdc/kadm5.keytab
        acl_file = /krb5/var/krb5kdc/kadm5.acl
        key_stash_file = /krb5/var/krb5kdc/.k5stash
        kdc_ports = 88
        kadmind_port = 749
        max_life = 10h 0m 0s
        max_renewable_life = 7d 0h 0m 0s
        master_key_type = des-cbc-crc
        supported_enctypes = des-cbc-crc:normal des:v4 
    }



kdcdefaults
seznam portu
realms
poseznamy oblasti, specificke nastaveni (napr kde najit Kerberos server pro danou oblast)
logging

Databaze:


v databazi si kerberos udrzuje klice, defaultne v /var/heimdal. Databaze jde zasifrovat:

$ kstash --random-key

Sprava databaze:

$ 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:

Dalsi zajimave programy:

kadmin(8) - administrace databaze
kinit(1) - ziskani TGT
klogin(1) - overeni totoznosti
klist(1) - aktualne pridelene listy
kpasswd(1) - zmena hesla
kdestroy(1) - odstraneni prideleneho listku
ktutil(1) - sprava keytabu
ksu - su v Kerberu
hprop(8), hpropd(8) - replikace databaze

Literatura