PAM (Pluggable Authentication Modules - Wstawialne Moduły Autentykacji) jest elastycznym systemem autentykacji użytkowników umożliwiajšcym tworzenie aplikacji całkowicie niezależnych od samej metody autentykacji. Nie narzuca on żadnych metod oraz nie ma ograniczeń na ich tworzenie. PAM używa zestawu "modułów autentykacyjnych", które umożliwiajš implementację dowolnych metod autentykacji i używanie ich z dowolnymi aplikacjami.
System został rozwinięty w firmie SunSoft i przystosowany do pracy w systemie Solaris. Jego standard jest opisany przez V.Samara i R.Schemersa w dokumencie OSF RFC 86.0. "Unified Login with Pluggable Authentication Modules (PAM)".
Za implementację systemu dla platformy GNU/Linux jest odpowiedzialny Andrew G.Morgan (morgan@ftp.kernel.org). Ta implementacja nosi nazwę Linux-PAM i posiada ona szereg rozszerzeń względem oryginalnej implementacji, takie jak modularna konfiguracja i możliwoć hierarchicznej autentykacji.
Integracja PAM w dystrybucji systemu GNU/Linux jest złożona i wymaga rekompilacji wielu programów. W zwišzku z tym nie wszystkie dystrybucje używajš PAM. PAM jest wykorzystywany w Caldera Open Linux, Debian/GNU, RedHat Linux (wersje 3.04 wzwyż), SuSE Linux oraz w systemie FreeBSD.
Aplikacja jest wyposażona w interfejs do biblioteki Linux-PAM i jest niezależna od metody autentykacji. Aby zweryfikować tożsamoć użytkownika, aplikacja komunikuje się z Linux-PAM. System PAM okrela na podstawie konfiguracji (odpowiedniej dla danej aplikacji) sposób autentykacji i okrela które moduły i w jaki sposób będę realizowały autentykację. Aplikacja może opcjonalnie udostępniać PAM własny moduł realizujšcy konwersację z modułami PAM. Po ustaleniu uprawnień PAM przesyła odpowiednie informacje o uprawnieniach użytkownika do aplikacji.
Uproszczony schemat architektury z wykorzystaniem PAM:
Schemat architektury PAM dla wielopoziomowej autentykacji:
Plik pam.conf
Plik konfiguracyjny /etc/pam.conf składa się z lini o następujšcej składni:
[service-name] [module-type] [control-flag] [module-path] [arguments]
W przypadku plików w katalogu /etc/pam.d różnica jest tylko taka, że każdy plik odpowiada jednej usłudze. Nazwa pliku jest taka sama jak pole service-name, a linie w pliku zawierajš pozostałe cztery pola. Każda linia odpowiada pojedynczemu modułowi PAM dla konkretnej usługi. Stosowanie plików konfiguracyjnych w katalogu /etc/pam.d jest rozwišzaniem bardziej uniwersalnym i zalecanym.
Znaczenie pól jest następujšce:
Pole ma następujšcš składnię:
[wartoć1=działanie1 wartoć2=działanie2 ...]
Pole wartoć oznacza jeden z około 30 różnych wartoci zwracanych przez moduł, dotyczšcych przebiegu autentykacji, na przykład: user_unknown, acct_expired, try_again.
Pole działanie może przyjmować jednš z 6 wartoci: ignore, ok, done, bad, die, reset. Oznaczajš one działanie, jakie biblioteka ma podjšć po otrzymaniu kodu o podanej wartoci.
Na przykład ok oznacza, że kod jest do zaakceptowania i autentykacja ma się zakończyć sukcesem, a pole bad oznacza sytuację odwrotnš.
Istnieje jeszcze uproszczona, starsza składnia definiowania control-flag. Polega ona na podaniu jednego z 4 słów kluczowych: required, requisite, sufficient i optional. Wskazujš one na rolę, jakš ma odgrywać moduł. Na przykład słowo required oznacza, że pomylna autentykacja przy pomocy tego modułu jest konieczna dla całego procesu autentykacji.
Narzędzia i moduły
O sile systemu PAM stanowi uniwersalne API umożliwiajšce rozwijanie różnych modułów autentykacji. W standardowej dystrybucji Linux-PAM jest ponad 20 różnych modułów. Oprócz tego dostępnych jest ponad 40 modułów dodatkowych dostępnych jako osobne pakiety. Listę tych wszystkich modułów, wraz z opisem można znaleć na stronach projektu Linux-PAM. Poniższa lista zawiera informację o niektórych wybranych modułach:
Moduły dodatkowe umożliwiajš wprowadzenie rozproszonego systemu autentykacji wykorzystujšcego sieć komputerowš. Dostępne sš moduły umożliwiajšce połšczenia z sieciš opartš na serwisach LDAP, NDS czy Samba.
Po pierwsze, konfiguracja PAM powinna zawierać plik /etc/pam.d/other okrelajšcy domylne zachowanie systemu dla usług nie majšcych osobnych metod autentykacji.
Plik /etc/pam.d/other może wyglšdać następujšco:
------------------------------------------------------------------------
auth required /lib/security/pam_warn.so
auth required /lib/security/pam_unix.so
account required /lib/security/pam_warn.so
account required /lib/security/pam_unix.so
password required /lib/security/pam_warn.so
password required /lib/security/pam_unix.so
session required /lib/security/pam_warn.so
session required /lib/security/pam_unix.so
------------------------------------------------------------------------
Przy takiej konfiguracji usługi nie majšce własnych metod autentykacji będš obsługiwane w standardowy sposób, na podstawie pliku /etc/passwd. Dodatkowo, moduł pam_warn będzie rejestrował dostęp do usługi przez Syslog.
Jeżeli w powyższym przykładzie każde wystšpienie modułu pam_unix.so, zastšpi się przez pam_deny.so to dostęp do usług, które nie majš zdefiniowanych osobno metod autentykacji będzie zabroniony.
Przykład ilustruje ważnš cechę PAM, a mianowicie hierarchiczne łšczenie modułów. Dla każdej usługi (w tym przypadku other) i każdego typu modułu (na przykład auth) można podać kilka modułów, jeden po drugim (ang. stacking). W takim przypadku sš one wykonywane kolejno i w zależnoci od wyniku działania konkretnego modułu możliwe jest przerywanie sekwencji. Przy pomocy modułu pam_if istnieje nawet możliwoć warunkowego wykonywania sekwencji modułów.
Przykład rozbudowanej konfiguracji PAM dla programu login może wyglšdać tak:
------------------------------------------------------------------------
auth requisite /lib/security/pam_unix.so nullok
auth required /lib/security/pam_securetty.so
auth required /lib/security/pam_nologin.so
auth required /lib/security/pam_env.so
auth required /lib/security/pam_mail.so
account required /lib/security/pam_unix.so
password required /lib/security/pam_unix.so
session required /lib/security/pam_unix.so
session required /lib/security/pam_limits.so
------------------------------------------------------------------------
W trakcie autentykacji jest sprawdzany terminal z którego użytkownik się loguje, istnienie blokady logowania, ustawiane jest rodowisko pracy i wywietlana jest informacja o poczcie elektronicznej. Parametry sesji sš regulowane w zależnoci od dostępnych zasobów.
Inny, prosty przykład, wykorzystujšcy listę użytkowników uprawnionych do logowania jest następujšcy:
------------------------------------------------------------------------
auth required /lib/security/pam_listfile.so
onerr=fail item=user sense=allow file=/etc/pam-login_users
auth required /lib/security/pam_unix.so
account required /lib/security/pam_unix.so
password required /lib/security/pam_unix.so
session required /lib/security/pam_unix.so
------------------------------------------------------------------------
Przykład konfiguracji usługi Ftp z uwzględnieniem dostępu anonimowego:
------------------------------------------------------------------------
ftpd auth sufficient /usr/lib/security/pam_ftp.so
ftpd auth required /usr/lib/security/pam_unix_auth.so use_first_pass
ftpd auth required /usr/lib/security/pam_listfile.so
onerr=succeed item=user sense=deny file=/etc/ftpusers
------------------------------------------------------------------------
Pierwszy z modułów realizuje dostęp przez anonimowe Ftp, drugi typowy dostęp dla użytkowników, a trzeci sprawdza, czy użytkownik nie ma zabronionego dostępu do usługi w pliku /etc/ftpusers.
W przypadku użycia opcji debug lub modułu pam_warn.so system PAM rejestruje zdarzenia przy pomocy Syslog. Te komunikaty mogš wyglšdać następujšco:
login: pam_unix session started for user root, service login
xdm: pam_unix session finished for user gjn, service xdm