rspamd

EDIT du 27 juillet 2017

Ces instructions s’appliquent à une version un peu ancienne de rspamd, ça a pas mal changé depuis quelques versions. En particulier, rmilter est devenu obsolète et ses fonctionnalités intégrées directement à rspamd.

FIN

Ah le spam… On a beau utiliser toute la panoplie pour s’assurer que les messages ne sont pas émis depuis un serveur notoirement connu sur les différentes listes noires, mais qu’il est bien autorisé (SPF) et et que les messages sont authentiques (DKIM), ils passent parfois la liste grise.
Il manquait quand même un outil dans ma boîte, c’est celui de l’analyse bayésienne, tu sais ce qui fait que parfois un message se retrouve dans le dossier spam. A partir de statistiques basées sur les différents aspects d’un mail, à la fois sur l’enveloppe (expéditeur, serveur d’origine, listes noires) aussi bien que sur le contenu, on va essayer de déterminer s’il s’agit d’un message désirable, s’il faut le poubelliser, ou s’il y a un doute le mettre en quarantaine. Il existe une multitude de logiciels spécialisés dans cette tâche dont le plus célèbre est sans doute SpamAssassin mais j’ai opté pour rspamd pour plein de raisons mais en particulier parce qu’il s’occupe également du greylisting, spf, dkim et de l’interface avec l’antivirus (clamav dans mon cas). Donc exit postgrey, postfix-policyd-spf-python, opendkim et clamsmtpd. L’installation et la configuration ne sont pas très compliquées même s’il y a quelques subtilités. Premièrement, il semble que le mainteneur du paquet debian a abandonné par manque de temps et la version dans les dépôts de Jessie est antédiluvienne et il vaut mieux télécharger le paquet fournit par le projet. J’utilise également postfix et c’est rmilter qui fait l’interface avec rspamd, ce dernier fait l’analyse (et uniquement ça en fait) et c’est bien rmilter qui indique au MTA ce qu’il faut faire du message en fonction du résultat de l’analyse de rspamd ou de l’antivirus par exemple.
Nouvelle particularité liée à l’utilisation de systemd dans Debian 8, la configuration est différente selon qu’on veut utiliser systemd ou sysvinit. Je ne sais pas si l’intention était de faire un paquet unique pour toutes les version de Debian mais c’est confus et on se retrouve avec /etc/rmilter.conf, /etc/rmilter.conf.sysvinit et /etc/rmilter.conf.common. Bon. Donc en fait quand on lance systemctl start rmilter, on va d’abord lire /etc/rmilter.conf, j’imagine que quand on fait service rmilter start sur les anciennes distribution, on lit /etc/rmilter.conf.sysvinit. Ou alors il faut faire un mv ? Bref. Dans mon cas, premier écueil :

# rmilter is socket-activated under systemd
bind_socket = fd:3;

Surprise ! Ca ne marche pas… J’ai donc modifié la ligne comme ceci pour que rmilter écoute effectivement sur le port configuré dans postfix :

bind_socket = inet:11000@localhost;

Dans /etc/postfix/main.cf :

smtpd_milters = inet:localhost:11000

Passons à /etc/rmilter.conf.common qui comprend la configuration commune et effective. La première section concerne clamav et permet de soumettre les pièces jointes à scanner au démon clamd. Nouveau problème, impossible de causer avec le socket local configuré par défaut (/var/run/clamav/clamd.ctl). Pour ne pas s’embêter à chercher pourquoi, on peut configurer les deux pour qu’ils causent sur un socket tcp à la place. Côté clamd, il faut passer la commande dpkg-reconfigure clamav-daemon pour obtenir les lignes suivantes dans /etc/clamav/clamd.conf :

TCPSocket 11001
TCPAddr 127.0.0.1

Côté rmilter, dans /etc/rmilter.conf.common :

servers = 127.0.0.1:11001;

La section suivante concerne la communication avec rspamd et ne pose pas de problème particulier. Celle d’après concerne redis et ne pose pas de problème non plus. L’installation de ce dernier est plus que conseillée au moins pour le greylisting. Concernant DKIM, rmilter va par défaut vérifier la signature des messages entrants mais on peut aussi le faire signer les messages sortants. Dans ce cas, il faut qu’il dispose de la clé pour chaque domaine. On peut configurer un sélecteur universel et déposer les clés dans des fichiers nommés selon le formalisme décrit :

        # Universal selector, keys will be checked for pattern /etc/dkim/<domain>.<selector>.key
    domain {
                key = /etc/dkim;
                domain = "*";
                selector = "default";
        };

On aura donc des fichiers comme ceci :

-rw------- 1 _rmilter root 887 janv.  23 11:52 /etc/dkim/mondomaine.com.default.key

Le démon s’exécute avec l’utilisateur _rmilter, il faut donc faire attention à ce qu’il puisse accéder au répertoire et lire le fichier. Je ne sais pas si c’est postfix ou rmilter qui a changé mais ce dernier ne signait pas les messages sortants parce qu’il ne voyait pas l’authentification SASL passer. J’ai donc modifié les macros envoyées par postfix au filtre pour inclure auth_type dans /etc/postfix/main.cf :

milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen} {auth_type}  

A priori, pas de configuration spéciale à modifier pour rspamd sauf peut-être pour l’interface graphique. La seule difficulté concernant ce dernier vient encore de systemd, impossible de le démarrer avec systemctl start rspamd, ça plante à chaque fois. Je ne comprends pas exactement pourquoi, mais il faut lancer le unit file qui se termine par .socket avec systemctl start rspamd.socket.