Rendez-vous sur Arrakiss
Le 08/10/2019 à 15:14 dans /Logiciel-libre/OpenBSD/

Lutte active contre le spam avec spamd et diverses blacklists

Tout le monde connaît ce que j'appelle une lutte passive pour éviter les spams. Après avoir reçu un mail, un programme se charge de scanner ce mail pour vérifier s'il est légitime ou non et le place éventuellement dans un dossier SPAM. Seulement voilà, le mail est bien arrivé jusqu'à votre serveur, lui a fait perdre son temps et ses ressources.

Bien que la méthode précédente reste indispensable dans certains cas, je lui préfère une lutte active contre le spam. C'est ce que fait spamd, intégré de base dans OpenBSD. Ce dernier est capable de piéger des spammeurs, de discuter trèèèèès lentement avec eux, et leur faire perdre du temps et des ressources. Et BIM ! Tel est pris qui croyais prendre.

Dans cette page, j'essaierai de détailler comment j'utilise spamd pour, à mon niveau, me défendre contre les nuisances pourrielleuses ^^.

Fonctionnement de spamd

spamd fait semblant d'être un serveur mail. S'il considère un message légitime, il le transfère au serveur smtp ensuite.

GREYLISTING

J'utilise spamd en mode GREYLISTING. Lorsqu'un serveur tente de délivrer un message, il reçoit une réponse 451, qui signifie “Serveur indisponible pour l'instant, réessayer plus tard”.

Tous les serveurs mail dignes de ce nom ont l'habitude de ce message, et renvoie le même mail après un certain délai. À ce moment, spamd laisse passer le mail.

Un spammeur, la plupart du temps, ne va pas renvoyer son message : le spam n'est donc jamais délivré, et c'est tant mieux :).

SPAMTRAP

Avec le mode ci-dessus, il est intéressant de diffuser sur un site web, un pastebin public, une fausse addresse mail pour piéger les spammeurs. Lorsqu'un mail est envoyé à l'une de ces addresses, alors l'expéditeur est piégé (TRAPPED), spamd lui parlera très lentement. C'est autant de temps passé sans autre spams envoyés, ni à vous, ni quelqu'un d'autre. Bien entendu, jamais le spam n'est délivré.

Mise en place de spamd

Voici les commandes qui permettent d'activer spamd :

rcctl enable spamd
rcctl start spamd

Ensuite, on configure le parefeu pour que les communications arrivant sur le port smtp passent par spamd, qui se chargera de faire suivre les mails au serveur smtp. Voici le fichier /etc/pf.conf commenté :

# Fichier contenant les IPs 
   # qui n'ont pas besoin d'être filtrées par spamd.
# À remplir à la main (ou via un script)
table <nospamd> persist file "/etc/mail/nospamd"
# Table des IPs sur liste blanche
table <spamd-white> persist
# Liste blanche récupérée avec bgpd, voir plus loin
table <bgp-spamd-bypass> persist

# On redirige le flux smtp vers spamd
pass in on egress proto tcp to any port smtp modulate state \
        divert-to 127.0.0.1 port spamd
# Les listes blanches ne passent pas par spamd
pass in on egress proto tcp from <nospamd> to any port smtp
pass in log on egress proto tcp from <spamd-white> to any port smtp
pass in quick on egress proto tcp from <bgp-spamd-bypass> to port smtp

On configure maintenant spamd dans le fichier /etc/mail/spamd.conf pour indiquer une liste noire fournie par OpenBSD (nixspam). C'est normalement déjà configuré par défaut :

all:\
:nixspam:

   # Nixspam recent sources list.
   # Mirrored from http://www.heise.de/ix/nixspam
nixspam:\
:black:\
:msg="Your address %A is in the nixspam list\n\
See http://www.heise.de/ix/nixspam/dnsbl_en/ for details":\
:method=https:\
:file=www.openbsd.org/spamd/nixspam.gz

