← Retour aux articles

Sécuriser un serveur Debian

Sécuriser un serveur Debian

Un serveur Debian fraîchement installé fonctionne avec une configuration relativement sobre, mais quelques réglages supplémentaires permettent de réduire fortement sa surface d'attaque.

Cette procédure présente une base de durcissement adaptée à un serveur Debian accessible à distance : mises à jour, compte administrateur, SSH, pare-feu, protection contre les tentatives de connexion et mises à jour automatiques.

Information — Cette procédure convient à Debian 12 et Debian 13. Certaines commandes nécessitent les privilèges root.


1. Mettre le système à jour

Avant de modifier la configuration du serveur, commencez par mettre à jour la liste des paquets :

apt update

Installez ensuite les mises à jour disponibles :

apt upgrade -y

Pour appliquer également les mises à jour pouvant modifier certaines dépendances :

apt full-upgrade -y

Supprimez les paquets devenus inutiles :

apt autoremove --purge -y

Vérifiez si un redémarrage est recommandé :

test -f /var/run/reboot-required && echo "Un redémarrage est nécessaire"

2. Créer un compte administrateur

Il est préférable d'éviter d'utiliser directement le compte root pour l'administration quotidienne du serveur.

Installez sudo si nécessaire :

apt install sudo -y

Créez un nouvel utilisateur :

adduser admin

Remplacez admin par le nom d'utilisateur souhaité.

Ajoutez ensuite cet utilisateur au groupe sudo :

usermod -aG sudo admin

Vérifiez son appartenance aux groupes :

groups admin

Le groupe sudo doit apparaître dans le résultat.

Testez ensuite la connexion avec ce nouvel utilisateur avant de continuer.

ssh admin@IP_DU_SERVEUR

Testez également sudo :

sudo whoami

Le résultat attendu est :

root

Attention — Ne désactivez pas l'accès root en SSH avant d'avoir vérifié que le nouveau compte administrateur fonctionne correctement.


3. Configurer une authentification SSH par clé

Une clé SSH permet d'éviter l'utilisation d'un mot de passe pour les connexions distantes.

Depuis votre poste client, générez une clé si vous n'en possédez pas déjà :

ssh-keygen -t ed25519

La clé publique se trouve généralement dans :

~/.ssh/id_ed25519.pub

Copiez-la sur le serveur :

ssh-copy-id admin@IP_DU_SERVEUR

Testez ensuite la connexion :

ssh admin@IP_DU_SERVEUR

La connexion doit fonctionner avec la clé SSH.

Important — Conservez votre session SSH actuelle ouverte pendant les modifications suivantes. Elle permettra de corriger la configuration en cas d'erreur.


4. Durcir la configuration SSH

Plutôt que de modifier directement /etc/ssh/sshd_config, créez un fichier de configuration dédié :

nano /etc/ssh/sshd_config.d/99-hardening.conf

Ajoutez :

PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no

MaxAuthTries 3
LoginGraceTime 30

X11Forwarding no

Enregistrez le fichier.

Ces paramètres permettent notamment de :

  • désactiver la connexion SSH directe avec root ;
  • imposer l'utilisation d'une clé SSH ;
  • interdire les mots de passe vides ;
  • limiter les tentatives d'authentification ;
  • désactiver le transfert graphique X11.

Vérifiez impérativement la configuration avant de recharger SSH :

sshd -t

Si aucune erreur n'apparaît, rechargez le service :

systemctl reload ssh

Ouvrez une nouvelle session SSH pour vérifier que la connexion fonctionne toujours :

ssh admin@IP_DU_SERVEUR

Attention — Ne fermez pas votre session SSH actuelle tant que la nouvelle connexion n'a pas été validée.


5. Vérifier les services exposés

Avant de configurer le pare-feu, vérifiez les ports actuellement en écoute :

ss -lntup

Pour afficher uniquement les connexions TCP :

ss -lntp

Exemple :

LISTEN 0 128 0.0.0.0:22
LISTEN 0 511 0.0.0.0:80
LISTEN 0 511 0.0.0.0:443

