Portál AbcLinuxu, 30. dubna 2025 06:39
Článek představí koncept PAM (Pluggable Authentication Modules), pomůže s konfigurací systému a na příkladu ukáže, jak PAM využít pro usnadnění přihlašování.
PAM (Pluggable Authentication Modules) je sada knižníc, ktorá integruje viaceré nízko-úrovňové autentizačné mechanizmy do jedného API. Použitie stabilného API pomáha oddeliť detaily a spôsob autentizácie od programu, ktorý potrebuje overovať totožnosť užívateľov.
Pôvodne bol PAM vyvinutý v Sun Microsystems. V súčasnosti je podporovaný vo vačšine UNIXových systémov, napr. AIX, HP-UX, Solaris, Linux, FreeBSD, MacOS X a NetBSD. Pokiaľ viem, tak nie je podporovaný v Slackware a OpenBSD.
Keďže PAM uplatňuje modulárny princíp, je jednoduché napríklad pridať nový spôsob autentizácie (čítačku odtlačkov prstov) či zmeniť spôsob autentizácie v nejakom programe (chcem overovať heslá pomocou Kerbera namiesto /etc/shadow
).
Celý systém sa skladá z troch súčastí:
libpam
– oproti nej sú linkované programy, ktoré chcú PAM využívať/lib/security
(Solaris a niektoré UNIXy /usr/lib/security
) a do pamäte sú zavádzané dynamickyKeďže PAM je vo väčšine linuxových distribúcii už predinštalovaný, nebudem tu popisovať, ako ho do systému nainštalovať, a rovno sa vrhneme na konfiguráciu.
Konfigurácia PAMu je uložená v súbore /etc/pam.conf
alebo rozdelená do viacerých súborov v adresári /etc/pam.d
. Ak tento adresár existuje, súbor pam.conf
sa ignoruje. Dovolím si tvrdiť, že z dôvodu prehľadnosti sa používa väčšinou varianta s /etc/pam.d
.
Konfiguračný súbor /etc/pam.conf
obsahuje riadky v
tvare:
service type control module-path module-args
Syntax súborov v /etc/pam.d/
je rovnaká, až na pole
service
. Toto pole sa neuvádza a namiesto neho sa
použije názov konfiguračného súboru.
Každý riadok predstavuje pravidlo, ktoré sa uplatní pri autentizácii
v programe service
. Čo konkrétne treba uviesť do tohoto poľa (resp. ako pomenovať konfiguračný súbor) už závisí na onom programe, zväčša to býva práve názov programu. Ak v poli service
použijeme kľúčové slovo other
, nastavíme implicitné správanie pre ostatné programy. Z bezpečnostných dôvodov sa tu používa len modul
pam_deny.so
, ktorý užívateľovi prístup zakáže.
Pravidlá sa samozrejme môžu reťaziť, čím dosiahneme kombinácie rôznych autentizačných mechanizmov. K slovu sa dostávajú postupne tak, ako sú za sebou zapísané.
Pole type
musí obsahovať jedno z kľúčových slov
account
, auth
, password
a
session
. Každé z nich pokrýva jeden z aspektov
autentizačného procesu. Ich význam je nasledovný:
account
– ako overiť existenciu a platnosť užívateľského účtu, práva k danej službe a pod.auth
– ako overiť identitu užívateľapassword
– zmeny hesiel (ako heslo zmeniť, ako overiť, či je dostatočne silné a pod.)session
– definuje, čo sa má stať pred udelením oprávnenia a po jeho odobratí. Napr. pripojenie domovského adresára užívateľa, auditing a pod.Pole control
určuje, aký vplyv má modul na prebiehajúci
autentizačný proces. Môže nadobúdať tieto hodnoty:
required
– zlyhanie modulu spôsobí zlyhanie autentizácie, ale až po skončení ostatných zreťazených modulovrequisite
– zlyhanie modulu spôsobí okamžité zlyhanie autentizáciesufficient
– úspech tohoto modulu postačuje na úspešnú autentizáciu (pokiaľ predtým nezlyhal modul s "required")optional
– úspech alebo zlyhanie tohoto modulu sa berie do úvahy iba vtedy, ak je to jediný modul daného typu asociovaného s touto službou.Pole control
môže obsahovať i relatívne nové kľúčové
slovo include
, ktoré spôsobí vloženie pravidiel zo
súboru špecifikovaného v poli module-path
. To nám
umožňuje vložiť spoločné nastavenia do jediného súboru, takže pri
zmene stačí upraviť len tento súbor.
Do poľa module-path
sa uvádza cesta k modulu. Táto
cesta môže byť buď absolútna, alebo relatívna vzhľadom k adresári, v
ktorom sú PAM moduly (väčšinou /lib/security
).
V poslednom poli module-args
sa nachádzajú parametre modulu. Tie môžu byť pre každý modul iné, zistiť sa dajú v dokumentácii daného modulu. Väčšina modulov podporuje parameter debug
, ktorý spôsobí podrobnejší výpis do systémového logu.
Moduly, ktoré vyžadujú po užívateľovi heslo, tiež zvyknú podporovať parametre try_first_pass
a use_first_pass
. Rozdiel medzi nimi je v tom, že try_first_pass
sa snaží použiť heslo od niektorého z predchádzajúcich modulov a v prípade, že žiadne neexistuje, si ho vyžiada od užívateľa. Parameter use_first_pass
naopak od užívateľa heslo nežiada a rovno zlyhá.
Väčšina modulov má svoju manuálovú stránku, v ktorej je popísaná činnosť modulu a podporované parametre.
/etc/passwd
a /etc/shadow
Na príklade si ukážeme konfiguráciu pre GDM, v ktorej povolíme prístup lokálnym užívateľom v /etc/passwd
po overení odtlačku prstu a zadaní hesla. Niektorí užívatelia majú v domovskom adresári šifrované SSH kľúče, ale sú leniví a nechce sa im zadávať pri každom použití ssh heslo. Preto im s pomocou programu ssh-agent
sprístupníme SSH kľúč po dobu trvania sedenia.
Konfigurácia je uvedená v súbore /etc/pam.d/gdm
, do ktorého sa vkladá spoločný súbor /etc/pam.d/system-auth
(je uvedený len pre úplnosť).
Prihlásenie začne odobraním odtlačku prsta. Následne si modul
pam_ssh.so
vypýta od užívateľa heslo k SSH kľúču a pomocou
programu ssh-agent
kľúč sprístupní až do konca sedenia. Ak
tento modul zlyhá, nič sa nedeje, užívateľ má stále možnosť sa prihlásiť,
akurát nebude mať v ssh-agentovi svoj kľúč.
Ďalej sa overí heslo v module pam_unix.so
. Parameter
try_first_pass
hovorí, že sa má najskôr skúsiť heslo z
predchádzajúcich modulov. Ak nevyhovie, systém sa na heslo opýta znovu.
Súbor /etc/pam.d/gdm:
auth optional pam_env.so auth required pam_thinkfinger.so auth required pam_nologin.so auth optional pam_ssh.so auth include system-auth account include system-auth password include system-auth session include system-auth session optional pam_ssh.so
Súbor /etc/pam.d/system-auth:
auth required pam_env.so auth sufficient pam_unix.so try_first_pass likeauth nullok auth required pam_deny.so account required pam_unix.so password required pam_cracklib.so difok=2 minlen=8 \ dcredit=2 ocredit=2 try_first_pass retry=3 password sufficient pam_unix.so try_first_pass use_authtok \ nullok md5 shadow password required pam_deny.so session required pam_limits.so session required pam_unix.so
Na záver ešte uvediem malú poznámku: pri pokusoch s PAMom buďte opatrní. Zmazanie alebo poškodenie konfigurácie PAMu má ten istý účinok, ako keď zamknete svoj byt a kľúče hodíte do kanála – už sa dovnútra viac nedostanete (bežnými metódami, samozrejme).
# required – zlyhanie modulu spôsobí zlyhanie autentizácie, ale až po skončení ostatných zreťazených modulov
# requisite – zlyhanie modulu spôsobí okamžité zlyhanie autentizácie
a ukazka z konfiguracneho syboru:
password required pam_cracklib.so difok=2 minlen=8 \ dcredit=2 ocredit=2 try_first_pass retry=3 password sufficient pam_unix.so try_first_pass use_authtok \ nullok md5 shadow password required pam_deny.sopodla vsetkeho co je v clanku uvedene pokial pam_deny skonci s chybou (co skonci vzdy) ani zmena hesla nemoze nikdy prebehnut... Preto by mozno nebolo zle uviest sposob retazenia podrobnejsie, aby clanok ziskal aj vyznam: kazdy kto s PAMom robil uz vie ako funguje, a ten co s nim nerobil to podla clanku nepochopi, takze v sucasnom zneni trochu useless... Pokial sa mylim a ostatni to pochopili, prosim nekamenovat...
sufficient
v poli control
stačí k ověření, takže na pam_deny.so
by v případě, že neselže pam_unix.so
, vůbec nemělo dojít, ne?
pam_deny
máte pam_unix
se sufficient
, takže pokud ten uspěje, výsledkem je úspěch a na pam_deny
už nedojde.
Já s tímto teprve začínám, takže jsem to taky moc nepochopil. Nevěděl by někdo jak rozchodit přihlašování do systému pomocí IKey3000. Čerpal jsem z http://www.linuxexpres.cz/hardware/sifrovaci-token-ikey-3000, ale když jsem do /etc/pam.d/system-auth napsal přesně to, co v článku, tak to skončilo ne neúspěchem. Za případné rady děkuji.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.