Enfin, on configure une tâche périodique qui appelle spamd-setup. Cet outil se charge de mettre à jour les listes noires, et si besoin, retélécharger celle disponibles en ligne et configurée dans la configuration de spamd ci-dessus. En tant que root, on entre crontab -e puis on décommente la ligne suivante :

0      *       *       *       *       sleep $((RANDOM \% 2048)) && /usr/libexec/spamd-setup

Descendez vers le “#”, puis appuyez sur “x” pour supprimer. Enfin, appuyez sur “Esc” puis entrez “:wq” pour enregistrer et quitter.

Astuces et exploitation de spamd

Maintenant que spamd est en marche, on va l'enrichir de pièges pour les spammeurs, d'astuces pour être plus efficace, de listes blanches pour ne pas piéger les expéditeurs légitimes.

Commandes utiles

La commande spamdb vous donnera un aperçu des IP sur liste blanche, noire ou grise. :

WHITE|62.4.5.85|||1551207984|1551209594|1554572461|3|2
TRAPPED|18.207.253.60|1551550894
WHITE|185.90.23.17|||1551485070|1551487619|1554598031|3|0
GREY|182.70.43.24|abts-mum-dynamic-024.43.70.182.airtelbroadband.in|<Estella32@thunderguy.co.uk>|<toto@chezmoi.tld>|1473409924|1473424324|1473424324|1|0
GREY|14.183.132.63|static.vnpt.vn|<Abby5@toddelliott.com>|<kiki@chezmoi.tld>|1473410586|1473424986|1473424986|1|0
SPAMTRAP|gj2vnbg78d215@ybad.name

On peut lire dans l'ordre, séparés par des “|” si l'IP est sur liste blanche (WHITE), grise (GREY) ou actuellement piégée (TRAPPED). Les pièges que vous avez configurés sont aussi disponibles (SPAMTRAP).

Pour les listes grises :

GREY | IP |
Identifiant helo | 
expéditeur |
destinataire |
heure où l'IP a été vue pour la première fois |
Le moment où l'IP sera mise sur liste blanche | 
Le moment où l'IP ne sera plus dans la base de données | 
Le nombre de fois où l'IP a été bloquée | 
Le nombre de fois où l'IP a été autorisée

Pour les listes blanches :

WHITE | IP |||
Heure où l'IP a été vue pour la première fois |
Le moment où l'IP a été  mise sur liste blanche | 
Le moment où l'IP ne sera plus dans la base de données | 
Le nombre de fois où l'IP a été bloquée | 
Le nombre de fois où l'IP a été autorisée

Les heures étant illisibles, utilisez la commande “date” pour mieux les comprendre :

date -r 1462699174
Sun May  8 11:19:34 CEST 2016

Pour ajouter une IP sur liste blanche manuellement :

spamdb -a "XX.XX.XX.XX"

Créer un piège

Pour créer une fausse adresse mail, lancez la commande suivante :

spamdb -T -a piege@votredomaine.net

Tous les serveur qui envoient un message à cette adresse seront piégés pendant plusieurs minutes. Diffusez cette adresse mail en commentaire sur votre site web. Ainsi, les robots seront les seuls à la lire :

<a rel="nofollow" style="display:none;"
    href="mailto:blackhole@ybad.name">This is a fake mail address</a>

Avec cette méthode, j'ai écrit un script qui : M XX.XX.XX.XX * Vérifie les tentatives de connexion SSH vers le serveur qui échouent car l'utilisateur n'existe pas et crée des adresses pièges correspondantes. * Vérifie si le serveur mail a échoué à délivrer des messages car les adresses mails n'existaient pas et en fait des adresses pièges. * Créer une adresse piège aléatoire. * Publie ces adresses pièges sur les pastebins publics pour que les robots tombent dessus. adresses pièges avec ce nom d'utilisateur.

Si cela vous intéresse, c'est par ici : https://ybad.name/Logiciel-libre/OpenBSD/Spammers_une_liste_pour_vous.html

Utiliser la liste noire de bsdly.net

Peter N. M. Hansteen publie une liste d'IP piégées avec ses propres SPAMTRAPS.

