Notes d’apprentissage§

PAM (Pluggable Authentication Modules) est la couche qui décide comment un service authentifie et autorise un utilisateur. Au lieu que chaque programme (login, sshd, sudo) code sa propre logique, ils délèguent tous à PAM via des fichiers de configuration empilables.

Modèle mental : une pile de modules par service.

/etc/pam.d/sshd
   auth      ...  ┐
   auth      ...  ├─ pile "auth"    : suis-je qui je prétends être ?
   account   ...  ┤  pile "account" : ai-je le droit de me connecter ?
   password  ...  ┤  pile "password": règles de changement de mot de passe
   session   ...  ┘  pile "session" : préparer/clore la session

Chaque ligne appelle un module (.so) avec un type et un contrôle. PAM exécute la pile de haut en bas et combine les résultats.

Les quatre types (les colonnes du tableau ci-dessous) répondent chacun à une question : auth (identité), account (validité du compte), password (changement de mdp), session (ouverture/fermeture).

Le contrôle décide quoi faire du résultat de chaque module :

ContrôleComportement
requireddoit réussir ; la pile continue quand même (échec discret)
requisitedoit réussir ; arrêt immédiat en cas d’échec
sufficientsuccès → on s’arrête en succès
optionalrésultat ignoré sauf s’il est le seul module

Les modules utiles à reconnaître :

La complexité avec pwquality : valeurs négatives = obligation. dcredit = -1 impose au moins un chiffre ; une valeur positive donnerait un bonus de longueur. Contre-intuitif, donc souvent piégé.

Pièges (sécurité critique) :

Énoncé§

Solve this question on: app-srv1

  1. Block the user mallory from logging in via SSH using PAM (pam_listfile).
  2. Enforce a minimum password length of 12 characters with at least one digit and one upper-case letter.
  3. Lock a local account after 5 consecutive failed login attempts for 15 minutes.

Solution§

PAM crash course§

PAM = Pluggable Authentication Modules. Each service (sshd, login, sudo…) has a config file under /etc/pam.d/.

A PAM rule has the form:

<type>   <control>   <module>   [arguments]
TypePurpose
authidentify the user (password, key, token)
accountaccount validity (expired? allowed?)
passwordpassword change rules
sessionset up/tear down session (mount homedir, logging)
ControlBehaviour
requiredmust pass; continues either way
requisitemust pass; stops immediately on failure
sufficientsuccess → stop with success
optionalresult ignored unless only module
[success=1 default=ignore]precise jump syntax

Step 1 — Deny specific users via pam_listfile§

Create the deny list:

sudo bash -c 'echo mallory > /etc/ssh/denied-users'
sudo chmod 600 /etc/ssh/denied-users

Edit /etc/pam.d/sshd, add near the top of the auth stack:

auth required pam_listfile.so item=user sense=deny file=/etc/ssh/denied-users onerr=succeed

Restart sshd: sudo systemctl restart sshd.

Step 2 — Password strength via pam_pwquality§

Install if needed:

sudo apt install libpam-pwquality       # Debian
sudo dnf install libpwquality           # RHEL

Edit /etc/security/pwquality.conf:

minlen = 12
dcredit = -1          # require at least 1 digit
ucredit = -1          # at least 1 uppercase
lcredit = -1          # at least 1 lowercase
ocredit = -1          # at least 1 other
minclass = 3
retry = 3

Negative values = required count; positive values = bonus credit.

Make sure /etc/pam.d/common-password (Debian) or /etc/pam.d/system-auth (RHEL) contains:

password requisite pam_pwquality.so retry=3

Step 3 — Account lockout with pam_faillock (RHEL) / pam_tally2 (older)§

RHEL 8+ / Fedora — pam_faillock:

Edit /etc/security/faillock.conf:

deny = 5
unlock_time = 900
fail_interval = 900
even_deny_root = no

Then in /etc/pam.d/system-auth and /etc/pam.d/password-auth:

auth        required      pam_faillock.so preauth silent
auth        sufficient    pam_unix.so nullok
auth        [default=die] pam_faillock.so authfail
account     required      pam_faillock.so

Manage manually:

sudo faillock --user alice               # show count
sudo faillock --user alice --reset       # clear

Debian — pam_tally2 (older) or pam_faillock:

auth required pam_tally2.so deny=5 unlock_time=900 onerr=fail
account required pam_tally2.so

Reset:

sudo pam_tally2 --user alice --reset

Test PAM rules safely§

Always keep a second open root session before editing PAM — a syntax error can lock everyone out.

sudo pamtester sshd alice authenticate

Other useful PAM modules§

ModulePurpose
pam_limits.soenforce /etc/security/limits.conf (see q20-user-and-group-limits)
pam_unix.soclassic /etc/shadow check
pam_access.soper-user/group/host access rules (/etc/security/access.conf)
pam_time.sorestrict by hour/day
pam_nologin.soblock non-root when /etc/nologin exists
pam_env.soset env vars from /etc/security/pam_env.conf
pam_mkhomedir.socreate home dir on first login
pam_lastlog.sodisplay last login info