Dans cet exemple, le serveur expose :

22    SSH
80    HTTP
443   HTTPS

Un service inutile ne devrait idéalement pas être accessible depuis le réseau.

Vous pouvez identifier le processus utilisant un port avec :

ss -lntup

ou :

lsof -i :PORT

Installez lsof si nécessaire :

apt install lsof -y

6. Installer un pare-feu avec UFW

Installez UFW :

apt install ufw -y

Configurez la politique par défaut :

ufw default deny incoming
ufw default allow outgoing

Autorisez SSH :

ufw allow 22/tcp

Si le serveur héberge un site web :

ufw allow 80/tcp
ufw allow 443/tcp

Vérifiez les règles avant d'activer le pare-feu :

ufw show added

Activez ensuite UFW :

ufw enable

Vérifiez son état :

ufw status verbose

Exemple :

Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere

Attention — Si votre serveur SSH utilise un autre port que 22, adaptez impérativement la règle avant d'activer UFW.


7. Installer Fail2ban

Fail2ban analyse les tentatives de connexion et peut temporairement bloquer les adresses effectuant trop d'échecs d'authentification.

Installez-le :

apt install fail2ban -y

Créez une configuration locale :

nano /etc/fail2ban/jail.local

Ajoutez :

[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5

[sshd]
enabled = true
backend = systemd

Redémarrez Fail2ban :

systemctl restart fail2ban

Activez son démarrage automatique :

systemctl enable fail2ban

Vérifiez le service :

systemctl status fail2ban

Vérifiez ensuite la protection SSH :

fail2ban-client status sshd

Vous pouvez obtenir un résultat similaire à :

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  `- Total failed: 0
`- Actions
   |- Currently banned: 0
   `- Total banned: 0

Pour afficher les adresses actuellement bannies :

fail2ban-client get sshd banip

8. Activer les mises à jour de sécurité automatiques

Les correctifs de sécurité doivent être appliqués régulièrement.

Installez le mécanisme de mises à jour automatiques :

apt install unattended-upgrades -y

Activez-le :

dpkg-reconfigure --priority=low unattended-upgrades

Sélectionnez :

Oui

Vérifiez la configuration :

cat /etc/apt/apt.conf.d/20auto-upgrades

Elle doit contenir des directives similaires à :

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

Vous pouvez simuler une exécution avec :

unattended-upgrade --dry-run --debug

Cela permet de vérifier le fonctionnement sans installer réellement de paquet.


9. Vérifier les comptes disposant de privilèges

Listez les membres du groupe sudo :

getent group sudo

Vérifiez également les comptes disposant d'un shell :

grep -E '/bin/(bash|sh|zsh)$' /etc/passwd

Un serveur ne devrait conserver que les comptes réellement nécessaires.

Pour verrouiller un compte inutilisé :

usermod -L utilisateur

Pour le déverrouiller :

usermod -U utilisateur

10. Vérification finale

Contrôlez l'état du pare-feu :

ufw status verbose

Contrôlez SSH :

sshd -t
systemctl status ssh

Contrôlez Fail2ban :

fail2ban-client status sshd

Contrôlez les mises à jour disponibles :

apt update
apt list --upgradable

Contrôlez les services en écoute :

ss -lntup

Contrôlez les services en erreur :

systemctl --failed

Si aucun problème n'est détecté, redémarrez le serveur :

reboot

Après le redémarrage, reconnectez-vous et vérifiez une dernière fois :

systemctl --failed
ufw status
fail2ban-client status sshd

Résultat

Le serveur dispose maintenant d'une première base de durcissement comprenant :

  • un compte administrateur distinct de root ;
  • une authentification SSH par clé ;
  • la désactivation de la connexion SSH de root ;
  • la désactivation de l'authentification SSH par mot de passe ;
  • un pare-feu limitant les services exposés ;
  • une protection contre les tentatives répétées avec Fail2ban ;
  • les mises à jour de sécurité automatiques.

Cette configuration constitue une base de sécurité. Elle doit ensuite être adaptée au rôle du serveur et aux services qu'il héberge.