Durcissement (hardening) des serveurs Linux
Quitter

Leçon 1 sur 13 · Fondamentaux

Modèle de menace et surface d'attaque

30 min Debian 12 Versions Debian 12, Ubuntu 24.04, Rocky 9

Objectif

Avant de durcir un serveur, savoir ce que l'on protège, contre qui et par où un attaquant peut entrer. Vous repartirez avec une méthode simple d'inventaire que vous réutiliserez dans toutes les leçons suivantes.

L'essentiel

  • Durcir (hardening), c'est retirer à un système tout ce dont il n'a pas besoin et verrouiller ce qui reste. Ce n'est pas installer « un logiciel de sécurité ».
  • Un modèle de menace répond à trois questions : quels actifs ?, quelles menaces ?, quelles mesures ?
  • La surface d'attaque, c'est tout ce qu'un attaquant peut toucher : ports ouverts, comptes, logiciels installés, fichiers trop ouverts, personnes.
  • Deux principes guident tout le cours : minimisation (moins de choses = moins de failles) et défense en profondeur (plusieurs barrières indépendantes).
  • On mesure avant et on mesure après : sans inventaire initial, impossible de prouver qu'un serveur est plus sûr.

1. Pourquoi durcir ? Trois situations marocaines

Une PME de Casablanca vend en ligne. Son site tourne sur un VPS loué. Un matin, la page d'accueil affiche le message d'un pirate. Cause : une extension web jamais mise à jour, et un compte SSH admin avec le mot de passe Admin2024.

Un hôpital à Fès a un serveur de rendez-vous. Le serveur contient des noms, des numéros de téléphone et des motifs de consultation. Ce sont des données à caractère personnel au sens de la loi 09-08, sous le contrôle de la CNDP. Une fuite engage la responsabilité de l'établissement.

