guest@6admin.io:~$

PAM: limitez les ressources système

PAM (Pluggable Authentication Modules) ne fait pas que de l’authentification: le module pam_limits plafonne les ressources système par utilisateur et par groupe. Sans limites, un process peut manger tout le RAM, tous les file descriptors, tous les process slots: c’est le fork bomb ou simplement un process qui leak de la mémoire.

Le fichier limits.conf

# /etc/security/limits.conf
# <domain>  <type>  <item>  <value>

# Plafonner les process pour tous les utilisateurs
*       soft    nproc   2048
*       hard    nproc   4096

# Plafonner le nombre de fichiers ouverts
*       soft    nofile  1024
*       hard    nofile  4096

# Plafonner la mémoire (en KB)
*       soft    as      1048576
*       hard    as      2097152

# Pour le groupe backup: plus de fichiers ouverts
@backup soft    nofile  8192
@backup hard    nofile  16384

# Pour root: pas de limite
root    soft    nproc   unlimited
root    hard    nproc   unlimited
  • soft : la limite courante (le process peut la dépasser jusqu’à la hard limit)
  • hard : la limite maximum (le process ne peut pas la dépasser, même avec ulimit -Hn)
  • * : tous les utilisateurs
  • @group : un groupe Linux
  • root : l’utilisateur root

Les items de limits.conf

itemce qu’il plafonne
nprocle nombre de process
nofilele nombre de file descriptors ouverts
asla mémoire (address space) en KB
rssla mémoire résidente en KB (ancien, remplacé par as)
cpule temps CPU en minutes
maxloginsle nombre de sessions simultanées
corela taille des core dumps

Vérifier les limites

ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
max nice                (-e) 0
file size               (blocks, -f) unlimited
pending signals         (-i) 4096
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files              (-n) 1024
pipe size               (512 bytes, -p) 8
POSIX message queues    (bytes, -q) 8192
stack size              (kbytes, -s) 8192
cpu time                (seconds, -t) unlimited
max user processes      (-u) 2048
virtual memory          (kbytes, -v) unlimited

ulimit -n montre la limite de file descriptors: 1024 par défaut, ce qui est insuffisant pour un serveur web ou une base de données. 4096 ou 16384 est le minimum pour un serveur.

Le cas nofile

Le nofile est le plus souvent limitant: un serveur web ouvre un fd par connexion, une base de données en ouvre plusieurs par requête et le plafond de 1024 arrive vite. Le fix est dans limits.conf:

www-data soft    nofile  8192
www-data hard    nofile  16384

Puis le process web (Apache, nginx) doit être relancé pour que la nouvelle limite s’applique. Les limites PAM ne s’appliquent qu’aux nouvelles sessions (login, ssh, su), pas aux process en cours.

Ce que PAM limits ne fait pas

PAM limits plafonne les ressources PAR SESSION DE LOGIN. Un process lancé par cron, par un daemon (init) ou par un orchestrator ne passe pas par PAM: il hérite des limites du process qui l’a lancé. Pour plafonner les ressources d’un daemon, il faut ulimit dans le script de lancement.

[edit: 2026] PAM limits est toujours le mécanisme standard pour plafonner les ressources par utilisateur au login. systemd a ajouté LimitNOFILE, LimitNPROC, LimitAS dans les unit files (le mécanisme moderne pour les daemons) et cgroups plafonnent au niveau du container ou du service. Le nofile 1024 par défaut est monté à 1048576 dans les distributions modernes (systemd par défaut), mais les limites PAM restent pertinentes pour les sessions interactives et les connexions SSH. Le fork bomb reste la démonstration la plus visuelle de pourquoi les limites existent: :(){ :|:& };: et le système est mort si nproc n’est pas plafonné.