Installer une passerelle anti-spam avec Bogofilter et Postfix
Auteur : Olivier BOYER - oboyer () ajoute ! org
Mots clés
bogofilter, postfix, server-side, anti-spam, théorème de Bayes, spam, ham, OpenBSD
Introduction
Ce document présente comment configurer un système anti-spam pour tous les utilisateurs avec bogofilter et postfix sur un système OpenBSD 3.9.
bogofilter
, contrairement à d'autres mécanismes de lutte anti-spam, est exécuté généralement par l'utilisateur final, et non pas par le serveur de mails central. Le produit est un programme qui ne s'exécute pas en mode daemon
.
Alors, pourquoi, dans cette maquette, choisir ce produit et l'exécuter du côté serveur ?
bogofilter
, écrit en langage C, est très rapide et consomme peu de ressources matérielles (temps processeur, mémoire vive) contrairement à SpamAssassin. Il permet donc de configurer un système anti-spam sur des machines anciennes. De plus bogofilter
s'avère très efficace et facile à maintenir. Enfin bogofilter
dispose d'un mécanisme d'auto-apprentissage bayésien.
Présentation de la maquette
Les éléments suivants sont mis en oeuvre :
- un système serveur sous OpenBSD 3.9
- un serveur de mails
MTA
: Postfix - un filtre anti-spam : bogofilter
Note
Toutes les commandes présentées ici, sont à exécuter, sauf mention contraire, en tant qu'administrateur de la machine.
Pré-requis
- Le système OpenBSD installé et fonctionnel.
- Le serveur de mails Postfix installé, et fonctionnel.
- Une mailbox bien garnie de courriers désirés.
- Une mailbox bien garnie de courriers non désirés.
Installer bogofilter
Installer le package
Pour installer bogofilter
via les packages binaires d'OpenBSD, exécutez les commandes suivantes :
# PKG_PATH="ftp://ftp.de.openbsd.org/unix/OpenBSD/3.9/packages/i386/" # export PKG_PATH # pkg_add bogofilter-0.92.8p0-db4
Créer un utilisateur dédié
Dans cette maquette, bogofilter
s'exécute sous l'identité d'un utilisateur dédié : _spamdaemon
. Pour créer cet utilisateur, procédez comme suit :
# useradd -m -c "Anti-Spam filtering user" -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
Créer le répertoire de travail de bogofilter
Durant son fonctionnement, bogofilter
apprend ce qu'est un spam ou un courrier valide (ham). Pour cela, il stocke des informations dans le répertoire ~/.bogofilter
. Dans cette maquette, bogofilter
s'exécute sous l'identité de l'utilisateur _spamdaemon
. Il faut donc créer le répertoire .bogofilter
dans la HOME de l'utilisateur _spamdaemon
, ici /var/spool/spamdaemon
.
Pour créer le répertoire de travail de bogofilter
, procédez comme suit :
# cd /var/spool/spamdaemon # mkdir .bogofilter # chown _spamdaemon:_spamdaemon .bogofilter # chmod 700 .bogofilter
Créer le répertoire temporaire de bogofilter
:
# cd /var/spool/spamdaemon # mkdir tmp # chown _spamdaemon:_spamdaemon tmp # chmod 750 tmp
Configurer bogofilter
bogofilter
lit sa configuration dans le fichier /etc/bogofilter.cf
. Le package bogofilter
d'OpenBSD est livré avec un exemple de fichier de configuration. Nous utilisons ce fichier d'exemple comme base de configuration.
Pour copier le fichier d'exemple, procédez comme suit :
# cp /usr/local/share/examples/bogofilter/bogofilter.cf.example /etc/bogofilter.cf
Modifiez les paramètres suivants du fichier /etc/bogofilter.cf
:
bogofilter_dir=/var/spool/spamdaemon/.bogofilter spam_header_name=X-Spam-Status spam_subject_tag=*****SPAM***** unsure_subject_tag=???UNSURE???
Apprentissage de bogofilter
bogofilter
est maintenant installé et configuré. Il est temps de commencer à lui apprendre la différence entre un courrier désiré (ham
) et un courrier non désiré (spam
).
Modifiez le shell de l'utilisateur _spamdaemon
pour pouvoir s'authentifier sous son identité et ainsi créer la base de mots clés :
# chsh -s /bin/ksh _spamdaemon # chown _spamdaemon ~_spamdaemon
Débuter l'apprentissage de bogofilter
sous l'identité de l'utilisateur _spamdaemon
:
# su - _spamdaemon $ $ bogofilter -s < /path/to/spam.mbx $ bogofilter -n < /path/to/nonspam.mbx $ $ exit
Repositionnez le shell du pseudo-utilisateur _spamdaemon
:
# chsh -s /sbin/nologin _spamdaemon # chown root ~_spamdaemon
Intégrer bogofilter et postfix
Schéma de l'architecture
Voici le schéma de l'architecture anti-spam mis en oeuvre :
....................................... : Postfix : ----->smtpd \ : : -pre-cleanup-\ /local----> ---->pickup / -queue- : : -cleanup-/ | \smtp-----> : bounces/ ^ v : : and locally | v : : forwarded | pipe : : messages | | : ...........................|........... ^ | | v ............|............................... : | bogofilter : : | : : sendmail : ............................................
Créer le script shell
Comme présenté en introduction, bogofilter
ne fonctionne pas en mode daemon. Pourqu'il puisse collaborer avec postfix
il faut créer un shell scipt, appelé par le daemon pipe(8)
de postfix
. Ainsi bogofilter
accepte en entrée un message non classifié, le traite, et retrourne le message classifié. Il faut alors le renvoyer à postfix
. Ce travail est réalisé par le binaire sendmail
de postfix
.
Créez le script shell bogofilter.sh
comme suit :
#!/bin/sh #bogofilter.sh # # Funtion : Tag mail as spam or ham using bogofilter and postfix # Input : an unfiltered mail delivred by Postfix'pipe(8) daemon # : sender and recipient names ('$@') # Output : a classified mail, sent back to Postfix via sendmail(1) command # This script is based on "doc/integrating-with-postfix" given with bogofilter. # Author : David Relson <relson_at_osagesoftware_dot_com> # : Matthias Andree <matthias.andree_at_gmx_dot_de> # Updater : Olivier BOYER <olive_at_ajoute_dot_org> (Aug 2006) IFS=' ' PATH='' export PATH IFS FILTER='/usr/local/bin/bogofilter -p -u -e' FILTER_DIR='/var/spool/spamdaemon' TMPDIR="$FILTER_DIR/tmp" #'-G' option disables address rewriting of message headers. #'-i' option says don't stop reading input when a line contains "." only. POSTFIX='/usr/sbin/sendmail -G -i' MKTEMP=/usr/bin/mktemp RM=/bin/rm EX_TEMPFAIL=75 # Exit codes from <sysexits.h> cd $FILTER_DIR || \ { echo $FILTER_DIR does not exist; exit $EX_TEMPFAIL; } # Generate a temporary message file msg=`$MKTEMP $TMPDIR/bogofilter.XXXXXXXXXX` || exit $EX_TEMPFAIL # Clean up when done or when aborting. trap "$RM -f $msg ; exit $EX_TEMPFAIL" 0 1 2 3 15 # bogofilter -e returns: 0 for OK, nonzero for error $RM -f $msg || exit $EX_TEMPFAIL # Filter mail $FILTER > $msg || exit $EX_TEMPFAIL exec <$msg || exit $EX_TEMPFAIL $RM -f $msg # safe, we hold the file descriptor # Give it back to Postfix exec $POSTFIX "$@" exit $EX_TEMPFAIL #EOF
Créer le répertoire pour accueillir le script
Le script shell bogofilter.sh
est stocké dans le répertoire /var/spool/spamdaemon/bin
.
Pour créer ce répertoire, exécutez les commandes suivantes :
# mkdir /var/spool/spamdaemon/bin # chown root:_spamdaemon /var/spool/spamdaemon/bin # chmod 710 /var/spool/spamdaemon/bin
Copier le script dans le répertoire
Copiez, comme suit, le script bogofilter.sh
dans le répertoire :
# cp bogofilter.sh /var/spool/spamdaemon/bin # chown root:_spamdaemon /var/spool/spamdaemon/bin/bogofilter.sh # chmod 750 /var/spool/spamdaemon/bin/bogofilter.sh
Modifier la configuration de postfix
La modification de configuration de postfix
ci-dessous transmet les mails reçus par le MTA à bogofilter
(via le script bogofilter.sh
) pourque ce dernier classifie les mails.
Modifiez comme suit le fichier /etc/postfix/master.cf
.
Remplacez la ligne :
smtp inet n - y - - smtpd
par la ligne :
smtp inet n - y - - smtpd -o content_filter=bogofilter
Puis, ajoutez les lignes suivantes à la fin du fichier /etc/postfix/master.cf
:
bogofilter unix - n n - - pipe flags=R user=_spamdaemon:_spamdaemon argv=/var/spool/spamdaemon/bin/bogofilter.sh -f ${sender} -- ${recipient}
Enfin, redémarrez le serveur postfix
pour prendre en compte les modifications de configuration :
# postfix stop # postfix start
Suivre les évolutions du script
Le système OpenBSD offre la possibilité de suivre les évolutions de configuration de certains fichiers “sensibles” du système (via la crontab insecurity
). Pour suivre les évolutions du script bogofilter.sh
, il faut ajouter le chemin complet du script au fichier /etc/changelist
.
Procédez comme suit :
# echo "/var/spool/spamdaemon/bin/bogofilter.sh" >> /etc/changelist