Parfois le matin, en lançant Thunderbird, je me demande à quoi ressemblerait le monde si le courrier électronique n’existait pas. Toutes ces missives que je ne lirais pas. La supplique du fils d’un célèbre dictateur africain qui m’invite à dissimuler son trésor dans ma penderie, moyennant une modeste contribution initiale de ma part. Un courrier personnel de Bill Gates pour m’annoncer que j’ai gagné le jackpot de la loterie annuelle Microsoft avec une demande de confirmation pour savoir si l’adresse électronique de l’heureux gagnant est bien valide. Une exhortation à augmenter la taille de mon attribut viril afin de satisfaire ma partenaire frustrée par les dimensions ridicules dudit membre. Une fausse lettre d’amour de Britney Spears, accompagnée d’une bombe à retardement numérique censée détruire mon système. Nous vivons une époque formidable.
- 100 milliards de spams par jour
- Présentation de SpamAssassin
- Prérequis
- Installation
- Configuration de SpamAssassin
- Configuration de Postfix
- Premier test
- Mise à jour automatique des règles
- Configuration de Thunderbird
- SpamAssassin et SELinux
100 milliards de spams par jour
En janvier 2004, Bill Gates avait annoncé solennellement que « le problème du spam sera résolu d’ici 2006, car les ingénieurs Microsoft sont en train d’étudier la question ». En 2020, soit seize ans après cette prophétie optimiste, près de 100 milliards (!) de courriers non sollicités sont envoyés quotidiennement sur tous les réseaux de la planète, au grand dam des utilisateurs excédés par ce tsunami numérique.
En attendant que les ingénieurs Microsoft restent penchés sur la question, on peut déjà utiliser quelques solutions anti-spam qui fonctionnent. Aujourd’hui, nous allons entamer notre lutte contre le spam avec SpamAssassin.
Présentation de SpamAssassin
SpamAssassin est un programme écrit en Perl qui agit au niveau du serveur mail. Il fait passer un certain nombre de tests à tous les messages. Ensuite, un score est attribué à chaque message en fonction du résultat de ces tests. Si le score dépasse un certain seuil, le message est considéré comme spam et marqué comme tel dans l’en-tête. Il suffit alors de créer un filtre correspondant dans le client de messagerie. Dans la pratique quotidienne, le filtrage est assez efficace. SpamAssassin permet d’éliminer un pourcentage significatif de spams sans pour autant envoyer les messages légitimes au nirvana numérique.
Prérequis
Dans l’exemple ci-dessous, nous allons installer SpamAssassin sur un serveur dédié tournant sous CentOS 7, et disposant d’un serveur mail IMAP avec Postfix et Dovecot.
Pour la durée de l’installation et des premiers tests de filtrage de spams, nous allons basculer SELinux en mode permissif pour éviter de nous retrouver confrontés à des blocages mystérieux.
$ sudo setenforce 0
Installation
SpamAssassin est fourni par les dépôts officiels de CentOS.
$ sudo yum install spamassassin
On notera que l’application dépend d’une quantité importante de modules Perl.
Configuration de SpamAssassin
Éditer /etc/mail/spamassassin/local.cf
comme ceci.
# /etc/mail/spamassassin/local.cf
required_hits 5
report_safe 0
required_score 5
rewrite_header Subject [SPAM]
Quelques mots sur les options utilisées.
required_hits
définit le seuil du filtrage. Un paramétrage à5
est généralement considéré comme efficace pour une PME. Plus ce chiffre est réduit, plus le filtrage sera agressif. Si vous êtes un labo d’analyes et que vous recevez régulièrement des mails qui tentent de vous vendre des produits pharmaceutiques, vous avez intérêt à définir un score plus élevé,8
par exemple.report_safe
décide si le message en question doit être supprimé (1
) ou redirigé vers la boîte de réception avec une réécriture de l’en-tête (0
).required_score
définit le score pour tous les messages envoyés au domaine, en allant du message légitime (0
) au spam résolument pourri (5
). Si nous abaissons ce score à3
, cela nous permettrait certes d’éliminer un plus grand nombre de courriers non sollicités. En revanche, on augmenterait la probabilité d’avoir des faux positifs, c’est-à-dire des messages légitimes identifiés comme spams.rewrite_header
se charge de réécrire l’en-tête du message. En l’occurrence, la chaîne de caractères[SPAM]
est ajoutée au sujet du message.
La prochaine étape consiste à ajouter l’utilisateur système spamd
et le groupe système correspondant.
$ sudo groupadd spamd $ sudo useradd -c "SpamAssassin User" -g spamd -s /bin/false \ -d /var/log/spamassassin spamd
Définir les permissions du répertoire système de SpamAssassin.
$ sudo chown spamd:spamd /var/log/spamassassin
Activer et démarrer le service.
$ sudo systemctl enable spamassassin --now
Mettre à jour les règles de SpamAssassin.
$ sudo sa-update
Configuration de Postfix
Éditer /etc/postfix/master.cf
. Ajouter une option tout en haut du fichier.
smtp inet n - n - - smtpd -o content_filter=spamassassin
Ensuite, ajouter ceci tout à la fin du fichier.
spamassassin unix - n n - - pipe flags=R user=spamd argv=/usr/bin/spamc -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}
Redémarrer Postfix.
$ sudo systemctl restart postfix
Premier test
Envoyer un mail depuis un compte externe. Le sujet peut être librement choisi. Dans le corps du message, copier/coller la chaîne de caractères suivante.
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
Si tout s’est bien passé, la boîte de réception contient un message marqué [SPAM]
.
L’opération de filtrage est enregistrée comme ceci.
$ journalctl | grep "identified spam" Jun 07 10:18:58 sd-100246 spamd[6970]: spamd: identified spam (1002.4/5.0) for spamd:1006 in 0.3 seconds, 4239 bytes.
Mise à jour automatique des règles
Éditer un petit script shell de deux lignes pour la mise à jour des règles et le redémarrage du service.
#!/bin/bash
#
# update-spamassassin.sh
sa-update
systemctl restart spamassassin
Ranger ce script dans un endroit approprié comme ~/bin
et définir des permissions appropriées.
$ chmod 0700 update-spamassassin.sh
Ensuite, définir une tâche automatique pour la mise à jour quotidienne.
$ sudo crontab -e
# Mettre à jour les règles pour SpamAssassin tous les jours à 1h00
00 01 * * * /home/microlinux/bin/update-spamassassin.sh
Configuration de Thunderbird
Une méthode efficace pour séparer le bon grain de l’ivraie, c’est de définir un filtre dans Thunderbird. Ouvrir l’interface de définition des filtres dans Outils > Filtres de messages et créer un nouveau filtre comme ceci, par exemple.
Dorénavant, les spams sont automatiquement redirigés vers le dossier correspondant, et il ne reste plus que quelques faux négatifs que l’on pourra trier manuellement dans la boîte de réception.
SpamAssassin et SELinux
Les premières tentatives de débogage avec SELinux peuvent mener à des résultats quelque peu déroutants. Voici ce que j’ai obtenu.
$ sudo sealert -a /var/log/audit/audit.log ***** Plugin catchall (100. confidence) suggests ***** If you believe that perl should be allowed create access on the .spamassassin directory by default. Then you should report this as a bug. You can generate a local policy module to allow this access. Do allow this access for now by executing: # ausearch -c '7370616D64206368696C64' --raw | audit2allow -M my-7370616D64206368696C64 # semodule -i my-7370616D64206368696C64.pp
Le hic, c’est que la paire de commandes sugérée ici ne mène à rien.
$ sudo ausearch -c '7370616D64206368696C64' --raw
Une recherche Google m’a montré que je n’étais visiblement pas le seul à être confronté au problème. Et puis j’ai fini par tomber sur la solution dans la page de manuel spamd_selinux(8)
. Il suffisait de trouver le booléen qui va bien.
$ sudo setsebool -P spamd_enable_home_dirs 1
Par la suite, SELinux a causé un autre problème avec Spamassassin.
***** Plugin catchall (100. confidence) suggests ***** If you believe that perl should be allowed read access on the user_prefs file by default. Then you should report this as a bug. You can generate a local policy module to allow this access.
Ici, Spamassassin n’arrive pas à accéder à /var/log/spamassassin/.spamassassin
. Les fichiers de ce répertoire ont un contexte SELinux var_log_t
.
En temps normal, Spamassassin est capable d’écrire dans /var/lib/spamassassin
. On va donc prendre le contexte de ce répertoire (spamd_var_lib_t
) et l’appliquer à /var/log/spamassassin
.
$ sudo semanage fcontext -a -t spamd_var_lib_t \ '/var/log/spamassassin(/.*)?' $ sudo restorecon -Rv /var/log/spamassassin/
À partir de là, plus rien à signaler.
$ getenforce Enforcing $ sudo sealert -a /var/log/audit/audit.log 100% done found 0 alerts in /var/log/audit/audit.log
La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.
7 commentaires
Guilhem · 15 juin 2020 à 0 h 03 min
Super, merci pour le tutoriel. C’est clair et je comprends ce que je tape.
Cependant, j’ai l’impression que ça ne fonctionne pas car quand j’envoie le message de test, le sujet n’est pas modifié et rien n’apparaît dans les logs, vous avez une idée ?
Guilhem · 15 juin 2020 à 11 h 43 min
J’ai repris l’installation ce matin, et ça a fonctionné. Allez savoir pourquoi… ?
Gregory Trolliet · 18 juin 2020 à 7 h 30 min
Bonjour, j’ai juste une petite question pour la partie cron.
J’ai mis mon fichier dans le home de mon user, mais du coup le script n’a pas les droits pour exécuter le spamassassin restart, je dois corriger quoi?
kikinovak · 18 juin 2020 à 7 h 43 min
Éditez votre
crontab
en tant queroot
, tout simplement.Gregory Trolliet · 18 juin 2020 à 10 h 43 min
Ah mais oui…
Merci pour la réponse rapide, et merci pour le tutoriel très intéressant.
Florent · 5 mai 2022 à 18 h 06 min
Super article, comme toujours !
Juste une petite remarque, dans les en-têtes des mails reçus, j’ai la règle URIBL_BLOCKED qui apparaît. Les requêtes vers URIBL sont bloquées. Je ne sais pas si ça peut faire une différence sur la détection de certains emails non flagués en spam, mais en tout cas, pour que la requête vers URIBL puisse avoir lieu, il faut que le serveur DNS local du serveur ne soit pas configuré avec des forwarders, dans les options.
Le blog technique de Microlinux – C'est bien fait pour vous > Seekalgo · 20 décembre 2020 à 13 h 50 min
[…] Filtrer les spams avec SpamAssassin sous CentOS 7 […]
Les commentaires sont fermés.