sysctl règle les paramètres du noyau Linux à chaud : comment la pile
réseau traite les paquets, ce que le noyau expose aux processus, comment le
système de fichiers se protège. Par défaut, plusieurs de ces réglages
favorisent la compatibilité plutôt que la sécurité. Ce guide montre comment
établir une baseline, appliquer un jeu de durcissement aligné sur les
CIS Benchmarks et ANSSI-BP-028 v2.0 (recommandations R9 « options de
configuration du noyau » et R12 « options de configuration du réseau ») de
façon persistante, vérifier son effet, et éviter les pièges (un paramètre
mal posé peut couper le réseau). Public visé :
administrateurs qui durcissent un serveur exposé.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Lire et modifier un paramètre noyau (
sysctl -n,-w,sysctl.d) - Capturer une baseline avant de toucher quoi que ce soit
- Appliquer un jeu de durcissement réseau, noyau et fichiers, persistant au reboot
- Vérifier l'effet réel (et pourquoi certains réglages exigent une VM)
- Éviter les réglages qui cassent le routage ou un nœud Kubernetes
Qu'est-ce que sysctl
Section intitulée « Qu'est-ce que sysctl »sysctl est l'interface qui lit et écrit les variables du noyau exposées
sous /proc/sys/. Chaque variable a un nom hiérarchique (net.ipv4.ip_forward)
qui correspond à un fichier (/proc/sys/net/ipv4/ip_forward).
| Action | Commande | Persistance |
|---|---|---|
| Lire une valeur | sysctl -n net.ipv4.ip_forward | Sans objet |
| Modifier à chaud | sysctl -w net.ipv4.ip_forward=0 | Perdu au reboot |
| Rendre persistant | Fichier dans /etc/sysctl.d/ + sysctl --system | Survit au reboot |
Pour le durcissement, on écrit toujours dans un fichier de
/etc/sysctl.d/ : les modifications à la volée (-w) servent au test mais
disparaissent au redémarrage.
Prérequis
Section intitulée « Prérequis »- Un serveur Linux (Debian, Ubuntu, RHEL, AlmaLinux, Rocky) ou une VM
- Un accès root (ou
sudo) - Idéalement une VM de test : certains réglages réseau peuvent couper une connexion mal anticipée
Établir une baseline
Section intitulée « Établir une baseline »Avant de durcir, mesurez l'existant. Les valeurs par défaut varient selon la distribution et la version, donc ne supposez rien.
for k in net.ipv4.conf.all.accept_redirects net.ipv4.conf.all.send_redirects \ net.ipv4.conf.all.rp_filter net.ipv4.conf.all.log_martians \ kernel.kptr_restrict kernel.yama.ptrace_scope; do printf "%-42s = %s\n" "$k" "$(sysctl -n $k)"doneSur une Debian 12 fraîche, plusieurs réglages sensibles sont peu sûrs par défaut :
net.ipv4.conf.all.accept_redirects = 1net.ipv4.conf.all.send_redirects = 1net.ipv4.conf.all.rp_filter = 0net.ipv4.conf.all.log_martians = 0kernel.kptr_restrict = 0kernel.yama.ptrace_scope = 0Ce sont précisément ces valeurs que le durcissement va corriger. D'autres
(comme kernel.randomize_va_space = 2 ou fs.protected_symlinks = 1) sont
souvent déjà correctes, mais on les fige quand même pour éviter toute dérive.
Déployer un jeu de durcissement
Section intitulée « Déployer un jeu de durcissement »Placez la configuration dans /etc/sysctl.d/99-hardening.conf. Le préfixe
99- garantit qu'il est lu en dernier (ordre lexical), donc qu'il
l'emporte sur les valeurs posées par la distribution.
-
Créer le fichier de durcissement
/etc/sysctl.d/99-hardening.conf # --- Reseau : routage et redirections ---net.ipv4.ip_forward = 0net.ipv4.conf.all.accept_redirects = 0net.ipv4.conf.default.accept_redirects = 0net.ipv6.conf.all.accept_redirects = 0net.ipv4.conf.all.send_redirects = 0net.ipv4.conf.default.send_redirects = 0net.ipv4.conf.all.accept_source_route = 0net.ipv6.conf.all.accept_source_route = 0# --- Reseau : anti-spoofing et journalisation ---net.ipv4.conf.all.rp_filter = 1net.ipv4.conf.default.rp_filter = 1net.ipv4.conf.all.log_martians = 1net.ipv4.icmp_echo_ignore_broadcasts = 1net.ipv4.icmp_ignore_bogus_error_responses = 1net.ipv4.tcp_syncookies = 1net.ipv4.tcp_rfc1337 = 1net.ipv6.conf.all.accept_ra = 0# --- Noyau : exposition d'informations ---kernel.kptr_restrict = 2kernel.dmesg_restrict = 1kernel.randomize_va_space = 2kernel.yama.ptrace_scope = 1kernel.kexec_load_disabled = 1# --- Systeme de fichiers ---fs.protected_hardlinks = 1fs.protected_symlinks = 1fs.protected_fifos = 2fs.protected_regular = 2fs.suid_dumpable = 0 -
Appliquer la configuration
Fenêtre de terminal sudo sysctl --system* Applying /etc/sysctl.d/99-hardening.conf ...sysctl --systemrecharge tous les fichierssysctl.ddans l'ordre. Une valeur refusée (paramètre inconnu sur votre noyau) provoque une ligne d'erreur explicite, sans bloquer le reste.
Vérifier l'effet
Section intitulée « Vérifier l'effet »Relisez les valeurs ciblées : elles doivent avoir basculé.
sysctl net.ipv4.conf.all.rp_filter kernel.kptr_restrict kernel.yama.ptrace_scopenet.ipv4.conf.all.rp_filter = 1kernel.kptr_restrict = 2kernel.yama.ptrace_scope = 1Pour une preuve concrète, regardez l'effet de kptr_restrict = 2 sur les
adresses des symboles du noyau :
head -2 /proc/kallsyms0000000000000000 A fixed_percpu_data0000000000000000 A __per_cpu_startLes adresses réelles sont masquées (remplacées par des zéros), même pour root : un exploit local ne peut plus les lire pour contourner l'ASLR du noyau.
Le piège conteneur contre VM
Section intitulée « Le piège conteneur contre VM »C'est la limite à connaître avant de penser durcir « partout ». Dans un conteneur non privilégié, les paramètres noyau sont en lecture seule :
# Dans un conteneursysctl -w kernel.kptr_restrict=2# sysctl: permission denied on key "kernel.kptr_restrict"
sysctl -w net.ipv4.conf.all.rp_filter=1# net.ipv4.conf.all.rp_filter = 1 (accepte : net.* est namespace)| Famille | Conteneur non privilégié | VM / physique |
|---|---|---|
kernel.*, fs.* | Lecture seule (refusé) | Modifiable |
net.* | Modifiable (isolé par netns) | Modifiable |
Concrètement : un durcissement noyau complet ne s'applique qu'au niveau de l'hôte (ou d'une VM), pas depuis un conteneur applicatif. Les conteneurs héritent du noyau durci de l'hôte.
Sécurité et points de vigilance
Section intitulée « Sécurité et points de vigilance »Certains réglages cassent des cas légitimes. Adaptez avant d'appliquer en masse :
ip_forward = 0coupe le routage. Un routeur, une passerelle NAT, un nœud Kubernetes ou un hôte Docker ont besoin deip_forward = 1. Ne durcissez ce paramètre que sur un serveur applicatif simple.rp_filter = 1(strict) casse le routage asymétrique et les hôtes multi-homés. En cas de doute, utilisez la valeur2(mode lâche), qui garde une protection sans rejeter le trafic légitime.accept_ra = 0suppose une IPv6 configurée statiquement. Sur un réseau qui distribue les préfixes par Router Advertisement, gardez-le activé.- Toujours tester sur une VM ou via une console de secours (KVM/IPMI) : un mauvais réglage réseau appliqué à distance peut vous couper l'accès.
Pour industrialiser ces réglages sur un parc, le module
ansible.posix.sysctl
applique et rend persistants ces paramètres de façon idempotente.
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
permission denied on key kernel.* | Exécution dans un conteneur | Appliquer sur l'hôte ou une VM |
| Le réglage revient à l'ancienne valeur après reboot | Modifié avec -w au lieu d'un fichier sysctl.d | Écrire dans /etc/sysctl.d/ puis sysctl --system |
Une valeur de sysctl.d est ignorée | Un fichier au préfixe plus élevé la réécrit | Vérifier l'ordre avec sysctl --system ; nommer en 99- |
| Perte de connectivité après application | ip_forward=0 ou rp_filter=1 sur un routeur/multi-homé | Restaurer via console, ajuster (ip_forward=1, rp_filter=2) |
unknown key à l'application | Paramètre absent sur ce noyau | Retirer la ligne ou ignorer (non bloquant) |
À retenir
Section intitulée « À retenir »- sysctl règle le noyau à chaud ; pour durcir, on écrit dans
/etc/sysctl.d/(persistant) - Capturez une baseline d'abord : les défauts varient selon la distribution
- Cibles clés : redirections, rp_filter, kptr_restrict, ptrace_scope, protections fs
kptr_restrict = 2masque les adresses noyau (vérifiable dans/proc/kallsyms)- En conteneur, seuls les
net.*sont modifiables : le durcissement noyau se fait sur l'hôte/VM - Attention à
ip_forwardetrp_filter: ils cassent routeurs et hôtes multi-homés