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 Linuxroot: l’utilisateur root
Les items de limits.conf
| item | ce qu’il plafonne |
|---|---|
nproc | le nombre de process |
nofile | le nombre de file descriptors ouverts |
as | la mémoire (address space) en KB |
rss | la mémoire résidente en KB (ancien, remplacé par as) |
cpu | le temps CPU en minutes |
maxlogins | le nombre de sessions simultanées |
core | la 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é.