Sur un serveur il est souvent nécessaire de laisser certains ports ouverts pour permettre un accès Web, FTP, SSH ou autres depuis l’extérieur.
Malgré l’utilisation d’IPtables et de Fail2Ban pour se protéger des attaques, il est possible de prendre les devants et de bloquer une liste d’IP connues pour être à l’origine de nombreuses attaques.
Voici d’autres articles de mon blog qui traitent du même sujet :
www.blocklist.de est un service gratuit et bénévole qui fournit des listes d’adresses IP, remontées par des utilisateurs, qui ont été à l’origine d’attaques.
Ces listes sont divisées en catégories en fonction du port attaqué ou du type d’attaque menée.
Exemples :
Les listes sont disponibles à cette adresse : https://www.blocklist.de/lists/
La liste ssh.txt
est sans doute la plus intéressante car elle n’est pas trop longue (≈5500 IP) et protège le port 22 qui est très exposé.
Si vous avez suivi ce tuto (Raspberry Pi : Configurer IPtables), on va ajouter une « chain
» juste après avoir réinitialisé le firewall et avant d’ouvrir les ports.
En effet, les règles DROP
doivent venir avant les ACCEPT
.
Si on ouvre par exemple le port 80 avec ACCEPT
, on ne pourra plus bloquer une IP avec DROP
sur ce port.
On crée donc une chain
en début de firewall dans laquelle en placera les IP à bloquer avec DROP
.
L’ordre sera alors maintenu vu que les DROP
seront dans la chain
qui est en tête du firewall, avant les ACCEPT
.
On édite le fichier : /etc/init.d/firewall
$ sudo nano /etc/init.d/firewall
Après les lignes :
#Suppression des règles précédentes iptables -F iptables -X
On place ces lignes :
# Crée la Chain BlockList.de iptables -N BlockList.de # On "incorpore" BlockList.de en tête de INPUT iptables -A INPUT -j BlockList.de
À la dernière ligne du firewall, on ajoute l’appel du script que l’on va écrire plus loin :
# Exécution du script de BlockList.de /home/pi/scripts/BlockList/BlockList.de.bash
On va créer / éditer le fichier /home/pi/scripts/BlockList/BlockList.de.bash
:
$ sudo nano /home/pi/scripts/BlockList/BlockList.de.bash
#!/bin/bash ############################################## # Download du fichier IP de BlockList.de : # ############################################## # Vérifie que l'on est en Root if [[ $EUID -ne 0 ]]; then echo "Ce script doit être exécuté avec les privilèges administrateur" exit 1 fi BLOCKLIST_FILE_URL="https://lists.blocklist.de/lists/ssh.txt" BLOCKLIST_HASH_URL="https://lists.blocklist.de/lists/ssh.txt.md5" BLOCKLIST_FILE_TMP="/home/pi/scripts/BlockList/BlockList.de-ssh.txt.tmp" BLOCKLIST_HASH_TMP="/home/pi/scripts/BlockList/BlockList.de-ssh.txt.md5.tmp" BLOCKLIST_FILE="/home/pi/scripts/BlockList/BlockList.de-ssh.txt" BLOCKLIST_HASH="/home/pi/scripts/BlockList/BlockList.de-ssh.txt.md5" # On télécharge la liste de toutes les IP bannies pour SSH (ssh.txt) par BlockList.de wget --quiet $BLOCKLIST_FILE_URL -O $BLOCKLIST_FILE_TMP wget --quiet $BLOCKLIST_HASH_URL -O $BLOCKLIST_HASH_TMP # On vérifie que le fichier TMP existe et a donc bien été téléchargé if [ -f $BLOCKLIST_FILE_TMP ] then # On vérifie le hash MD5 if ! echo "$(cat $BLOCKLIST_HASH_TMP) $BLOCKLIST_FILE_TMP" | md5sum --status --check then # Si le hash ne correspond pas, on supprime les fichiers TMP et on sort avec une erreur rm $BLOCKLIST_FILE_TMP rm $BLOCKLIST_HASH_TMP exit 1 else # Si le hash est OK, on écrase les anciens fichiers par les nouveaux mv $BLOCKLIST_FILE_TMP $BLOCKLIST_FILE mv $BLOCKLIST_HASH_TMP $BLOCKLIST_HASH fi fi # Flush de la chain BlockList.de pour éviter les doublons au moment de la mise-à-jour. iptables -F BlockList.de > /dev/null while read ip do iptables -A BlockList.de -s $ip -j DROP > /dev/null done < /home/pi/scripts/BlockList/BlockList.de-ssh.txt
On enregistre le fichier et on le rend exécutable :
$ sudo chmod +x /home/pi/scripts/BlockList/BlockList.de.bash
Ce petit bout de script va télécharger ssh.txt
sur le site Blocklist.de et le rapatrier sous le nom BlockList.de-ssh.txt.tmp
dans le dossier /home/pi/scripts/BlockList/
.
On vérifie alors si le téléchargement s’est bien passé et si le hash correspond (donc, si le fichier n’a pas été altéré).
Si c’est le cas, on écrase les anciens fichiers avec les nouveaux.
Ensuite, pour chaque occurrence du fichier (pour chaque ligne), on bloque l’IP.
Cette action peut durer plusieurs minutes car les IP du fichier sont bannies une à une.
On va mettre la liste des IP à jour avec cron
:
$ sudo crontab -e
# Charge le fichier d'IP BlockList.de-ssh.txt tous les jours à 14h 00 14 * * * sudo /home/pi/scripts/BlockList/BlockList.de.bash > /dev/null 2>&1
On pourra vérifier le contenu d’IPtables avec cette commande qui va lister les IP bloquées au format numérique.
$ sudo iptables -L -n
Par défaut IPtables essaye d’afficher le nom de l’hôte ou le nom du réseau à la place de l’adresse IP, ce qui prend beaucoup de temps. D’où l’utilité du paramètre -n
.