Rendez-vous sur Arrakis

C'est lorsque nous croyons savoir quelque chose qu'il faut justement réfléchir un peu plus profondément. F. Herbert

spamd

spamd fait semblant d'être un serveur mail afin de rejeter les spams. Il a été écrit dans l'optique d'être très efficace et ne pas ralentir la machine. Bien sûr, il transmet les mails légitimes au serveur smtp ensuite.

Ce qui est rigolo en plus, c'est qu'il va faire en sorte de ralentir les spammeurs en communiquant tout doucement avec eux et leur faire consommer inutilement leur ressources ☺ .

Enfin, avantage non négligeable, il est présent par défaut dans OpenBSD.

Comment ça marche?

Afin de reconnaître les spam, spamd va mettre en attente ceux qui contactent le serveur. Ils sont mis sur liste grise.

Normalement, un expéditeur légitime réessaie automatiquement de délivrer le message. Lors du 2e essai, ce serveur est mis sur liste blanche.

Les spammeurs ne vont pas réessayer de délivrer le message. Dans ce cas, ils sont mis après un délai assez long sur liste noire. Par la suite, votre serveur n'écoutera même plus les requêtes provenant de ces spammeurs.

Afin d'enregistrer les vilains expéditeurs, il faudra exécuter spamdb régulièrement.

Mise en place

On commence par activer spamd au démarrage, en indiquant les options dont il aura besoin, puis on le lance :

rcctl enable spamd
rcctl set spamd flags "-v -G 15:4:4242"
rcctl start spamd

Le premier chiffre correspond au nombre de minutes qu'un expéditeur doit attendre avant de réessayer de nous renvoyer son mail (puisque les spammeurs envoie des salves de mails très rapidement). Le second correspond au temps qu'une entrée reste dans la liste grise, et le dernier le temps pendant lequel une entrée restera sur la liste blanche (en heures).

On va maintenant éditer la configuration de pf, le parefeu et filtre de paquets (packet filter). Il va envoyer à spamd tous le flux destiné au serveur smtp, qui relaiera normalement ensuite si le mail est légitime.

Voici ce qu'il faut donc ajouter dans /etc/pf.conf :

table <nospamd> persist file "/etc/mail/nospamd"
pass in on egress proto tcp from any to any port smtp \
    divert-to 127.0.0.1 port 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

Dans l'ordre des lignes :

Voilà pour le parefeu. N'oubliez pas de le recharger :

# pfctl -d && pfctl -ef /etc/pf.conf

Il est nécessaire de régulièrement charger la liste noire des spammeurs dans le parefeu afin que spamd fonctionne bien. Nous allons nous servir d'une tâche cron pour ça. Tapez # crontab -e, puis ajoutez la ligne suivante :

*/10      *       *       *       *       /usr/libexec/spamd-setup

Pour l'édition, référez-vous aux rappels sur l'utilisation de vi.

Nous lançons ici spamd-setup toutes les 10 minutes. Ce temps doit être inférieur au temps que doit attendre un expéditeur pour tenter de renvoyer son message définit dans l'appel de spamd. Nous avions mis 15 minutes.

Piéger les spammeurs

Vous pouvez piéger les spammeurs en laissant traîner sur le web une fausse adresse mail. Si spamd voit un message arriver pour cette adresse, alors il sait déjà que c'est un spam : il peut donc le mettre sur liste noire. Vous voilà protégés pour l'avenir.

Afin de glisser cette "adresse-piège" sur le web sans que ça soit visible par les humain, vous pouvez l'insérer ainsi dans une page web de votre site :

<a href="mailto:blackhole@yeuxdelibad.net"></a>

Pour indiquer à spamdb cette adresse piège, il faut ajouter les options suivantes à spamdb (attention au "b" final, ce n'est pas spamd). :

# spamdb -T -a 'blackhole@yeuxdelibad.net'

Bien entendu, cette adresse piège ne doit pas être créée et ne risque pas de servir à quiconque.

Voir l'activité de spamd

Pour voir l'activité de spamd, lancez la commande spamdb pour voir apparaître des choses comme ça :

WHITE|62.4.1.33|||1462699174|1462699174|1465809574|1|0
GREY|46.105.39.61|2.mo178.mail-out.ovh.net|<contact@arpinux.org>|<thuban@yeuxdelibad.net>|1462696130|1462710530|1462710530|1|0

On peut lire dans l'ordre :

Il n'y a pas à dire, les "temps" sont illisibles pour les humains. Utiliser la commande date pour avoir un format lisible :

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