Skip to main content
  1. Concetti/

PAM - Pluggable Authentication Modules

·3 mins
Alessio Barnini
Author
Alessio Barnini
Table of Contents

Cosa fa
#

Sistema di autenticazione modulare di Linux. Quando un servizio (SSH, sudo, login) deve autenticare un utente, non gestisce l'autenticazione da solo — delega a PAM. PAM esegue una catena di moduli configurabili, ognuno con un compito preciso. Questo e' il motivo per cui nei log vedi sempre pam_unix(sshd:auth) invece di sshd:auth.

TL;DR
#

ssh pippo@server
sshd  ──delega──►  PAM
              catena moduli /etc/pam.d/sshd
              pam_unix → controlla /etc/passwd e /etc/shadow
              pam_limits → controlla limiti risorse
              pam_env → imposta variabili d'ambiente
              autenticazione: OK o FAILED
              log in /var/log/auth.log:
              pam_unix(sshd:auth): authentication failure

Architettura — moduli e stack
#

/etc/pam.d/
├── sshd          ← configurazione PAM per SSH
├── sudo          ← configurazione PAM per sudo
├── login         ← configurazione PAM per login da console
├── su            ← configurazione PAM per su
└── common-auth   ← configurazione condivisa — inclusa da tutti

Ogni file contiene uno stack di righe nel formato:

tipo_controllo  modulo  argomenti

# Esempio da /etc/pam.d/sshd:
auth    required    pam_unix.so     # verifica password
auth    required    pam_nologin.so  # blocca se esiste /etc/nologin
account required    pam_unix.so     # verifica account attivo
session required    pam_unix.so     # apre/chiude la sessione

I quattro tipi di gestione
#

TipoCosa controlla
authIdentita' — verifica chi sei (password, chiave)
accountAccount — verifica se puoi accedere (scadenza, orari)
passwordCambio password — regole di complessita'
sessionSessione — setup e teardown (montare home, log)

I flag di controllo
#

FlagComportamento
requiredDeve passare — ma esegue tutti i moduli prima di fallire
requisiteDeve passare — se fallisce si ferma subito
sufficientSe passa, basta — ignora i moduli successivi
optionalIl risultato non e' determinante

Cosa appare in auth.log
#

# Login SSH riuscito
pam_unix(sshd:session): session opened for user barno(uid=1000) by barno(uid=0)

# Login SSH fallito — utente inesistente
pam_unix(sshd:auth): check pass; user unknown

# sudo riuscito
pam_unix(sudo:session): session opened for user root(uid=0) by barno(uid=1000)

# sudo fallito — utente non in sudoers
sudo: barno : user NOT in sudoers

# su riuscito
pam_unix(su-l:session): session opened for user testuser(uid=1001) by barno(uid=1000)
# la "l" in su-l indica login shell — conferma l'uso di su -

Il formato e' sempre: pam_modulo(servizio:tipo): messaggio


Moduli pam principali
#

ModuloCosa fa
pam_unix.soAutenticazione classica — legge /etc/passwd e /etc/shadow
pam_nologin.soBlocca tutti i login se esiste /etc/nologin
pam_limits.soApplica limiti di risorse da /etc/security/limits.conf
pam_env.soImposta variabili d'ambiente al login
pam_tally2.soConta i tentativi falliti — blocca dopo N fallimenti
pam_google_authenticator.so2FA con Google Authenticator

Scenario Reale
#

Un analista vede in auth.log:

pam_unix(sshd:auth): authentication failure; logname= uid=0
  euid=0 tty=ssh ruser= rhost=45.33.12.1 user=root

Il pattern user=root con rhost esterno significa tentativi di brute force SSH direttamente su root. La prima contromisura e' PermitRootLogin no in /etc/ssh/sshd_config — PAM non arrivera' mai a verificare la password di root perche' sshd blocca prima.

Dove l'ho incontrato
#

  • auth-log — ogni riga di auth.log e' generata da un modulo PAM
  • sudo — sudo delega l'autenticazione a PAM
  • su — su delega l'autenticazione a PAM

Collegato a
#

  • iam — categoria
  • system — categoria
  • auth-log — dove PAM scrive i log
  • sudo — usa PAM per autenticare
  • su — usa PAM per autenticare
  • ssh — usa PAM per autenticare

Related