Utiliser la liste DROP de Spamhaus dans PF

Spamhaus, dont le travail quotidien consiste à maintenir des listes noires de spammers potentiels ou avérés, met aussi à disposition des utilisateurs une liste noire assez particulière : la liste DROP, pour Don't Route Or Peer.
Cette liste relativement courte regroupe les blocs d'adresses IP dont Spamhaus est certain qu'ils sont utilisés par des pirates ou des spammers professionnels.
Vous pouvez donc utiliser cette liste pour alimenter votre pare-feu, sans trop vous poser de question. Vous ne raterez aucun email légitime, ni aucun visiteur sur vos sites, si vous bloquez toutes ces adresses dans votre firewall.
La liste change de temps en temps. D'après mon expérience, pas plus d'une fois par jour. On peut donc assumer sans risque qu'une mise à jour quotidienne du firewall est largement suffisante. Mon firewall étant PF (Packet Filter sur FreeBSD et OpenBSD), mon exemple sera directement utilisable avec ce pare-feu. Pour les autres logiciels (ipfw par exemple), il faudra faire un travail d'adaptation.

Pour plus de simplicité, je laisse periodic lancer le script chaque nuit vers 3h15. Je crée donc un fichier /usr/local/etc/periodic/daily/310.spamhaus_dropall exécutable, et en lecture uniquement (sauf pour root).

Je dois aussi créer une table spamhaus_dropall dans la configuration de PF en ajoutant les lignes suivantes à mon /etc/pf.conf :

Dans les définitions de tables :

table <spamhaus_dropall> persist { }

Dans les règles proprement dites :

block in log quick proto tcp from <spamhaus_dropall> to any

Cette table, vide par défaut, va stocker le contenu filtré de la liste DROP, et sera mise à jour toutes les nuits.
Ensuite je force pf à relire la configuration par la commande pfctl -vf pf.conf.

Voici le code du script, à écrire dans /usr/local/etc/periodic/daily/310.spamhaus_dropall :

#!/usr/local/bin/bash
echo  downloading/cleaning blacklist drop.lasso
TMPFILE=`mktemp /tmp/drop.XXXXXX` || exit 1

/usr/local/bin/curl -s http://www.spamhaus.org/drop/drop.lasso | \
    sed 's, ;.*,,' | \
    egrep '^([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}*$' > \
    ${TMPFILE}

echo  flushing the spamhaus_dropall table
egrep -v '^127|^WHITELIST' ${TMPFILE} | \
    pfctl -t spamhaus_dropall -vT replace -f -

La première étape consiste à télécharger la liste. Dans la foulée, les commandes sed et egrep me permettent de nettoyer et filtrer le contenu du fichier envoyé par Spamhaus.
Le fichier original ressemble à ceci :

; Spamhaus DROP List 11/24/08 - (c) 2008 The Spamhaus Project
116.199.128.0/19 ; SBL56563
116.50.8.0/21 ; SBL54501
128.199.0.0/16 ; SBL62478

Le fichier filtré et nettoyé, dont le contenu est écrit dans le fichier temporaire TMPFILE ressemble à cela :

116.199.128.0/19
116.50.8.0/21
128.199.0.0/16

L'étape suivante consiste à injecter les nouveaux blocs d'IP dans la table pour les faire prendre en compte par le firewall. Par mesure de précaution, j'ai choisi de filtrer ici les IP de la classe 127.0.0.0/8 ainsi que toutes les IP dont je ne veux absolument pas qu'elles figurent dans la blacklist. On n'est jamais à l'abri d'un dysfonctionnement de Spamhaus, ou du script, ou d'une malveillance locale sur la machine. Je remplace donc ^WHITELIST par tous les préfixes d'IP que je juge nécessaire (par exemple ^83.225. si mon IP résidentielle commence par "83.225"), et je les sépare par un |.
La commande egrep -v me permet donc d'exclure toutes les lignes que je veux sortir de la liste, et envoie le reste à pfctl pour remplacer le contenu de la table spamhaus_dropall par les nouvelles IP.

Voici un exemple de sortie, telle qu'elle apparaît dans le mail de daily :

downloading/cleaning blacklist drop.lasso
flushing the spamhaus_dropall table
8 addresses added.
1 addresses deleted.
A  192.43.153.0/24
A  192.43.154.0/23
A  192.43.156.0/22
A  192.43.160.0/24
A  192.86.85.0/24
A  78.157.128.0/19
A  91.209.14.0/24
A  94.176.96.0/20
D  94.176.96.0/21

Le script est bien sûr perfectible. Mais c'est une base de travail qui fonctionne.

2 comments

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.