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
rooten 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.