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

Liens

 
doc/openbsd/bogofilter.txt · Dernière modification: 2009/12/23 22:36 (édition externe)     Haut de page