Pour s'en servir, vous pouvez les récupérer régulièrement en ajoutant à votre crontab, toutes les heures à 20 minutes passées :

20 * * * *   /usr/local/sbin/bsdly-spamd

Le script bsdly-spamd ne fait que récupérer la liste de Peter :

#!/bin/sh
# update bsdly.net traplist into DST
URL="https://www.bsdly.net/~peter/bsdly.net.traplist"
# alternative URL
#URL="https://home.nuug.no/~peter/bsdly.net.traplist"
DST=/var/db/bsdly.traplist

ftp -o "${DST}" "${URL}"

Ensuite, indiquez dans /etc/mail/spamd.conf d'ajouter le contenu du fichier /var/db/bsdly.traplist à la liste noire :

all:\
        :nixspam:bgp-spamd:bsdlyblack:

nixspam:\
        :black:\
        :msg="Your address %A is in the nixspam list\n\
        See http://www.heise.de/ix/nixspam/dnsbl_en/ for details":\
        :method=https:\
        :file=www.openbsd.org/spamd/nixspam.gz

bsdlyblack:\
        :black:\
        :msg="SPAM.  Your address %A has sent spam within the last 24 hours.  See http://www.bsdly.net/~peter/traplist.shtml for details.":\
        :method=file:\
        :file=/var/db/bsdly.traplist

Utiliser les listes noire et blanches de uceprotect

Le site uceprotect devrait vous plaire si vous n'aimez par les spams. Ils proposent des listes d'IP mises à jour toutes les heures. Il est possible de récupérer les listes en entier comme on l'a fait avec bsdly.net.traplist, mais cela consommera moins de bande passante de ne récupérer que les changements avec rsync.

Dans le crontab, on appelle le script qui mettera à jour toutes les heures (ne mettez pas à jour les listes plus souvent, sinon vous serez bloqués par leur serveur) :

10 * * * *     /usr/local/sbin/uceprotect-spamd 

Le contenu du script uceprotect-spamd est le suivant :

#!/bin/sh

RSYNC="/usr/local/bin/rsync -azq"
URLS="rsync-mirrors.uceprotect.net::RBLDNSD-ALL/dnsbl-1.uceprotect.net
rsync-mirrors.uceprotect.net::RBLDNSD-ALL/dnsbl-2.uceprotect.net
rsync-mirrors.uceprotect.net::RBLDNSD-ALL/ips.backscatterer.org
rsync-mirrors.uceprotect.net::RBLDNSD-ALL/ips.whitelisted.org"
OUT="/var/db/RBLDNSD-ALL/"
mkdir -p "${OUT}"

for URL in ${URLS}; do
        ${RSYNC} "${URL}" "${OUT}"
done

On charge ces listes dans /etc/mail/spamd.conf. Il y a des listes noires et des listes blanches :

all:\
        :nixspam:bgp-spamd:bsdlyblack:\
        rbldnsd-1:rbldnsd-2:rbldnsd-backscatterer:rbldnsd-white:

...

rbldnsd-1:\
        :black:\
        :msg="Your address %A is listed on UCEPROTECT-Level 1\n \
        see http://www.uceprotect.net/en":\
        :method=file:\
        :file=/var/db/RBLDNSD-ALL/dnsbl-1.uceprotect.net

rbldnsd-2:\
        :black:\
        :msg="Your address %A is listed on UCEPROTECT-Level 2\n \
        see http://www.uceprotect.net/en":\
        :method=file:\
        :file=/var/db/RBLDNSD-ALL/dnsbl-2.uceprotect.net

rbldnsd-backscatterer:\
        :black:\
        :msg="Your address %A is listed on www.backscatterer.org":\
        :method=file:\
        :file=/var/db/RBLDNSD-ALL/ips.backscatterer.org

rbldnsd-white:\
        :white:\
        :method=file:\
        :file=/var/db/RBLDNSD-ALL/ips.whitelisted.org

N'hésitez pas, faîtes un don à uceprotect.net, leur travail est impressionnant.

Utiliser les listes noire et blanches via bgp

