Le graylisting facile.

Cet article (lâchement repompé en partie sur HowtoForge), montre comment on peut implémenter un système de graylisting en moins de 5 min sous FreeBSD, à l'aide de Postgrey (à condition que Postfix soit déjà installé).

Pour ceux qui n'ont pas encore Postfix d'installé, je les renvoie vers Postfix SMTP AUTH (and TLS) HOWTO, c'est le maître Jedi qui m'a tout appris. C'est un tutoriel pour Linux, mais c'est trivial d'adapter à FreeBSD.

Petite explication du graylisting, avant de commencer. Le graylisting, c'est une méthode de filtrage de spams. Mais contrairement aux white et blacklists, qui sont des listes figées et à entretien manuel, la graylist est adaptative. Pour cela, elle utilise une fonction du protocole SMTP qui permet de signaler au serveur de courrier expéditeur qu'on ne peut pas recevoir de courrier pour l'instant. Et comme indiqué dans le protocole, le serveur de courrier reviendra peu après pour réessayer la remise. Notre serveur n'acceptera de courrier de celui-ci que si un certain délai (par défaut 5 minutes) s'est écoulé depuis la première tentative.

Or les spammeurs n'utilisent pas de vrais serveurs de courrier, et ne réessaient pas l'envoi de leurs spams. Du coup, ces derniers n'arrivent jamais dans les boîtes des utilisateurs ! Simple et efficace. 😉

Le problème de ce système est que ça introduit un délai supplémentaire dans la remise du courrier électronique, du temps d'attente avant acceptation du mail. On peu réduire le temps d'attente du graylist, mais cela pourrait réduire l'efficacité du système, si jamais un spammeur bombarde le serveur pendant plusieurs minutes (la probabilité est faible, cependant).

Autre inconvéniant, l'expéditeur du mail peut recevoir un message d'erreur comme quoi le serveur destinataire a refusé le message, alors qu'il a bien été transmis, avec seulement un peu de retard.

Passons à l'installation de Postgray et l'intégration à Postfix :

D'abord, installer Postgray par les ports :

$ portinstall postgray

Si tout se passe bien, Postgray est installé. 🙂 Sinon, il faut observer les messages pendant l'installation et résoudre en conséquence.

Maintenant, il faut le configurer pour qu'il démarre avec le système, on va l'activer dans /etc/rc.conf :

$ echo postgray_enable="YES" >> /etc/rc.conf

Lançons Postgray :

$ /usr/local/etc/rc.d/postgray.sh start

S'il n'y a pas d'erreurs rapportées, c'est bon, ça roule. 🙂 Sinon faut aller regarder dans les logs pour voir ce qui cloche.

Postgray est maintenant installé et lancé, mais il ne sert à rien pour l'instant, Postfix ne l'utilise pas. Configurons-le. Il faut éditer le fichier /usr/local/etc/postfix/main.cf. Dans ce fichier, il y a une section qui ressemble à ça :

smtpd_recipient_restrictions =
        reject_non_fqdn_sender,
        reject_non_fqdn_recipient,
        reject_unknown_sender_domain,
        reject_unknown_recipient_domain,
        reject_invalid_hostname,
        reject_rbl_client cbl.abuseat.org,
        permit_sasl_authenticated,
        permit_mynetworks,
        reject_unauth_destination

C'est la section qui dit à Postfix ce que doit respecter les expéditeurs pour accepter du courrier. Je vais pas expliciter les paramètres ici (ceux de mon serveur), je vous renvoie au document cité plus haut qui concerne l'installation de Postfix.

Modifions la section comme suit :

smtpd_recipient_restrictions =
        reject_non_fqdn_sender,
        reject_non_fqdn_recipient,
        reject_unknown_sender_domain,
        reject_unknown_recipient_domain,
        reject_invalid_hostname,
        reject_rbl_client cbl.abuseat.org,
        permit_sasl_authenticated,
        permit_mynetworks,
        reject_unauth_destination,
        check_policy_service inet:127.0.0.1:10023

On a donc ajouté la ligne check_policy_service inet:127.0.0.1:10023. Le nom du paramètre est assez explicite, on dit à Postfix de vérifier la politique de service, qui est disponible à l'adresse 127.0.0.1 (sur la machine locale), sur le port 10023 (port utilisé par défaut sous FreeBSD - peut-être défaut partout).

N'oubliez pas de mettre une virgule au paramètre d'avant, sinon ça marche pas. 🙂

Il reste à relancer Postfix :

$ postfix reload

Et voilà, en regardant les logs du service de courrier, vous devriez trouver des lignes comme celles-ci, maintenant :

Jul 3 11:41:49 annis postfix/smtpd[759]: NOQUEUE: reject: RCPT from mon-relai.mail.com[xxx.xxx.xxx.xxx]: 450 <Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.;: Recipient address rejected: Greylisted for 300 seconds (see http://isg.ee.ethz.ch/tools/postgrey/help/oo.com.html); from=<Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.; to=<Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.; proto=ESMTP helo=<mon-relai.mail.com>

Le serveur mon-relai.mail.com a été placé en graylist pendant 5 minutes. Au bout de 5 minutes, la remise se fera normalement, et Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. recevra le mail de Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser..

Et voilà, moins de spams en quelques minutes, c'est cool ! 🙂