Sécuriser les tentatives de connexion SSH avec Fail2Ban
Vérifier les tentatives de connexion SSH
sudo journalctl -u ssh --no-pager | grep "Failed password"
Bloquer les IP malveillantes
Bloquer une IP malveillante avec UFW (Uncomplicated Firewall) ou iptables.
Avec UFW
sudo ufw deny from [IP]
ou avec iptables
sudo iptables -A INPUT -s [IP] -j DROP
Vérifier si l'ip est bloquée dans Iptables
sudo iptables -L INPUT -v -n | grep [IP]
Débloquer une IP de Iptables
sudo iptables -D INPUT -s [IP] -j DROP
Installer Fail2Ban
sudo apt update && sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
Vérifier le statut de Fail2Ban
sudo systemctl status fail2ban
Désactiver si je souhaite la connexion root en SSH
sudo nano /etc/ssh/sshd_config
- Modifier la ligne suivante (attention gros risque de sécurité de la connexion root en SSH) :
PermitRootLogin no -> PermitRootLogin yes
PasswordAuthentication no -> PasswordAuthentication yes
- Redémarrer le service SSH
sudo systemctl restart ssh
le plus sécurisé reste l'usage d'une clé SSH
PubkeyAuthentication yes
Eventuellement changer le port SSH
sudo nano /etc/ssh/sshd_config
- Remplacer le port 22 par un autre port
Port 22XX
- Ouvrir le port dans le pare-feu
sudo ufw allow 22XX/tcp
- Redémarrer le service SSH
sudo systemctl restart ssh
Voir le liste des IP bloquées
sudo fail2ban-client status sshd
Débloquer une IP
sudo fail2ban-client set sshd unbanip [IP]
Voir les logs de Fail2Ban
sudo journalctl -u fail2ban
Voir le nombre de tenatives de connexions ssh
grep "authentication failure" /var/log/auth.log | wc -l
Voir le poids du fichier de log
ls -lh /var/log/auth.log
Créer des jails personnalisés pour surcharger la configuration de Fail2Ban
sudo nano /etc/fail2ban/jail.local
- Ajouter les lignes suivantes. Si le fichier n'existe pas, le créer
[sshd]
enabled = true
bantime = -1
findtime = 10m
maxretry = 3
Cette configuration dit que 3 tentatives ratées en 10 minutes déclenchent un ban.
Fail2Ban vérifie en continu (toutes les secondes par défaut de toutes les jails crées et activés) les logs SSH pour voir si une IP a dépassé le nombre de tentatives autorisées. Si c’est le cas, l’IP est bannie pour 1 jour ou définitivement si -1.
La jail [sshd] est souvent déjà présente dans /etc/fail2ban/jail.conf
(fichier global) mais il vaut mieux surcharger via jail.local pour préserver la conf par défaut et ajouter ses propres règles.
- Redémarrer Fail2Ban
sudo systemctl restart fail2ban
Modifier la configuration de fail2ban
sudo nano /etc/fail2ban/jail.local
[sshd]
enabled = true
bantime = 1d
findtime = 10m
maxretry = 3
ignoreip = ajouter ici les IP à ignorer séparées par un espace
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
Eviter de se bloquer soi même
- Trouver son IP local
ip a | grep "inet"
- Ajouter son IP dans le fichier de configuration de Fail2Ban (
/etc/fail2ban/jail.local
)
[DEFAULT]
ignoreip = 192.168.0.254 # Ajouter la liste d'IP à ignorer, séparées par un espace
Bannir rapidement une IP avec fail2ban
sudo fail2ban-client set sshd banip 92.255.85.107
Bannir rapidement une Ip avec IpTables
sudo iptables -A INPUT -s 92.255.85.107 -j DROP
Ajoute une règle à la fin de la chaîne INPUT pour bloquer toute connexion entrante provenant de l’IP 92.255.85.107.
Rendre cette configuration permanente
IL fau que le paquet iptables-persistent
soit installé pour rendre les règles iptables persistantes après un redémarrage.
sudo apt install iptables-persistent
Par défaut, toute règle ajoutée avec iptables est volatile : Elle disparaît au reboot donc on doit la sauvegarder dans un fichier de règles.
sudo iptables-save | sudo tee /etc/iptables/rules.v4
A refaire après chaque modification des règles iptables.
Comportement de jail.local vs jail.conf
- Ce qui est défini dans
jail.local
prend le dessus sur la même section (jail) dansjail.conf
. - Si une jail existe seulement dans
jail.local
, elle s’ajoute à la configuration globale. - Les options
[DEFAULT]
définies dansjail.local
surchargent celles de[DEFAULT]
dansjail.conf
. - Les paramètres non spécifiés dans
jail.local
héritent de la configuration dejail.conf
.
Exemple : Si [sshd]
est présent dans les deux fichiers, c’est la configuration de /etc/fail2ban/jail.local
qui s’applique.
Tout paramètre absent dans jail.local
utilisera la valeur de jail.conf
.
Conclusion
Fail2Ban est un outil puissant pour protéger votre serveur contre les attaques de force brute, notamment les tentatives de connexion SSH. En configurant correctement les jails et en surveillant les logs, vous pouvez réduire considérablement le risque d'intrusion.
Fail2Ban gère le ban en live, iptables-persistent gère la sauvegarde/restauration automatique au reboot.