7.1.1. Linux PAM Example

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:

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. 

  1. Linux Man Pages

  2. Morgan A. G.: Linux PAM Application Developer's Guide

  3. Morgan A. G.: Linux PAM System Administrator's Guide