Serveur mail et webmail – part. 7 – rspamd

Là, maintenant je reçois des mails et… des spams. Nous allons installer rspamd qui s’intégre bien avec postfix et dovecot, en particulier apprendre de l’entrée ou la sortie des mails du dossier spam.

Sources : https://infoloup.no-ip.org/postfix-spam-virus-debian11/#10_-_Filtrage_du_courrier_indesirable

Installation

rspamd va discuter avec dovecot via le protocole sieve et gère son cache avec redis

root@klopmail:~# apt-get install dovecot-sieve dovecot-managesieved rspamd redis-server

Les deux nouveaux services sont démarrer :

root@klopmail:~# systemctl status redis rspamd

Puis constater qu’ils sont en écoute sur l’adresse de loopback, ce qui n’expose rien sur internet.

root@klopmail:~# ss -tlp

Intégration à Postfix

Éditons le fichier de configuration

root@klopmail:/# vi /etc/postfix/main.cf

à la fin de la ligne smtpd_milters ajoutons ,inet:localhost:11332

Et ajoutons la ligne :

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

Nous redémarrons postfix

root@klopmail:/# systemctl restart postfix

Un peu de configuration rspamd

Nous avons déjà opendkim, désactivons dkim sur rspamd

root@klopmail:/# vi /etc/rspamd/local.d/dkim_signing.conf

avec le contenu:

# Désactivation du module DKIM de Rspamd
enabled = false;

Activons l’auto-apprentissage bayésien

root@klopmail:/# vi /etc/rspamd/override.d/classifier-bayes.conf

avec le contenu

autolearn = true;

# Envoi des données statistiques vers le serveur Redis
users_enabled = true;
backend = "redis";

Précisons que le serveur redis est sur la même machine

root@klopmail:/# vi /etc/rspamd/override.d/redis.conf

Avec la ligne

servers = 'localhost';

Dovecot range les messages marqués spam

Activons sieve à la réception d’un message via lmtp

root@klopmail:/etc/dovecot/conf.d# vi 20-lmtp.conf

sous la ligne ajoutons la ligne

mail_plugins = $mail_plugins sieve
root@klopmail:/# vi /etc/dovecot/conf.d/90-sieve.conf

Après la ligne = ajoutons la ligne

sieve_after = /etc/dovecot/sieve-after/

Et décrivons le filtre :

root@klopmail:/# mkdir /etc/dovecot/sieve-after
root@klopmail:/# vi /etc/dovecot/sieve-after/10-spam.sieve

Avec le contenu

require ["fileinto","mailbox"];

if header :contains "X-Spam" "Yes" {
fileinto :create "Junk";
stop;
}

Il faut le compiler

root@klopmail:/# sievec /etc/dovecot/sieve-after/10-spam.sieve

ce qui crée un fichier 10-spam.svbin

Nous contrôlons la configuration de rspamd et redémarrons

root@klopmail:/# rspamadm configtest
syntax OK
root@klopmail:/# systemctl restart rspamd dovecot

Apprentissage à partir des actions des utilisateurs

Nous allons demander à dovecot de solliciter rspamd sur les messages qui entrent et sortent des dossiers spam.

root@klopmail:/# vi /etc/dovecot/conf.d/20-imap.conf

sous la ligne ajoutons la ligne


mail_plugins = $mail_plugins imap_sieve
root@klopmail:/# vi /etc/dovecot/conf.d/90-sieve.conf

Avant la fermeture de accolade, ajoutons la section :

  # Apprentissage selon actions utilisateurs

    sieve_plugins = sieve_imapsieve sieve_extprograms

    # Si déplacé dans le dossier spam > script learn-spam.sieve
    imapsieve_mailbox1_name = Junk
    imapsieve_mailbox1_causes = COPY
    imapsieve_mailbox1_before = file:/etc/dovecot/sieve/learn-spam.sieve

    # Si retiré du dossier spam > script learn-ham.sieve
    imapsieve_mailbox2_name = INBOX
    imapsieve_mailbox2_from = Junk
    imapsieve_mailbox2_causes = COPY
    imapsieve_mailbox2_before = file:/etc/dovecot/sieve/learn-ham.sieve

    # Dossier contenant les fichiers de scripts
    sieve_pipe_bin_dir = /etc/dovecot/sieve

    # Autoriser l'envoi des courriers vers un programme externe
    sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment

Edit du 6 Mai 2024, suivant suggestion de fred en commentaire : imapsieve_mailbox2_name = * -> imapsieve_mailbox2_name = INBOX.

Créons les scripts

root@klopmail:/# mkdir /etc/dovecot/sieve
root@klopmail:/# vi /etc/dovecot/sieve/learn-spam.sieve

Avec le contenu

require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];

if environment :matches "imap.user" "*" {
  set "username" "${1}";
}

pipe :copy "rspamd-learn-spam.sh" [ "${username}" ];

Puis le second script :

root@klopmail:/# vi /etc/dovecot/sieve/learn-ham.sieve

Avec le contenu

require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];

if environment :matches "imap.mailbox" "*" {
  set "mailbox" "${1}";
}

if string "${mailbox}" "Trash" {
  stop;
}

if environment :matches "imap.user" "*" {
  set "username" "${1}";
}

