$Revision: 1.14 $
$Date: 2004/01/19 10:15:39 $
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).
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]
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.
En qualité de root, installez les paquets spamassassin
et procmail (disponibles dans Debian/stable).
apt-get update && apt-get install spamassassin procmail
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
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.
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.
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
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"
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.
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.
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).
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.Vous pouvez maintenant redémarrer fetchmail :
/etc/init.d/fetchmail start
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
[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.
En qualité de root, installez Python 2.2 si nécessaire :
apt-get install python2.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_oldPour vérifier que Python utilise la bonne version du paquet
:
pythonJ'obtiens :
import email
print email.__version__
2.5Remarque : 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.
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
En utilisant un compte normal (alex, dans mon cas), créez la base
de données de Spambayes :
cd /home/alex
hammiefilter.py -n
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.
Créez la boîte aux lettres dans laquelle seront envoyés
les messages douteux.
touch ~/Mail/unsure
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
crontab :crontab -e
15 6 * * * $HOME/update-spambayes-db.sh > /dev/nullFonctionnement : 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.
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.
Créez un fichier qui servira de boîte aux lettres secondaire.
touch /home/alex/Mail/messages_louches
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"
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
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)
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 :
Dans /etc/fetchmailrc, ajoutez la ligne :
mda "/usr/bin/procmail -Y -d %T"
Le fichier /home/alex/.forward ne devrait pas être nécessaire.
mv /home/alex/.forward /home/alex/_forward
$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