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 określa na podstawie konfiguracji (odpowiedniej dla danej aplikacji) sposób autentykacji i określa 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 wartości 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 wartości: ignore, ok, done, bad, die, reset. Oznaczają one działanie, jakie biblioteka ma podjąć po otrzymaniu kodu o podanej wartości.
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 pomyślna 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 określający domyślne 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żności 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 wyświetlana jest informacja o poczcie elektronicznej. Parametry sesji są regulowane w zależności 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