[Accueil] alex / doc / spamassassin


Filtrage du courrier électronique avec spamassassin, spambayes, procmail et exim sur Debian Woody

$Revision: 1.14 $
$Date: 2004/01/19 10:15:39 $

Introduction

L'utilitaire spamassassin permet d'identifier automatiquement une bonne partie des messages publicitaires (ou spams) en soumettant les courriers entrants à une batterie de tests. Chaque test augmente ou réduit la présomption de « spamitude ». Lorsqu'un seuil est atteint, le message est considéré comme suspect et est marqué.

Pour améliorer le taux d'interception des spams, j'utilise également spambayes. Cet utilitaire est un filtre bayesien qui calcule la fréquence des mots dans deux corpus, les bons messages et les spams, pour identifier les spams parmi les messages ultérieurs. Un en-tête est ajouté aux messages incriminés. Le logiciel distingue trois catégories : ham (bons messages), spam (pubs) et unsure (messages incertains).

Les messages marqués peuvent être automatiquement redirigés vers une boîte aux lettres secondaire ou être refiltrés ultérieurement dans un logiciel de messagerie comme Eudora. Dans cet exemple, nous allons marquer les spams et rediriger vers une boîte aux lettres secondaires les messages comportant une pièce jointe suspecte (.exe ou .pif, par exemple).

Licence

Copyright 2002-2004 Alexandre Ratti. Document diffusé dans les conditions des licences GPL 2 (GNU General Public License) et GFDL 1.2 (GNU Free Documentation License). [Explications]

Installation de spamassassin et de procmail

Contexte : cet exemple décrit comment filtrer les messages de l'utilisateur alex. Le serveur de courrier électronique utilise Debian GNU/Linux 3.0 (alias Woody). Les messages sont récupérés sur le serveur POP du fournisseur d'accès avec fetchmail. Fetchmail les transmet à exim qui les écrit dans le fichier /var/mail/alex. Les messages sont ensuite accessibles depuis les postes du réseau local via qpopper ou imapd.

Trajet des messages : serveur POP du FAI => fetchmail => exim => /var/mail/alex => qpopper/imapd => client de messagerie sur un poste du réseau local.

Procmail et spamassassin vont intervenir juste avant l'écriture des messages entrants dans /var/mail/alex.

  1. En qualité de root, installez les paquets spamassassin et procmail (disponibles dans Debian/stable).

    apt-get update && apt-get install spamassassin procmail

  2. Créez un utilisateur non privilégié qui sera utilisé par le démon de spamassassin, spamd. Dans cet exemple, l'utilisateur s'appelle spamd.

    adduser --disabled-login --system --group spamd

  3. Créez le dossier /home/spamd/.spamassassin/ et vérifiez que l'utilisateur spamd a le droit d'y écrire des fichiers. Ce dossier est utilisé par le démon spamd pour stocker des fichiers quand la fonction de liste blanche automatique est activée.

  4. Dans /etc/default/spamassassin, modifiez les deux variables suivantes :

    ENABLED=1
    OPTIONS="-u spamd -S -a"


    La première permet d'activer l'utilisation du démon spamd, qui accélère le traitement des messages. La seconde permet a) d'exécuter spamd sous une identité non privilégiée (-u), b) d'interrompre le test d'un message (-S) dès que sa spamitude est établie, pour réduire la charge du serveur, et c) d'activer la création d'une liste blanche automatique (-a) ; avec cette fonction, les messages que vous recevez de vos correspondants habituels risquent moins d'être pris pour du spam.

  5. Lancez le démon de spamassassin et arrêtez temporairement fetchmail, pour ne pas risquer de perdre des messages pendant les tests.

    /etc/init.d/spamassassin start
    /etc/init.d/fetchmail stop

  6. Sous l'identité alex, placez la ligne suivante (guillemets compris) dans le fichier /home/alex/.forward :

    "|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #alex"

  7. Placez le code suivant dans le fichier /home/alex/.procmailrc :

    :0fw
    | /usr/bin/spamc

    spamc est un client spamassassin qui transmet au démon spamd les messages à tester.

  8. Pour permettre à l'utilisateur de personnaliser les opérations de spamassassin, effectuez les opérations suivantes :

    mkdir /home/alex/.spamassassin
    cp /etc/spamassassin/user_prefs.template /home/alex/.spamassassin/user_prefs

    Ce fichier doit être lisible par l'utilisateur spamd.

  9. Faites des tests en vous envoyant des spams évidents et des messages normaux. Tous les messages normaux qui arrivent sur ce compte doivent comporter des en-têtes supplémentaires. Exemples :

    X-Spam-Status: No, hits=0.6 required=5.0 tests=NO_REAL_NAME version=2.20
    X-Spam-Level:

    Les spams identifiés comprennent les en-têtes :

    X-Spam-Status: Yes, hits=5.9 required=5.0 tests=PLING,GREAT_OFFER,LINES_OF_YELLING,UNSUB_PAGE version=2.20
    X-Spam-Flag: YES
    X-Spam-Level: *****

    La mention *****SPAM***** est ajoutée dans la ligne de sujet. Ces modifications sont paramétrables dans les fichiers /etc/spamassassin/local.cf (global) et /home/alex/.spamassassin/user_prefs (local).

    Le démon spamd écrit des informations dans le journal du système :

    grep spamd /var/log/syslog

    Jan 1 15:27:11 p100 spamd[2599]: connection from localhost [ 127.0.0.1 ] at port 4372
    Jan 1 15:27:13 p100 spamd[3911]: clean message (0.0/5.0) for alex:105 in 2 seconds.
    Jan 1 16:03:02 p100 spamd[2599]: connection from localhost [ 127.0.0.1 ] at port 4449
    Jan 1 16:03:03 p100 spamd[3968]: identified spam (5.2/5.0) for alex:105 in 1 seconds.


  10. Vous pouvez maintenant redémarrer fetchmail :

    /etc/init.d/fetchmail start

  11. Vous pouvez intercepter en local les spams avant qu'ils n'arrivent dans /var/mail/alex en créant une boîte aux lettres supplémentaires et en ajoutant un filtre dans /home/alex/.procmailrc :

    touch /home/alex/Mail/spam

    Filtre à ajouter dans .procmailrc :

    :0:
    * ^X-Spam-Status: Yes.*
    $HOME/Mail/spam