Une banque à Rabat est soumise à des règles strictes : la loi 05-20 sur la cybersécurité et les directives de la DGSSI (Direction générale de la sécurité des systèmes d'information). Les auditeurs demandent des preuves : configuration écrite, journaux, rapport d'audit.

Dans les trois cas, la question n'est pas « est-ce que mon serveur peut être attaqué ? » (oui, il le sera) mais « combien d'efforts l'attaquant devra-t-il faire, et verrai-je l'attaque ? ».

2. Construire un modèle de menace en 15 minutes

Prenez une feuille, ou un simple fichier texte, et remplissez trois colonnes.

Actif (ce qui a de la valeur) Menace (ce qui peut arriver) Mesure (ce que je fais)
Base des clients Vol par injection SQL Compte SQL limité, sauvegardes chiffrées
Accès SSH Force brute sur les mots de passe Clés SSH, fail2ban
Site vitrine Défiguration Mises à jour, fichiers en lecture seule
Disque du serveur Panne ou rançongiciel Sauvegarde hors du serveur, testée

Posez-vous ensuite la question « qui ? » :

  • le robot qui scanne tout Internet (le plus fréquent : quelques minutes après sa mise en ligne, un VPS reçoit déjà des tentatives SSH) ;
  • le cybercriminel qui cherche un serveur à chiffrer contre rançon ;
  • l'initié : un ancien employé, un prestataire dont le compte n'a jamais été fermé ;
  • l'erreur humaine : un fichier de sauvegarde laissé dans le dossier web.

Le durcissement protège surtout contre les deux premiers et le dernier. Contre l'initié, il faut en plus des procédures : fermer les comptes au départ, tracer les actions (leçon 3.2).

3. Mesurer la surface d'attaque

Voici l'inventaire de départ, à faire sur chaque serveur. Toutes ces commandes sont en lecture seule : elles ne changent rien.

# Quel système, quelle version ? (la durée du support en dépend)
cat /etc/os-release
uname -r                          # version du noyau

# Qui écoute sur le réseau ? (TCP et UDP, avec le programme)
ss -tulpn
#  0.0.0.0:22   → ouvert à tout le monde
#  127.0.0.1:3306 → seulement en local (bien pour une base de données)

# Quels comptes peuvent ouvrir une session ?
awk -F: '$7 !~ /(nologin|false)$/ {print $1, $7}' /etc/passwd

# Qui peut devenir root ?
getent group sudo wheel           # sudo sur Debian/Ubuntu, wheel sur Rocky
ls /etc/sudoers.d/

# Combien de logiciels installés ? (chaque paquet est une faille possible)
dpkg -l | grep -c '^ii'           # Debian / Ubuntu
rpm -qa | wc -l                   # Rocky / RHEL

# Quels services démarrent avec la machine ?
systemctl list-unit-files --state=enabled

# Quels programmes s'exécutent avec les droits de leur propriétaire (SUID) ?
find / -xdev -type f -perm -4000 2>/dev/null

Gardez ces sorties dans un dossier daté, par exemple /root/inventaire/2026-10-19/. À la fin du cours, vous referez le même inventaire et vous comparerez.

4. Les principes qui guident chaque décision

Minimisation. Un service qui n'est pas installé ne peut pas être piraté. Avant de « sécuriser » un serveur FTP, demandez-vous s'il est encore utile.

Moindre privilège. Chaque compte, chaque service n'a que les droits dont il a besoin. Le serveur web n'a pas à écrire dans ses propres fichiers PHP.

Défense en profondeur. Pare-feu, plus SSH durci, plus fail2ban, plus journaux : si une barrière tombe, la suivante tient.

Traçabilité. Ce qui n'est pas journalisé n'a pas existé. Sans journaux, impossible d'expliquer un incident à la direction, à la CNDP ou à maCERT (le CERT national rattaché à la DGSSI).

Réversibilité. Chaque changement est noté, testé et réversible. On ne durcit jamais un serveur en production sans une console de secours (accès VNC du fournisseur, console de la VM).

5. Les référentiels : ne pas réinventer la roue

Vous n'êtes pas seul. Des organismes publient des listes de recommandations :

  • ANSSI (agence française) : Recommandations de configuration d'un système GNU/Linux. Gratuit, sous Licence Ouverte, en français. Il classe les mesures par niveau (minimal, intermédiaire, renforcé, élevé).
  • CIS Benchmarks (Center for Internet Security) : des guides très détaillés par distribution. Gratuits à lire, mais leur licence interdit de les recopier.
  • DGSSI : la Directive nationale de la sécurité des systèmes d'information (DNSSI) fixe des règles pour les administrations et les infrastructures d'importance vitale au Maroc.

Ce cours suit le même esprit et vous apprend à appliquer ces mesures, puis à les vérifier avec Lynis (leçon 4.1).

6. Comment se dérouleront les labs

Les labs se font sur votre propre machine virtuelle (jamais sur votre PC personnel, jamais sur un serveur de production) :

sudo ml demarrer hardening-1-1    # prépare la machine et affiche les tâches
# … vous travaillez …
sudo ml verifier                  # contrôle chaque tâche

Certaines leçons modifient des fichiers sensibles (SSH, pare-feu). Pour ne jamais vous couper l'accès, nous travaillerons souvent sur une copie dans /root/durcir/, que l'on teste avant de l'appliquer. Gardez toujours la console de la VM ouverte.

Selon la version

Point Debian 12 Ubuntu 24.04 Rocky 9
Groupe des administrateurs sudo sudo wheel
Pare-feu fourni aucun actif (nftables installé) ufw (inactif) firewalld (actif)
Contrôle d'accès obligatoire AppArmor AppArmor SELinux
Fin du support standard mi-2026, puis LTS jusqu'en 2028 2029 (2034 avec Ubuntu Pro) 2032

Pièges fréquents

  • Durcir sans inventaire : vous ne saurez jamais ce que vous avez réellement amélioré, ni ce que vous avez cassé.
  • Copier une liste de commandes trouvée en ligne sans comprendre : c'est la meilleure façon de se couper SSH ou de casser une application.
  • Oublier les comptes « oubliés » : un prestataire parti avec un shell actif est une porte ouverte. Le compte sync (shell /bin/sync) est normal sur Debian.
  • Croire qu'un VPS « tout neuf » est sûr : les images des hébergeurs ont souvent l'authentification SSH par mot de passe activée.

Lab

Vous allez commencer l'inventaire de votre serveur :

  1. noter le système et sa version à partir de /etc/os-release ;
  2. fermer le compte d'un prestataire parti ;
  3. lister les comptes qui peuvent encore ouvrir une session ;
  4. écrire votre premier modèle de menace en trois colonnes.

Quiz

  1. Quelles sont les trois colonnes d'un modèle de menace ?
  2. Dans la sortie de ss -tulpn, quelle différence entre 0.0.0.0:3306 et 127.0.0.1:3306 ?
  3. Pourquoi un service non installé est-il plus sûr qu'un service bien configuré ?
  4. Citez deux référentiels de durcissement et leur différence de licence.
  5. Pourquoi faut-il une console de secours avant de durcir SSH ou le pare-feu ?
Réponses
  1. Actif (ce qui a de la valeur), menace (ce qui peut arriver), mesure (ce que l'on fait).
  2. 0.0.0.0:3306 accepte les connexions de toutes les interfaces, donc potentiellement d'Internet ; 127.0.0.1:3306 n'accepte que les connexions locales.
  3. Parce qu'il ne peut contenir aucune faille exploitable : c'est le principe de minimisation.
  4. Le guide de l'ANSSI (Licence Ouverte, réutilisable) et les CIS Benchmarks (lecture gratuite, reproduction interdite).
  5. Une erreur de configuration peut bloquer toute connexion réseau : seule la console (VNC, console de VM) permet alors de réparer.

Sources de référence : guide ANSSI GNU/Linux (Licence Ouverte), documentation Red Hat, pages de manuel. Texte original MasterLinux.

Exercices pratiques

À réaliser sur Debian 12

Faites ce lab sur votre machine

Le terminal, c’est le vôtre : une VM Linux (VirtualBox, VMware, Hyper-V, WSL…) ou Docker/Podman. L’outil ml prépare l’exercice et corrige votre travail ; la leçon se valide toute seule ici.

Créez un compte gratuit pour obtenir votre commande personnelle et faire valider vos labs automatiquement.

Créer mon compte

Tâches à réaliser

  1. Écrivez dans /root/inventaire/systeme.txt l'identifiant et la version du système, séparés par une espace, tels qu'ils figurent dans /etc/os-release (champs ID et VERSION_ID), par exemple : debian 12
    Afficher un indiceChargez le fichier avec . /etc/os-release puis echo "$ID $VERSION_ID" > /root/inventaire/systeme.txt
    Voir la solution
    . /etc/os-release && echo "$ID $VERSION_ID" > /root/inventaire/systeme.txt

    Vérification : . /etc/os-release && grep -qx "$ID $VERSION_ID" /root/inventaire/systeme.txt

  2. Le compte ancien_presta appartient à un prestataire parti. Retirez-lui tout shell de connexion (shell /usr/sbin/nologin) et verrouillez son mot de passe.
    Afficher un indiceusermod -s /usr/sbin/nologin ancien_presta puis usermod -L ancien_presta (ou passwd -l)
    Voir la solution
    usermod -s /usr/sbin/nologin -L ancien_presta

    Vérification : getent passwd ancien_presta | cut -d: -f7 | grep -qx /usr/sbin/nologin && getent shadow ancien_presta | cut -d: -f2 | grep -q '^!'

  3. Écrivez dans /root/inventaire/comptes-shell.txt la liste triée (sort) des comptes dont le shell ne se termine ni par nologin ni par false, un nom par ligne.
    Afficher un indiceawk -F: '$7 !~ /(nologin|false)$/ {print $1}' /etc/passwd | sort > … — ne soyez pas surpris de voir root et sync.
    Voir la solution
    awk -F: '$7 !~ /(nologin|false)$/ {print $1}' /etc/passwd | sort > /root/inventaire/comptes-shell.txt

    Vérification : test -s /root/inventaire/comptes-shell.txt && awk -F: '$7 !~ /(nologin|false)$/ {print $1}' /etc/passwd | sort | cmp -s - /root/inventaire/comptes-shell.txt

  4. Rédigez un mini modèle de menace dans /root/inventaire/menaces.txt : au moins 3 lignes au format « actif ; menace ; mesure » (exactement deux points-virgules par ligne).
    Afficher un indiceExemple de ligne : base des clients ; vol par injection SQL ; comptes SQL limités + sauvegardes chiffrées
    Voir la solution
    printf 'base clients ; vol par injection SQL ; compte SQL limité et sauvegardes chiffrées\nacces SSH ; force brute sur les mots de passe ; clés SSH et fail2ban\nsite web ; défiguration ; mises à jour et droits en lecture seule\n' > /root/inventaire/menaces.txt

    Vérification : test "$(grep -c '^[^;][^;]*;[^;][^;]*;[^;][^;]*$' /root/inventaire/menaces.txt)" -ge 3

Références officielles consultées : ANSSI — Recommandations de configuration d'un système GNU/Linux (guide ANSSI-BP-028, Licence Ouverte) : principes de minimisation et de défense en profondeur ; Red Hat Enterprise Linux 9 — Security hardening (chapitre d'introduction) ; Pages de manuel os-release(5), passwd(5), ss(8). Texte original MasterLinux.