Rspamd: un antispam performant

Depuis maintenant plus de six ans j’héberge mon propre serveur de mail et depuis tout ce temps là mon infrastructure n’a pas changée:

Dspam fonctionnait très bien, je l’utilisais avec le plugin dovecot-antispam qui permet de faire l’apprentissage de dspam, faux positifs et faux négatifs, simplement en déplacant les message depuis ou vers le dossier de spams.

Seulement depuis l’été 2014, le seul développeur de dspam a annoncé qu’il abandonnait le projet et en conséquence dspam a été supprimé de debian jessie. Il me fallait donc un antispam pour remplacer dspam et j’ai décidé d’utiliser rspamd.

Rspamd, comme dspam, fait du filtrage bayésien basé sur de l’apprentissage mais pas seulement:

Rspamd s’interface avec postfix comme un milter.

L’installation est très facile sur debian jessie:

apt-get install rspamd rmilter

rmilter fait interface entre rspamd et postfix, ma configuration peut se résumer à:

pidfile = /run/rmilter.pid;
spamd {
# rspamd écoute sur le port 11333
servers = r:localhost:11333;
connect_timeout = 1s;
results_timeout = 20s;
error_time = 10;
dead_time = 300;
maxerrors = 10;
reject_message = "Spam message rejected; If this is not spam contact abuse";
whitelist = 127.0.0.1/32, 192.168.0.0/16;
rspamd_metric = "default";
};
# rmilter écoute sur le port 11000
bind_socket = inet:11000@localhost;
tempdir = /tmp;
max_size = 10M;
use_dcc = no;

Ensuite on configure postfix pour qu’il transmette tous les mail entrant à rmilter:

smtpd_milters = inet:localhost:11000
milter_protocol = 6
milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}
milter_default_action = accept

Si vous suivez bien, voilà le parcours d’un mail entrant:

  • postfix passe le mail à rmilter
  • rmilter passe le mail à rspamd
  • rspamd répond accept ou reject et éventuellement rajoute un header X-Spam: yes
  • La réponse remonte jusqu’à postfix, si l’action de rspamd est reject, postfix va rejetter le message avec une erreur SMTP, sinon il l’accepte de le délivre normalement.

La configuration de rspamd est très efficace par défaut, chaque critère (RBL, SPF etc) a un poids et le mail entrant obtient donc une note, si la note dépasse un certain seuil paramétrable il va rejeter le message, l’accepter avec un header X-Spam ou l’accepter tout court. Voyez le fichier /etc/rspamd/metrics.conf.

Maintenant on veut que les mails qui ont un header X-Spam: yes soient mis automatiquement dans le dossier Spam, c’est dovecot qui va le faire avec un filtre sieve:

# dovecot.conf
plugin {
sieve_before = /etc/dovecot/rspamd.sieve
}
# /etc/dovecot/rspamd.sieve
require ["fileinto"];
if header :is "X-Spam" "Yes" {
fileinto "Spam";
}

On compile le filtre sieve avec la commande sievec /etc/dovecot/rspamd.sieve.

Mais maintenant on veut aussi interfacer l’apprentissage du filtrage bayésien de rspamd en déplaçant depuis/vers le dossier Spam avec le plugin dovecot-antispam:

# dovecot.conf
plugin {
antispam_backend = pipe
antispam_pipe_program = /usr/bin/rspamc
antispam_pipe_program_args =
antispam_pipe_program_spam_arg = learn_spam
antispam_pipe_program_notspam_arg = learn_ham
antispam_spam = Spam
antispam_trash_pattern_ignorecase = trash;deleted *
}

Pour finir, une petite note sur mon passage effectif de dspam à rspamd, dans ma config précédente postfix passait le mail à dspam en LMTP et c’est dspam qui à son tour appelait dovecot pour délivrer le mail. Avec la nouvelle config postfix doit passer le mail directement à dovecot:

# /etc/postfix/main.cf
virtual_transport = dovecot
# /etc/postfix/master.cf
# vmail et mail sont respectivement l'utilisateur et le groupe de mon
# utilisateur virtuel de mail
dovecot unix - n n - - pipe
flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${user}@${nexthop}

Cerise sur le gâteau, rspamd a des logs très utiles et une interface en ligne de commande très sympathique, on peut par exemple obtenir des statistiques:

% rspamc stat
Messages scanned: 1289
Messages with action reject: 262, 20.32%
Messages with action soft_reject: 0, 0.00%
Messages with action rewrite_subject: 0, 0.00%
Messages with action add_header: 265, 20.55%
Messages with action greylist: 45, 3.49%
Messages with action no_action: 717, 55.62%
Messages treated as spam: 527, 40.88%
Messages treated as ham: 762, 59.11%
[...]

Pour conclure je suis très content de mon passage à rspamd, il a été immédiatement plus efficace que mon dspam entrainé depuis plus de six ans !