Filtrer les spams avec SpamAssassin et Postfix sous CentOS

Filtrage Anti-SPAMParfois 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

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 2017, soit treize 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. Dans un précédent article, j’avais détaillé le blocage d’un ou plusieurs domaines avec Postfix pour se débarrasser des spammeurs les plus virulents. Aujourd’hui, nous allons continuer notre luttre contre le spam avec SpamAssassin.

SpamAssassinSpamAssassin 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.

# setenforce 0

Installation

SpamAssassin est fourni par les dépôts officiels.

# 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.

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 spamd
# 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.

# chown spamd:spamd /var/log/spamassassin

Activer et démarrer le service.

# systemctl enable spamassassin
# systemctl start spamassassin

Mettre à jour les règles de SpamAssassin.

# 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.

# 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].

Test SpamAssassin

L’opération de filtrage est enregistrée comme ceci.

# journalctl | grep "identified spam"
Oct 06 12:11:26 sd-48011.dedibox.fr spamd[44922]: spamd: identified 
spam (18.5/5.0) for spamd:1002 in 1.3 seconds, 17666 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
#
# update-spamassassin.sh

/usr/bin/sa-update
/usr/bin/systemctl restart spamassassin

Ranger ce script dans /usr/local/sbin et définir des permissions appropriées.

# chmod 0700 /usr/local/sbin/update-spamassassin.sh

Ensuite, définir une tâche automatique pour la mise à jour quotidienne.

# crontab -e
...
# Mettre à jour les règles pour SpamAssassin tous les jours à 1h00
00 01 * * * /usr/local/sbin/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.

Filtre Thunderbird

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.

Spams Thunderbird

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.

# 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.

# ausearch -c '7370616D64206368696C64' --raw | \
> audit2allow -M my-7370616D64206368696C64
Nothing to do

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.

# setsebool -P spamd_enable_home_dirs 1

À partir de là, plus rien à signaler.

# getenforce
Enforcing
# sealert -a /var/log/audit/audit.log
100% done
found 0 alerts in /var/log/audit/audit.log
Ce contenu a été publié dans CentOS, Documentation Microlinux, avec comme mot(s)-clé(s) , , , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

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