Ajout de spambayes pour améliorer le filtrage

[2003-08-09] Spambayes n'est pas encore disponible dans Debian/stable, nous allons donc l'installer à partir des sources. Ce logiciel, écrit en Python, ne nécessite pas de compilation.

  1. En qualité de root, installez Python 2.2 si nécessaire :

    apt-get install python2.2

  2. Vérifiez quelle sous-version de Python est installée :

    python -V

    Si la version annoncée est antérieure à la 2.2.2, vous devez installer la dernière version du paquet email. Téléchargez-la sur le site http://mimelib.sourceforge.net/ et installez-la :

    tar -zxvf email-2.5.tar.gz
    cd email-2.5
    python setup.py install

    Le paquet email est installé dans /usr/lib/python2.2/site-packages/. Dans la foulée, nous allons renommer l'ancien paquet email diffusé avec le paquet python2.2 pour qu'il ne soit pas utilisé par l'interpréteur Python :

    mv /usr/lib/python2.2/email /usr/lib/python2.2/email_old

    Pour vérifier que Python utilise la bonne version du paquet :

    python
    import email
    print email.__version__

    J'obtiens : 2.5

    Remarque : quand vous tapez python, si la version qui se lance est antérieure à la 2.2, il est possible que la commande python soit un liens symbolique qui pointe vers une version plus ancienne. Pour vérifier, tapez :

    ls -l `which python`

    J'obtiens :

    lrwxrwxrwx 1 root root 18 avr 26 19:45 /usr/bin/python -> /usr/bin/python2.2

    Le cas échéant, recréez le lien symbolique (ln -s) pour le faire pointer vers la bonne version de Python.

  3. Téléchargez Spambayes sur le site http://spambayes.sourceforge.net/ et installez-le :

    tar -zxvf spambayes-1.0a4.tar.gz
    cd spambayes-1.0a4
    python setup.py install

  4. En utilisant un compte normal (alex, dans mon cas), créez la base de données de Spambayes :

    cd /home/alex
    hammiefilter.py -n

  5. Entraînez le filtre en lui faisant renifler deux séries de messages : des bons messages (ham ci-dessous) et des pubs (spam). Si vos messages ne sont pas stockés sur le serveur Linux, préparez deux boîtes aux lettres contenant en gros le même nombre de messages.

    mboxtrain.py -d $HOME/.hammiedb -g $HOME/Mail/ham
    mboxtrain.py -d $HOME/.hammiedb -s $HOME/Mail/spam

    spambayes lit les messages et leur ajouter un en-tête qui lui permet de les reconnaitre ultérieurement :

    X-Spambayes-Trained: spam

    Profitez-en pour créer un script qui sera utilisé pour actualiser régulièrement la base de données. Exemple à adapter.

  6. Créez la boîte aux lettres dans laquelle seront envoyés les messages douteux.

    touch ~/Mail/unsure

  7. Ajoutez les règles de filtrage à la fin du fichier .procmailrc :

    :0fw
    | /usr/bin/hammiefilter.py

    :0:
    * ^X-Spambayes-Classification: spam
    $HOME/Mail/spam

    :0:
    * ^X-Spambayes-Classification: unsure
    $HOME/Mail/unsure

  8. Planifiez la mise à jour de la base de données dans votre crontab :

    crontab -e

    15 6 * * * $HOME/update-spambayes-db.sh > /dev/null

