Sécuriser un VPS Ubuntu — SSH, pare-feu ufw et Fail2ban
Introduction
Lorsqu'on déploie un VPS exposé sur internet, la surface d'attaque est immédiate. Les bots scannent en permanence les ports standards à la recherche de cibles faciles. Cet article documente la configuration mise en place sur mon VPS Ubuntu pour durcir l'accès SSH, filtrer le trafic entrant avec ufw, et bloquer automatiquement les tentatives de brute-force avec Fail2ban.
1. Hardening SSH
Objectif
Remplacer l'authentification par mot de passe par une authentification par clé ED25519, désactiver le login root direct, et déplacer SSH sur un port non standard.
Génération de la clé ED25519 (côté client)
ssh-keygen -t ed25519 -C "label" -f ~/.ssh/id_ed25519_vps
ssh-copy-id -p 22 -i ~/.ssh/id_ed25519_vps.pub <USER>@<IP_VPS>
Paramètres clés dans /etc/ssh/sshd_config
Port <PORT_SSH> # Port non standard, évite les scans automatiques
PermitRootLogin no # Jamais de connexion directe en root
PasswordAuthentication no # Uniquement par clé
PubkeyAuthentication yes
MaxAuthTries 3
LoginGraceTime 30
systemctl restart sshd
⚠️ Toujours garder une session ouverte pendant les modifications pour éviter de se bloquer soi-même.
2. Pare-feu ufw
apt install ufw -y
ufw default deny incoming
ufw default allow outgoing
ufw allow <PORT_SSH>/tcp # SSH
ufw allow 80/tcp # HTTP
ufw allow 443/tcp # HTTPS
ufw enable
Vérification
ufw status verbose
3. Fail2ban
/etc/fail2ban/jail.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
port = <PORT_SSH>
logpath = /var/log/auth.log
maxretry = 3
systemctl restart fail2ban
fail2ban-client status sshd
Référence rapide
| Action | Commande |
|---|---|
| Statut ufw | ufw status verbose |
| IPs bannies | fail2ban-client status sshd |
| Débannir une IP | fail2ban-client set sshd unbanip <IP> |
| Connexion SSH | ssh -p <PORT_SSH> -i ~/.ssh/id_ed25519_vps <USER>@<DOMAINE> |
| Logs auth | tail -f /var/log/auth.log |
Conclusion
Ce triptyque SSH + ufw + Fail2ban constitue le socle minimal de tout VPS exposé. Il réduit drastiquement la surface d'attaque sans complexité excessive. La prochaine étape logique est l'ajout de CrowdSec pour une protection communautaire (voir article dédié).