Le projet bgp-spamd propose de récupérer des listes noires et blanches depuis plusieurs serveurs de confiance via bgp. Cela permet de réduire la surcharge des serveurs lorsqu'on télécharge de grosses listes, et évite la latence des requêtes DNSBL (non détaillé ici).

C'est bien décrit sur le site du projet, je vais donc faire vite. :)

/etc/bgpd.conf

spamdAS="65066"

AS 65001
fib-update no                # Mandatory, to not update the local routing table
nexthop qualify via default  # Make sure the nexthop is valid

group "spamd-bgp" {
        remote-as $spamdAS
        multihop 64

    # us.bgp-spamd.net
        neighbor 64.142.121.62

    # eu.bgp-spamd.net
    neighbor 217.31.80.170

    # IPv6 eu.bgp-spamd.net
    neighbor 2a00:15a8:0:100:0:d91f:50aa:1
}

deny to any
deny from any

allow from group "spamd-bgp"
match from group spamd-bgp community $spamdAS:42  set pftable "bgp-spamd-bypass"

/etc/pf.conf : Voir plus haut la table bgp-spamd-bypass.

/etc/mail/spamd.conf

all:\
        :bgp-spamd:

bgp-spamd:\
        :black:\
        :msg="Your address %A has sent mail to a spamtrap\n\
        within the last 24 hours":\
        :method=file:\
        :file=/var/db/spamd.black:

Créez le script /usr/local/sbin/bgp-spamd.black.sh

#!/bin/sh
AS=65066

bgpctl show rib community ${AS}:666 | awk 'NR>6 {print $3}' > /var/db/spamd.black

/usr/libexec/spamd-setup

Ajoutez dans le crontab :

*/15 * * * * /usr/local/sbin/bgp-spamd.black.sh > /dev/null 2>&1

Accepter sans délai les mails de serveur connus

Les “gros” serveurs mail les plus connus utilisent plusieurs IP pour envoyer leurs messages. Vous pouvez toutefois charger sur liste blanche ces dernières si vous voulez éviter le délai de greylisting pour ces serveurs.

Une fois par jour, vous pourriez exécuter le script /usr/local/sbin/generate-nospamd :

#!/bin/sh
# Auteur :      thuban <prx@ybad.name>
# licence :     MIT

# add to spamd some ip to whitelist from domain list
# to /etc/mail/nospamd

# the list of domain whose SPF record must be found is in /etc/mail/nospamd_domains_list.txt

DOMAINS=$(cat /etc/mail/nospamd_domains_list.txt)
WHITELIST=/etc/mail/nospamd


echo "#$(date)" > "$WHITELIST"
for d in $DOMAINS; do
        echo "#$d" >> "$WHITELIST"
        echo "$d" | smtpctl spf walk >> "$WHITELIST"
done

Remplissez le fichier /etc/mail/nospamd_domains_list.txt avec les domaines à mettre sur liste blanche. Par exemple :

outlook.com
gmail.com
hotmail.com
apple.com
twitter.com
amazon.com
yahoo.com
yahoo.fr
google.com
live.fr
mail-out.ovh.net
mxb.ovh.net
gandi.net
laposte.net
protonmail.com
bsd4a.net
orange.fr
wanadoo.fr

Indiquez dans le fichier /etc/daily.local les lignes suivantes pour lancer le script ci-dessus tous les jours et recharger cette liste blanche dans pf :

/usr/local/sbin/generate-nospamd
pfctl -t nospamd -T replace -f /etc/mail/nospamd

Se souvenir des serveurs légitimes

Le démon spamlogd peut s'en charger, tant qu'un serveur légitime vous envoie des mails. Il met aussi sur liste blanches les serveurs auxquels vous envoyez des mails.

rcctl enable spamlogd
rcctl start spamlogd

Attention, pour que cela fonctionne, vous aurez bien précisé le mot clé “log” dans la configuration de pf, comme indiqué plus haut.

Synchronisation des listes entre plusieurs serveurs

Je vous renvoie à la page man. Regardez les options “-Y” et “-y”.

Sources et ressources :