Installer une passerelle anti-spam avec SpamAssassin et procmail
Auteur : Olivier BOYER - oboyer () ajoute ! org
Mots clés
OpenBSD, spam, SpamAssassin, procmail, fetchmail, spamd
Introduction
Ce document décrit comment mettre en place une passerelle anti-spam avec SpamAssassin.
Il existe de nombreuses façons de filtrer les courriers non sollicités (spams) avec SpamAssassin. Dans cette maquette, l'idée est de filtrer les spams reçus dans différentes boîtes aux lettres, en dehors de notre domaine d'administration. Ce filtrage ne peut être effectué par les techniques classiques de greylisting puisque ces boîtes aux lettres ne sont pas du ressort de l'administrateur mails du domaine. Il faut donc utiliser une technique de filtrage post réception. Les spams vont dans un premier temps être reçus, puis, filtrés par SpamAssassin.
Ce document présente deux types de configuration.
- La première décrite est dite
user-side. C'est-à-dire qu'elle ne dépend que de fichiers remplis par chaque utilisateur. Il est possible de mettre en place des systèmes plus complexes de filtrage au niveau du serveur. Ces derniers ne seront pas abordés ici.
- La seconde décrite est plutôt
server-side. Le marquage des mails est effectué par le daemon de SpamAssassinspamd(ne pas confondre avec le daemon degreylistingd'OpenBSD).
Présentation de la maquette
- Le serveur de mails
MTAfonctionne sous OpenBSD. - Chaque utilisateur dispose d'une compte shell sur le serveur.
- Les spams entrants à destination du domaine sont filtrés par la technique de
greylistingprésentée dans un autre document. - Le produit anti-spam utilisé pour le traitement des messages d'autres boîtes aux lettres est
SpamAssassin. - Les mails sont rapatriés par les utilisateurs via
fetchmail(1) - Le
Mail Delivery Agentutilisé parfetchmail(1)estprocmail(1).
Note
Toutes les commandes présentées ici, sont à exécuter, sauf mention contraire, en tant qu'administrateur de la machine.
Pré-requis
- un système OpenBSD installé et fonctionnel
Installer les produits
Procmail
procmail permet de classer le courrier entrant. Pour l'installer, procédez comme suit :
# cd /usr/ports/mail/procmail # make install clean
Fetchmail
fetchmail est un client mail qui permet de télécharger le courrier de différentes boîtes aux lettres via différents protocoles : pop3(s), imap(s), … Pour l'installer, procédrez comme suit :
# cd /usr/ports/mail/fetchmail # make install clean
SpamAssassin
SpamAssassin est l'outil qui est utilisé ici comme logiciel de marquage de mails. Pour l'installer, procédez comme suit :
# cd /usr/ports/mail/p5-Mail-SpamAssassin # make install clean
Tronc commun : configuration des produits
Les deux solutions de marquage de courriers décrites dans ce document possèdent un tronc commun : la configuration de fetchmail(1) et de SpamAssassin. La différence se situe lors de l'appel à SpamAssassin.
Fetchmail
La configuration de fetchmail(1) ci-dessous permet de télécharger les mails de boîtes aux lettres distantes imap.undomaine.com et pop.autredomain.fr via les protocoles imap et pop3s. Les mails reçus sont passés à procmail(1), qui lui, appliquera les filtres SpamAssassin, et autres règles.
#$HOME/.fetchmailrc #see fetchmail(1) #set logfile ~/fetchmail.log defaults no fetchall keep mda "procmail -d %T" poll imap.undomaine.com proto imap user "user-undomaine.com" is "utilisateur_local" password "motDePasse_de_user-undomaine.com" nokeep poll pop.autredomaine.fr proto pop3 user "user-autredomaine.fr" is "utilisateur_local" password "motDePasse_de_user-autredomaine.com" ssl nokeep
Configurer SpamAssassin
La configuration livrée par défaut convient pratiquement à nos besoins. Cependant, il est posible de l'améliorer un peu en ajoutant les lignes suivantes au fichier /etc/mail/spamassassin/local.cf :
#/etc/mail/spamassassin/local.cf # Add *****SPAM***** to the Subject header of spam e-mails rewrite_header Subject *****SPAM***** # which locales are considered OK for incoming mail # 'en' - Western character sets in general ok_locales en # Use Bayesian classifier (default: 1) use_bayes 1 # Bayesian classifier auto-learning (default: 1) bayes_auto_learn 1 # skip RBL, MTA already did it skip_rbl_checks 1 dns_available yes # whitelist whitelist_from *@a_white_listed_domain.com whitelist_from a_white_listed_friend@domain.com
Pour plus de détails, voir la page de documentation :
# perldoc Mail::SpamAssassin::Conf
Première configuration possible
La configuration décrite est dite user-side. C'est-à-dire qu'elle ne dépend que de fichiers remplis par chaque utilisateur.
Procmail
Dans la maquette présentée ici, procmail(1) fait office de Mail Delivery Agent. C'est-à-dire qu'il est chargé par fetchmail(1) de déposer le courrier dans la boîte aux lettres de l'utilisateur final, en appliquant certaines règles.
#$HOME/.procmailrc MAILDIR=$HOME/mail DEFAULT=$MAILDIR/Inbox #LOGFILE=$HOME/procmail.log # ## Spam Filtering # # check for spam with SpamAssassin :0fw: $HOME/tmp/spamassassin.lock * < 256000 | /usr/local/bin/spamassassin # All mail tagged as spam (eg. with a score higher than the set threshold) # is moved to "spam" mailbox. :0: * ^X-Spam-Status: Yes $MAILDIR/spam # ## procmail rules # # Autres règles de procmail ci-dessous.
Premier lancement et entretien de SpamAssassin
SpamAssassin intègre un filtre d'apprentissage statistique bayesien. Pour améliorer sa pertinence, il faut sauvegarder tous les spams reçus et non interceptés par SpamAssassin dans une boîte aux lettres.
A l’initialisation de SpamAssassin, il est possible d’accélérer le processus d’apprentissage en exécutant la commande sa-learn(1). Pour que l'apprentissage initial soit efficace, il est conseillé de respecter les points suivants :
- s'assurer que les
mboxd'apprentissage ne contiennent que des “spam” ou que des “ham”, - que le nombre de “spam” dans la boîte aux lettres soit supérieur à 1000,
- que le nombre de “ham” soit bien supérieur au nombre de “spam”,
- que les dates des “spam” et des “ham” soient assez proches. Si vous faites l'apprentissage avec de vieux “spam”, mais des “ham” récents, SpamAssassin va penser qu'un message avec une date ancienne est un “spam”.
Exécutez les commandes suivantes en tant qu'utilisateur :
- pour apprendre ce qu'est un spam :
$ sa-learn --spam --mbox ~/mail/spam
- pour apprendre ce qu'est un courier légitime :
$ sa-learn --ham --mbox /var/mail/$USER
Remarques :
- Si vous ne disposez pas de
mboxsur la machine, créez un compte mail auquel vous transfèrerez les spams. - Il faut exécuter les commandes ci-dessus de temps à autre pour entretenir son SpamAssassin.
Deuxième configuration possible
La configuration décrite maintenant est plutôt server-side. Le marquage des mails est effectué par le daemon de SpamAssassin spamd (ne pas confondre avec le daemon de greylisting d'OpenBSD).
Dans la première configuration présentée, chaque utilisateur exécutait spamassassin dans son .procmailrc. Chaque utilisateur maintenait donc ses propres bases de connaissances de spam et de ham. L'idée dans cette nouvelle configuration est de mutualiser ces bases de connaissances.
Procmail
Au lieu d'exécuter la commande spamassasin par chaque utilisateur, nous allons utiliser le daemon spamd. Les mails sont transmis pour analyse à spamd via le client spamc.
Créer le fichier /etc/procmailrc
procmail(1) recherche, dans l'ordre, ses règles dans les fichiers /etc/procmailrc puis $HOME/.procmailrc.
Créer comme suit le fichier /etc/procmailrc :
#/etc/procmailrc # initial global rcfile # see procmail(1) and procmailrc(5) PATH=/bin:/usr/bin:/usr/local/bin DROPPRIVS=yes ## Spam Filtering # All messages go through SpamAssassin :0fw * < 256000 | /usr/local/bin/spamc #EOF
Modifier le fichier $HOME/.procmailrc
Il faut maintenant supprimer l'appel à spamassassin des fichiers $HOME/.procmailrc :
#$HOME/.procmailrc MAILDIR=$HOME/mail DEFAULT=$MAILDIR/Inbox #LOGFILE=$HOME/procmail.log # ## Spam Filtering # # All mail tagged as spam (eg. with a score higher than the set threshold) # is moved to "spam" mailbox. :0: * ^X-Spam-Status: Yes $MAILDIR/spam # ## procmail rules # # Autres règles de procmail ci-dessous.
spamd
spamd est la version daemon de spamassassin. Les utilisateurs passent les mails pour marquage au daemon spamd via la commande spamc. spamd lit sa configuration dans le fichier /etc/mail/spamassassin/local.cf. Il peut en outre, accepter des arguments lors de son lancement.
Les paragraphes ci-dessous présentent comment configurer spamd.
Créer un utilisateur dédié
Dans notre maquette, le daemon spamd s'exécute sous l'identité d'un utilisateur dédié : _spamdaemon. Pour créer cet utilisateur, procédez comme suit :
# useradd -m -c "SpamAssassin Daemon" -b "/var/spool/spamdaemon" \ -s /sbin/nologin -u 506 -g =uid _spamdaemon
Fixez les permissions du répertoire d'accueil de ce pseudo-utilisateur :
# chown root:_spamdaemon /var/spool/spamdaemon # chmod 710 /var/spool/spamdaemon
Répertoire de travail de spamd
Durant son fonctionnement, spamd apprend ce qu'est un spam ou un courrier valide. Pour cela, il stocke des informations dans le répertoire ~/.spamassassin. Dans cette maquette, spamd s'exécute sous l'identité de l'utilisteur _spamdaemon. Il faut donc créer le répertoire .spamassassin dans la HOME de l'utilisateur _spamdaemon.
Pour créer le répertoire de travail de spamd, procédez comme suit :
# cd /var/spool/spamdaemon # mkdir .spamassassin # chown _spamdaemon:_spamdaemon .spamassassin # chmod 700 .spamassassin
Démarrer spamd
Pour démarrer spamd, exécutez la commande suivante :
# /usr/local/bin/spamd -x -l -u _spamdaemon -d
Ajoutez les lignes suivantes au fichier /etc/rc.local pour exécuter spamd à chaque démarrage de la machine :
# Start spamd (SpamAssasin daemon)
if [ -x /usr/local/bin/spamd ]; then echo -n ' spamd' /usr/local/bin/spamd -x -l -u _spamdaemon -d fi
Liens
- L'OpenBSD SpamAssassin mini HowTo :
/usr/local/share/doc/SpamAssassin/OpenBSD-SpamAssassin-mini-howto.html