Spamd
Introduction
Pour bloquer le spam il peut y avoir plusieurs approches. Soit un filtrage sur le contenu, ça implique analyser tout le corps du texte avec un taux d'erreur non négligeable et avec des logiciels plus ou moins lourds. Une autre manière de procéder c'est analyser la méthode utilisée par les spammeurs pour vous vendre des produits à la vertu incertaine.
Les IP qui envoient du spam sont rarement celles des grands opérateurs de mail (tels que gmail, hotmail etc). Tout simplement parce que ces opérateurs ont pris des précautions pour détecter ce genre d'abus et les empêcher. En fait les IP qui envoient du spam sont plutôt des IP de particuliers comme vous et moi, à notre insu bien entendu parce qu'on a téléchargé le dernier AdobeFXDFMicrosoftFESofficeXFSpowerpackfull.iso avec bittorrent, et manque de bol (ou défaut de sécurisation pour le gouvernement) il y a un virus dedans, vous voilà (vous et surtout votre IP) à la merci d'un quelconque gestionnaire de botnet spammeur.
Une des solutions (ou problème comme vous voulez) pour calmer la gangrène a été de faire bloquer le port 25 (SMTP) sortant par les FAI avec l'atteinte évidente à la neutralité du réseau qui nous est chère.
Heureusement, nos amis d'OpenBSD ont réagis à ce problème sans remettre en cause cette neutralité du réseau, et sans discrimination à priori des IP. Le résultat c'est Spamd
Fonctionnement
NOTE : Les exemple et les fichiers de configuration sont pour OpenBSD, lisez les pages de manuel de votre distribution pour adapter.
Spamd fonctionne de pair avec OpenBSD packet filter (disponible de base dans FreeBSD et NetBSD). Pour comprendre comment il marche il faut aller plus loin dans la manière dont procèdent les spammeurs.
- Ils n'utilisent en général pas de 'vrai' client SMTP pour envoyer leurs mails, mais plutôt des scripts assez mal codés qui se contrefichent de savoir comment se passe la transaction avec votre serveur SMTP. La raison est simple, ça prendrait beaucoup trop de place et ce serait plus visible s'il mettent un Postfix/Sendmail/… sur les machines zombies.
Très schématiquement ils ne vont jamais vérifier si tout s'est bien passé et en cas d'erreur ils n'insistent pas (vu qu'il ne savent pas comment ça c'est passé).
Spamd marche avec une table pf (qu'il faut créer) <spamd-white>, dans laquelle il met les IP qui ont réussi à attendrir Spamd (nous verrons ce que ça veut dire bientôt). Cette table est entièrement gérée par spamd, n'y touchez pas trop.
Les rêgles pf que l'on va appliquer sont simple.
- Si l'IP n'est pas dans <spamd-white> on redirige le trafic vers le serveur SMTP de spamd (qui n'est pas un vrai serveur SMTP mais qui en à l'air).
- Si l'IP est dans <spamd-white> on redirige vers notre vrai serveur SMTP (Postfix/Sendmail/Exim/OpenSMTPD …)
Ce qui nous donne :
table <spamd-white> persist rdr pass on $ext_if proto tcp from ! <spamd-white> to port smtp -> lo0 port spamd rdr pass on $ext_if proto tcp from <spamd-white> to port smtp -> $real_mx
Maintenant éditez /etc/rc.conf.local
spamd_flags="-h mx.example.com -l127.0.0.1" spamd_black=NO spamlogd_flags=""
Et redémarez la machine ou alors :
pfctl -f /etc/pf.conf /usr/libexec/spamd -h mx.example.com -l127.0.0.1 /usr/libexec/spamlogd
Maintenant voyons un peu ce qu'il se passe quand on se connecte en telnet sur le port 25, remarquez qu'il écrit 1 caractères par secondes, pour rendre la communication SMTP moins commune, seuls les vrai serveur SMTP qui implémentent correctement la RFC savent dialoguer avec Spamd.
telnet mx.example.com 25 Connected to mx.example.com. Escape character is '^]'. 220 mx.example.com ESMTP spamd IP-based SPAM blocker; Fri Oct 30 22:20:40 2009 HELO example.org 250 Hello, spam sender. Pleased to be wasting your time. MAIL FROM:<spam@hotmail.fr> 250 You are about to try to deliver spam. Your time will be spent, for nothing. RCPT TO:<you@example.com> 250 This is hurting you more than it is hurting me. DATA 451 Temporary failure, please try again later. Connection closed by foreign host.
Là spamd fait croire à une erreur temporaire du serveur. En fait il n'en est rien, spamd va rajouter une entrée dans sa base de donnée :
GREY|89.160.84.23|example.org|<spam@hotmail.fr>|<you@example.com>|1256937965|1256952365|1256952365|1|0
GREY indique que l'IP n'est pas encore dans la liste blanche, et les long numéros sont diverses date qu'il est possible de visualiser avec date -r. Pour plus d'information lisez la page de man de spamdb.
Ici nous avons essayé d'envoyer un mail une seule fois, un vrai spammeur se serait arrêté là. Un vrai client SMTP continue d'essayer d'envoyer à intervalles réguliers. Ainsi au bout d'un certain nombre d'essais cette IP peut passer dans la table <spamd-white> et parler au vrai serveur SMTP. Il reste dans la liste blanche pendant une durée configurable (36 jours par defaut).
Même s'il semble facile de contourner ce système, c'est peu rentable parce que ça prends du temps et des ressources au spammeur. Et ce n'est pas rentable pour lui.
Petit à petit votre table va se remplir avec les serveurs d'envoi de vos correspondants et vous bloquerez 99% du spam sans soucis.
Aller plus loin avec des Pots de miels et autre joyeusetés
Par défaut, Spamd ne fait pas de restrictions sur les domaines d'envoi, ce qui veut dire que pour les spammeurs il se présente comme un potentiel relais ouvert (même si en réalité il n'en n'est rien). Et ça attire les spammeurs les relais ouvert donc il est probable que le spammeur revienne et arrive à rentrer dans la liste blanche.
Pour éviter ça il faut éditer /etc/mail/spamd.alloweddomains pour y mettre des restrictions lors du RCPT.
@example.com john@example.org example.net
Ici il acceptera *@example.com, john@example.org, et *@*.example.net.
Vous pouvez aussi créer des pots de miel pour blacklister rapidement les spammeurs, par exemple dans vos pages html mettez des choses du genre :
<!-- <a href="mailto:false@example.com">false@example.com</a> <a href="mailto:kill@example.com">kill@example.com</a> -->
Et déclarez dans la base de donnée ces deux adresses comme des pots de miel.
spamdb -Ta false@example.com spamdb -Ta kill@example.com
Ici si quelqu'un envoie un mail à une de ces deux adresses, il va automatiquement atterrir dans une table interne à spamd (spamd-greytrap). Une fois dans cette table, le spammeur (quoi qu'il fasse) ne pourra jamais arriver dans <spamd-white>.
Petit mémento pour spamdb
- spamdb -Ta false@example.com déclare l'adresse comme pot de miel
- spamdb -Td false@example.com supprime l'adresse pot de miel
- spamdb -a 85.26.25.41 ajoute l'IP dans la liste blanche
- spamdb -d 85.26.25.41 supprime l'IP de la liste blanche
- spamdb -ta 85.26.25.41 ajoute l'IP dans la liste noire
- spamdb -td 85.26.25.41 supprime l'IP de la liste noire