Mes passions, le boulots, mes coups de gueule...




IPtables : Bannir une liste d’IP extraite de BlockList.de

Categorie : Geek, Informatique, Linux, Raspberry Pi · par 2 Mai 2018

Introduction

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 :

BlockList.de

Présentation

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 :

  • Port 22 (SSH)
  • Port 21 (FTP)
  • Port 80, 443 (Web)
  • Courrier IMAP
  • Courrier POP3
  • Brute Force Login
  • Et la liste ALL qui regroupes tous les IP et types d’attaques

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

Firewall

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

Script

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.

cron

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

Mais encore

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.

Laisser un commentaire