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 #mail_plugins ajoutons la ligne
mail_plugins = $mail_plugins sieve
root@klopmail:/# vi /etc/dovecot/conf.d/90-sieve.conf
Après la ligne #sieve_after = 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 #mail_plugins 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.
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
Merci pour le compliment
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…
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.
Merci. Cela est pertinent, je mets à jour.