PAM je sada knihoven, která poskytuje API pro ověření identity. Jejím hlavním rysem je schopnost dynamicky konfigurovat, jaké aplikace budou používat jaké metody ověření identity. Funkce jsou rozděleny do čtyřech skupin:
Account management
Authentication management
Password management
Session management
PAM je konfigurována souborem, který pro každou službu (aplikace, která chce PAM používat) uvádí, pro jakou skupinu bude použitý jaký modul a jak se zachovat při jeho selhání.
> cat /etc/pam.d/login auth required pam_securetty.so auth required pam_stack.so service=system-auth auth required pam_nologin.so account required pam_stack.so service=system-auth password required pam_stack.so service=system-auth session required pam_stack.so service=system-auth session optional pam_console.so
Uvedený příklad říká, že přihlášení pomocí služby login bude vyžadovat úspěšné vykonání modulů securetty, stack a nologin. Modul securetty testuje, zda se uživatel root přihlašuje z terminálu uvedeného v /etc/securetty, pro ostatní uživatele uspěje vždy. Modul nologin testuje, zda neexistuje soubor /etc/nologin, pokud ano, uspěje pouze uživatel root. Modul stack zařadí všechny testy služby system-auth, kde jsou ještě moduly env (podle /etc/security/pam_env.conf nastaví proměnné prostředí), unix (podle /etc/passwd a /etc/shadow ověří jméno a heslo) a deny (jako default volba vždy selže). Novější verze mají místo modulu stack volby include a substack.
Obecně lze použít volby requisite - selhání modulu způsobí okamžité vrácení chyby, required - selhání modulu způsobí vrácení chyby po zpracování ostatních modulů, sufficient - úspěch modulu způsobí okamžité vrácení úspěšného výsledku, optional - úspěch či selhání modulu je důležité pouze pokud je jediný. Krom toho existují ještě složitější metody kombinace modulů, které dovolují pro každý možný způsob ukončení modulu (hlavně úspěch a selhání, ale ještě mnoho dalších) uvést, zda se má modul ignorovat, zda má stack okamžitě nebo nakonec selhat nebo uspět, a ještě pár maličkostí.
Z pohledu programátora je pak použití PAM přímočaré, hlavní je asi funkce pam_authenticate pro ověření uživatele, další funkce jsou k dispozici pro zbývající funkce knihovny. Zvláštností je použití konverzační funkce, to je callback funkce poskytnutá aplikací knihovně tak, aby tato mohla v případě potřeby vyzvat uživatele například k zadání hesla.
#include <security/pam_appl.h> #include <security/pam_misc.h> static struct pam_conv conv = { misc_conv, NULL }; int main(int argc, char *argv[]) { pam_handle_t *pamh = NULL; char *user; int retval; // ... retval = pam_start ("check_user", user, &conv, &pamh); if (retval == PAM_SUCCESS) retval = pam_authenticate (pamh, 0); // Is user really himself ? if (retval == PAM_SUCCESS) retval = pam_acct_mgmt (pamh, 0); // Is user account valid ? if (retval == PAM_SUCCESS) // ... pam_end (pamh, retval); }
References.
Linux Man Pages
Morgan A. G.: Linux PAM Application Developer's Guide
Morgan A. G.: Linux PAM System Administrator's Guide