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 à planquer son pactole 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.
300 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 ». Vingt ans après cette prophétie optimiste, près de 300 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.
- 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 identifié 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 Rocky Linux 8, 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 :
# setenforce 0
Installation
SpamAssassin est fourni par les dépôts officiels de Red Hat Enterprise Linux et Rocky Linux. On notera que l’application dépend d’une quantité importante de modules Perl :
# dnf install -y spamassassin
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 :
# groupadd --system spamd # useradd --system -c "SpamAssassin User" -g spamd -s /bin/false \ -d /var/log/spamassassin spamd
Créer le répertoire système de SpamAssassin avec les permissions appropriées :
# mkdir -v /var/log/spamassassin mkdir: created directory '/var/log/spamassassin' # chown spamd:spamd /var/log/spamassassin/
Activer et démarrer le service :
# systemctl enable spamassassin --now
Mettre à jour les règles de SpamAssassin :
# sa-update -v Update available for channel updates.spamassassin.org: -1 -> 1915243 http: (curl) GET https://spamassassin.apache.org/updates/MIRRORED.BY, success http: (curl) GET http://sa-update.verein-clean.net/1915243.tar.gz, success http: (curl) GET http://sa-update.verein-clean.net/1915243.tar.gz.sha512, success http: (curl) GET http://sa-update.verein-clean.net/1915243.tar.gz.asc, success Update was available, and was downloaded and installed successfully
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 :
# 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" Jan 17 11:42:46 sd-155842 spamd[120781]: spamd: identified spam (1002.6/5.0) for spamd:987 in 0.7 seconds, 1811 bytes.
Mise à jour automatique des règles
Éditer un petit script shell pour la mise à jour des règles et le redémarrage du service :
#!/bin/bash
#
# spamassassin-update.sh
sa-update
systemctl restart spamassassin
exit 0
Ranger ce script dans un endroit approprié comme ~/bin
et définir des permissions appropriées :
# chmod +x spamassassin-update.sh
Ensuite, définir une tâche automatique pour la mise à jour quotidienne :
# crontab -e
# Update SpamAssassin
00 01 * * * /root/bin/spamassassin-update.sh 1> /dev/null
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 la Corbeille, 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. Avec un peu d’obstination, on finit par tomber sur le booléen qui va bien :
# setsebool -P spamd_enable_home_dirs 1
Par la suite, SELinux cause un autre problème. En résumé, 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
.
# semanage fcontext -a -t spamd_var_lib_t '/var/log/spamassassin(/.*)?' # restorecon -Rv /var/log/spamassassin/
À partir de là, plus rien à signaler :
# sealert -a /var/log/audit/audit.log 100% done found 0 alerts in /var/log/audit/audit.log # setenforce 1
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.
0 commentaire