pam: nothing appropriate

Vetsina dnesnich uzivatelu Linuxu si nainstaluje system z nejake distribuce, nejlepe nejakym "jednoduchym" instalakem. Dnes je bezpochyby nejrozsirenejsi distribuce rudy mor. Zakladni instalace ma zhruba 50 MB. Pred nekolika lety se do 50ti MB vesel Linux s full networkingem a C development tools. Jenze v te dobe taky bylo zcela normalni si Linux instalovat "manualne". Myslim si, ze KAZDY by si mel alespon jednou zkusit takto linux nainstalovat, aby poznal co vlastne na disku ma. V tomto clanku se podivame na PAM, tedy Pluggable Authentication Modules.

Autentikace uzivatelu v Unixu byla nejprve provadena pomoci souboru /etc/passwd. V tomto souboru byla uvedena zakryptovana hesla funkci crypt(3). Standardni crypt(3) pouziva DES s delkou klice 56 bitu, tedy maximalni delka hesla je 8 sedmi bitovych znaku. Diky tomu, ze /etc/passwd musi byt '644', muze si kazdy uzivatel systemu zakodovana hesla precist a nasledne se pokusit brute-force rozkodovat.

Vznikl tedy dalsi soubor, ktery jiz neni beznemu uzivateli citelny, /etc/shadow. Do user-readable /etc/passwd se da misto hesla "x" a zakodovane heslo je ulozeno v shadow. login(1),su(1) a dalsi programy si toto heslo vezmou odtud. Dnes jiz neexistuje snad zadny unix, na kterem by nebylo mozne nainstalovat shadow. Zatimco format passwd je jednotny temer na vsech unixech, se shadow to tak neni. Jednak se lisi v nazvu (/etc/master.passwd), ve formatu zaznamu, nebo v pouzitem sifrovacim algoritmu (napr. FreeBSD pouziva MD5 na tvoreni hashu hesel).

Pokud spravujete vice Unixovych stroju, zacina velky problem v udrzbe uzivatelu. Vznikly tedy ruzne systemy na cetralni udrzbu uzivatelu, nebo jeste lepe centralni autentikacni systemy. V praxi to vypada tak, ze na jednom stroji mate databazi uzivatelu. Ostatni unixy si verifikuji u tohoto pocitace uzivatele/hesla. Mezi tyto systemy patri Kerberos z MIT, NIS (aka Yellow pages), NIS+, popripade mlady Suas.

Jak vidite, zpusobu autentikace uzivatelu je opravdu velke mnozstvi. Zdrojaky loginu a dalsich programu vypadaji nejak takto:

#ifdef USE_SHADOW
 #ifdef USE_MD5
  ...
 #else
  #ifdef USE_KERBEROS
   ...
  #else
   #ifdef USE_SUAS
    ...
   #else
    ...
   #endif
  #endif
 #endif
 ...
 #else
#endif
Kdyz vezmeme v potaz, ze programu manipulujicich s autentikacnimi informacemi jsou radove desitky (login, su, r*, sshd, xdm, passwd, pop3d, imapd, ...), prestava legrace. Byl tedy naprogramovan PAM, ktery umoznuje velice snadno modularizovat autentikacni procedury.

Zakladem je knihovna libpam, ktera si dynamicky natahuje pomoci dlopen(3) ruzne moduly. Pokud se chcete prilogovat k systemu, spusti se /bin/login, ktery (pokud pouziva PAM) zavola nekolik funkci libpam. libpam nacte konfiguracni soubor z /etc/pam.d/ (napr. /etc/pam.d/login), ve kterem je uvedeno jake moduly se maji pouzit. Standardne se v Redhatu volaji pam_securetty, ktery zkontroluje, zda se uid=0 nepokousi prilogovat na insecure terminalu. pam_pwdb provede vlastni kontrolu zadaneho hesla. Pokud existuje /etc/nologin, pam_nologin zabrani prilogovani uzivatele.

PAM vyuzivaji samozrejme i programy passwd(1),chsh(1),chfn(1) a dalsi. Kazdy pam modul totiz obsahuje exportovane funkce NEJEN na autentikaci uzivatele, ale take na zmenu hesla, accounting a dalsi. Neni tedy problem napsat kratky modul, ktery bude delat KerberosV autentikaci a soucasne dovoli uzivateli zmenit heslo. Jakmile napisete takovyto modul, budou jej hned pouzivat vsechny programy v systemu. Samozrejme je mozne kombinovat vice modulu dohromady, napriklad pam_smartcard+pam_pwdb. pam_smartcard nejprve overi uzivatele dle smart-karty a preda informace pam_pwdb, ktery provede prihlaseni uzivatele.

Modulu existuje jiz velke mnozstvi:

Vyhody PAMu jsou snad jasne. Mezi hlavni nevyhody patri zejmena pomalost a vetsi riziko neopravneneho pristupu. Pokud mate system, ktery pouziva pouze shadow, jednoznacne zvolte klasicke login-utils, napriklad z shadow-utils nebo util-linux. Pokud hodlate pouzit slozitejsi konfiguraci, je jednoznacne resenim PAM.


Copyright (c) 1999 Martin Hinner, All rights reserved.