Fonctionnement : les messages vont être filtrés par Spamassassin, puis par Spambayes. Les spams identifiés par l'un des deux logiciels sont placés dans ~/Mail/spam. Les messages douteux repérés par Spambayes vont dans ~/Mail/unsure. Vérifiez de temps en temps le contenu de ces deux dossiers et déplacez les messages mal classés. Placez les messages de la boîte unsure dans ham ou dans spam selon leur nature. La base de données est actualisée en conséquence, ce qui permet d'améliorer de jour en jour la précision du classement.

Interception des pièces jointes suspectes

Nous allons ajouter une règle permettant d'intercepter les messages comportant des pièces jointes suspectes et de les placer dans un boîte aux lettres à consulter localement.

  1. Créez un fichier qui servira de boîte aux lettres secondaire.

    touch /home/alex/Mail/messages_louches

  2. Dans le fichier /home/alex/.procmailrc, ajoutez le code suivant (les crochets contiennent un espace et une tabulation) :

    EXTLIST="exe|scr|com|bat|js|vbs|pif|dot|dll|shs|vba"
    :0 HBhb:
    *$ ^Content-Type:(.|$[ ])*name=.*\.($EXTLIST).*
    $HOME/Mail/messages_louches


    Remarque : cette règle permet d'intercepter touts les messages contenant une pièce jointe suspect, y compris ceux envoyés avec certains logiciels (comme Mozilla 1.2.1 et Netscape Communicator 4.7) qui insèrent un saut de ligne dans les en-têtes Content-Type et Content-Disposition :

    Content-Type: application/x-msdownload;
    name="test.exe"
    Content-Transfer-Encoding: base64
    Content-Disposition: inline;
    filename="test.exe"

  3. Faites un test en vous envoyant un message avec une pièce jointe en .exe, par exemple. Il devrait être redirigé vers /home/alex/Mail/messages_louches et ne pas arriver dans /var/mail/alex.

    ls -l /home/alex/Mail/messages_louches

  4. Les messages stockés dans cette boîte aux lettres peuvent être lus de temps à autre avec mutt :

    apt-get install mutt
    mutt

    c (changer de boîte aux lettre)
    ? (afficher la liste des boîtes aux lettres)

Simplication du trajet des messages

Trajet actuel des messages entrants : serveur POP du FAI => fetchmail => exim => procmail => spamassassin => procmail => /var/mail/alex => qpopper => client de messagerie sur un poste du réseau local.

Avec ce paramétrage, procmail n'est appelé que si le dossier de l'utilisateur contient un fichier .forward. Dans le cas contraire, les messages sont écrits directement dans /var/mail/nom_utilisateur sans filtrage.

Pour simplifier, vous devriez pouvoir éliminer exim. Fetchmail transmet alors directement les messages à procmail pour filtrage et distribution.

Remarque : je n'ai pas testé ce scénario.

Modifications à faire, d'après les docs consultées :

  1. Dans /etc/fetchmailrc, ajoutez la ligne :

    mda "/usr/bin/procmail -Y -d %T"

  2. Le fichier /home/alex/.forward ne devrait pas être nécessaire.

    mv /home/alex/.forward /home/alex/_forward

  3. Faites des tests.

Documentation

Procmail

Spamassassin

Spam en général

Spambayes et les filtres bayesiens


$Id: index.html,v 1.14 2004/01/19 10:15:39 alex Exp $
http://www.gabuzomeu.net/alex/doc/spamassassin/index.html
courrier électronique | e-mail  Alexandre Ratti