pipe :copy "rspamd-learn-ham.sh" [ "${username}" ];

Redémarrons dovecot

root@klopmail:/# systemctl restart dovecot

Compilons les deux scripts sieve

root@klopmail:/# sievec /etc/dovecot/sieve/learn-spam.sieve 
root@klopmail:/# sievec /etc/dovecot/sieve/learn-ham.sieve 

Le premier script shell

root@klopmail:/# vi /etc/dovecot/sieve/rspamd-learn-spam.sh

Avec le contenu

#!/bin/sh
exec /usr/bin/rspamc learn_spam

Le second script shell

root@klopmail:/# vi /etc/dovecot/sieve/rspamd-learn-ham.sh

Avec le contenu

#!/bin/sh
exec /usr/bin/rspamc learn_ham

Rendons les exécutables et redémarrons

root@klopmail:/# chmod +x /etc/dovecot/sieve/rspamd-learn-spam.sh /etc/dovecot/sieve/rspamd-learn-ham.sh
root@klopmail:/# systemctl restart dovecot

Test apprentissage

Envoyons un mail de test d’une boite vers une seconde. Puis activons des traces plus bavardes dans dovecot :

root@klopmail:/# vi /etc/dovecot/conf.d/10-logging.conf

positionnons la variable mail_debug

mail_debug=yes

redémarrons dovecot

root@klopmail:/# systemctl restart dovecot

Dans la configuration de la boite cible du message vérifions que le dossier spam est activé. clic droit sur le compte – propriétés, puis

Dans un terminal suivons les logs dovecot :

root@klopmail:/# journalctl -u dovecot.service -f

dans un autre terminal suivons les logs rspamd

root@klopmail:~# tail -f /var/log/rspamd/rspamd.log

Marquons le message comme indésirable, dans les logs de dovecot, nous voyons

Debug: sieve: action pipe: running program: rspamd-learn-spam.sh
...
Debug: program exec:/etc/dovecot/sieve/rspamd-learn-spam.sh: Pass

Et dans les logs de rspamd :

rspamd_controller_learn_fin_task: <127.0.0.1> learned message as spam: 47db517a-fecb-bf0d-a1a9-d6bb14279dd3@framboisier.fr

Et en cliquant sur acceptable dans thunderbird, nous voyons le filtre sieve learn-ham activé et le message classé ‘ham’.

Nous pensons à désactiver les traces dans dovecot et le redémarrer.

Interface web

Pour accéder à l’interface web de rspamd, créons le virtual host rspamd.dync.fr. Dans la zone dync.fr, commençons par ajouter un CNAME rspamd qui pointe vers klopmal

root@klopmail:/# vi /etc/apache2/sites-available/030-rspamd.conf
MDomain rspamd.dync.fr
<VirtualHost _default_:443>
        serverName rspamd.dync.fr
        ErrorLog ${APACHE_LOG_DIR}/rspamd-error.log
        CustomLog ${APACHE_LOG_DIR}/rspamd-access.log combined
        SSLEngine on
        SSLOpenSSLConfCmd MinProtocol TLSv1.2
        Protocols h2 http/1.1 acme-tls/1
        ProxyPass "/" "http://localhost:11334/"
        ProxyPassReverse "/" "http://localhost:11334/"
</VirtualHost>

Activons les modules, le sites et redémarrons deux fois :

root@klopmail:/# a2enmod proxy
root@klopmail:/# a2enmod proxy_http
root@klopmail:/# a2ensite 030-rspamd.conf
root@klopmail:/# apachectl configtest 
Syntax OK
root@klopmail:/# apachectl restart
root@klopmail:/# apachectl restart

Créons le hash du mot de passe

root@klopmail:/# rspamadm pw
Enter passphrase: <un truc super long>
$2$tj9iut645c.....

Stockons le dans le fichier de configuration

root@klopmail:/# vi /etc/rspamd/local.d/worker-controller.inc

Contenu :

password="$2$tj9iut645c...."

relançons rspamd

root@klopmail:/# systemctl restart rspamd

et un test

et l’onglet « history » qui est instructif, où l’on voit que l’anti-spam est efficace dés sont installation.

5 réponses sur “Serveur mail et webmail – part. 7 – rspamd”

  1. bonjour,
    Un grand merci pour ce tutoriel vraiment bien documenté.
    J’ai rencontré un petit problème lors de l’installation de rspamd
    la signature dkim n’était plus envoyée par postfix.
    Tout est rentré dans l’ordre suite a ma modification sur milter_mail_macros .
    J’ai rajouté une méthode de connexion SASL
    {auth_type}
    super boulot
    cordialement jlg

  2. Merci pour ce tuto. Dans la partie « Apprentissage à partir des actions des utilisateurs », je rencontre un souci.
    Lorsqu’on supprime un email celui ci est déplacé dans la corbeille donc, quand on supprime un email du dossier Junk cela déclenche le learn-ham sur celui-ci.
    Du coup, le spam va être réappris comme non-spam, ce qui n’est pas souhaitable…
    imapsieve_mailbox2_name = * serait donc à remplacer par autre chose…

  3. La solution est de remplacer
    imapsieve_mailbox2_name = *
    par
    imapsieve_mailbox2_name = INBOX
    On ne passe alors en ham que les messages qui vont de Junk à Inbox.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *