4. La lutte contre les pourriels

L'outil de lutte contre les pourriels (spams) le plus répandu dans le monde du logiciel libre est spamassassin. Son mode de fonctionnement se rapproche de celui du service amavisd-new. Il collecte les résultats obtenus par une collection d'autres outils et les transmet au service amavisd-new qui prend la décision sur le message en fonction du score total obtenu par celui-ci.

Du point de vue système, la mise en oeuvre de spamassassin est très simple. Il suffit de s'appuyer sur le paquet Debian/testing qui est très bien maintenu. Cette situation est d'autant plus intéressante que la collection des bibliothèques et des outils dépendants de spamassassin est très volumineuse. La commande $ apt-cache show spamassassin liste ces dépendances.

4.1. La configuration de spamassassin

Il faut distinguer 2 niveaux pour la configuration de cet outil.

  • À l'échelle du système, le répertoire /etc/spamassassin contient les fichiers de configuration communs à l'ensemble des utilisateurs.

  • Pour l'utilisateur amavis, le répertoire .spamassassin situé sous le répertoire personnel de l'utilisateur contient les fichiers de configuration dédiés ainsi que les bases de données constituées en cours d'exécution : liste blanche automatique, jetons de calcul, etc..

Comme dans les scénarios décrits dans ce document, le système sur lequel sont installés les outils est un serveur passerelle dédié au traitement du courrier électronique, tous les paramètres de configuration seront dans le répertoire général /etc/spamassassin et toutes les bases de données seront dans le répertoire /var/lib/amavis/.spamassassin.

4.1.1. Le fichier de configuration principal

Le fichier local.cf regroupe les options principales du service. Voici un exemple de paramètres adaptés à l'exploitation d'une passerelle de courrier électronique. En plus des paramètres propres à spamassassin, on y trouve des éléments de sélection des outils complémentaires.

# cat /etc/spamassassin/local.cf
# This is the right place to customize your installation of SpamAssassin.
#
# See 'perldoc Mail::SpamAssassin::Conf' for details of what can be
# tweaked.
#
# Only a small subset of options are listed below
#
###########################################################################

dns_available yes

whitelist_from  root@MailGw
whitelist_from  amavis@MailGw
whitelist_from  logcheck@MailGw

# Enable the Bayes system
use_bayes              1
bayes_auto_expire      0
bayes_learn_to_journal 1
bayes_journal_max_size 0
bayes_path /var/lib/amavis/.spamassassin/bayes

use_auto_whitelist     1

# Text to prepend to subject if rewrite_subject is used
add_header all Report _REPORT_

# DCC
use_dcc 1
dcc_timeout 8

# Razor
use_razor2 1
razor_timeout 8

# Pyzor
use_pyzor 1

## Optional Score Increases
score DCC_CHECK 4.500
score SPF_FAIL 10.000
score SPF_HELO_FAIL 10.000
score RAZOR2_CHECK 2.500
score RAZOR2_CF_RANGE_51_100 3.500
score BAYES_99 5.300
score BAYES_95 4.500
score BAYES_80 3.500
score BAYES_60 2.500
score BAYES_50 2.000

# p0f
header L_P0F_WXP   X-Amavis-OS-Fingerprint =~ /^Windows XP/
score  L_P0F_WXP   3.5
header L_P0F_W     X-Amavis-OS-Fingerprint =~ /^Windows(?! XP)/
score  L_P0F_W     1.7
header L_P0F_UNKN  X-Amavis-OS-Fingerprint =~ /^UNKNOWN/
score  L_P0F_UNKN  0.8
header L_P0F_Unix  X-Amavis-OS-Fingerprint =~ /^((Free|Open|Net)BSD|Solaris|HP-UX|Tru64)/
score  L_P0F_Unix  -1.0

4.2. La mise à jour des jeux de règles de spamassassin

La pondération des champs d'un message électronique est basée sur des jeux de règles prédéfinies. Comme de nouveaux styles de pourriels apparaissent constamment, il est nécessaire de mettre à jour ces règles périodiquement.

Le paquet spamassassin fournit un outil dédié à cette tâche : sa-update. L'option -D de debugging affiche les informations intermédiaires du traitement.

# sa-update -D
dbg: logger: adding facilities: all
dbg: logger: logging level is DBG
dbg: generic: SpamAssassin version 3.3.0
dbg: generic: Perl 5.010001, PREFIX=/usr, \
     DEF_RULES_DIR=/usr/share/spamassassin, \
     LOCAL_RULES_DIR=/etc/spamassassin, \
     LOCAL_STATE_DIR=/var/lib/spamassassin
dbg: config: timing enabled
dbg: config: score set 0 chosen.
dbg: dns: is Net::DNS::Resolver available? yes
dbg: dns: Net::DNS version: 0.65
dbg: generic: sa-update version svn897929
dbg: generic: using update directory: /var/lib/spamassassin/3.003000
dbg: diag: perl platform: 5.010001 linux1
dbg: diag: [...] module installed: Digest::SHA1, version 2.12
dbg: diag: [...] module installed: HTML::Parser, version 3.64
dbg: diag: [...] module installed: Net::DNS, version 0.65
dbg: diag: [...] module installed: NetAddr::IP, version 4.024
dbg: diag: [...] module installed: Time::HiRes, version 1.9719
dbg: diag: [...] module installed: Archive::Tar, version 1.52
dbg: diag: [...] module installed: IO::Zlib, version 1.09
dbg: diag: [...] module installed: Digest::SHA1, version 2.12
dbg: diag: [...] module installed: MIME::Base64, version 3.08
dbg: diag: [...] module installed: DB_File, version 1.82
dbg: diag: [...] module installed: Net::SMTP, version 2.31
dbg: diag: [...] module installed: Mail::SPF, version v2.007
dbg: diag: [...] module installed: IP::Country::Fast, version 604.001
dbg: diag: [...] module installed: Razor2::Client::Agent, version 2.84
dbg: diag: [...] module installed: Net::Ident, version 1.20
dbg: diag: [...] module installed: IO::Socket::INET6, version 2.54
dbg: diag: [...] module installed: IO::Socket::SSL, version 1.31
dbg: diag: [...] module installed: Compress::Zlib, version 2.022
dbg: diag: [...] module installed: Mail::DKIM, version 0.37
dbg: diag: [...] module installed: DBI, version 1.609
dbg: diag: [...] module installed: Getopt::Long, version 2.38
dbg: diag: [...] module installed: LWP::UserAgent, version 5.834
dbg: diag: [...] module installed: HTTP::Date, version 5.831
dbg: diag: [...] module installed: Encode::Detect, version 1.01
dbg: gpg: Searching for 'gpg'
dbg: util: current PATH is: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
dbg: util: executable for gpg was found at /usr/bin/gpg
dbg: gpg: found /usr/bin/gpg2
dbg: gpg: release trusted key id list: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
dbg: channel: attempting channel updates.spamassassin.org
dbg: channel: update directory /var/lib/spamassassin/3.003000/updates_spamassassin_org
dbg: channel: channel cf file /var/lib/spamassassin/3.003000/updates_spamassassin_org.cf
dbg: channel: channel pre file /var/lib/spamassassin/3.003000/updates_spamassassin_org.pre
dbg: channel: metadata version = 903765
dbg: dns: 0.3.3.updates.spamassassin.org => 903765, parsed as 9037653
dbg: channel: current version is 903765, new version is 903765, skipping channel
dbg: diag: updates complete, exiting with code 1

1

Le traitement débute par une vérification de la liste des bibliothèques et outils nécessaires à l'exploitation des jeux de règles de spamassassin.

2

Les transferts de jeux de règles sont signés pour éviter les falsifications.

3

Les champs TXT du serveur de noms de domaines DNS sont utilisés pour véhiculer les informations de version des jeux de règles. Dans l'exemple, la version sur le serveur distant est identique à celle présente localement 473378. Il n'est donc pas nécessaire de télécharger les fichiers de règles de pondération.

4.3. Les calculs distribués avec Pyzor et Razor

[Note] Note

Si les outils présentés dans cette section n'occupent pas le «devant de la scène» en matière de lutte contre les pourriels, ils n'en sont pas moins essentiels au bon fonctionnement d'une passerelle de courrier électronique digne de ce nom. Après plus de cinq ans d'exploitation, on peut affirmer qu'ils contribuent efficacement aux calculs délivrés par spamassassin et donc aux décisions prises par le service amavisd-new.

Les deux outils Pyzor et Razor appartiennent à la même catégorie. Ce sont des réseaux collaboratifs de partage de signatures de spams en cours de propagation. Les signatures peuvent être assimilées à des sommes de contrôle (checksums) calculées à partir d'éléments clés du message de courrier électronique. Les utilisateurs du réseau contribuent au catalogue en transmettant les sommes de contrôles pour les messages qu'ils émettent et exploitent les calculs stockés dans le catalogue partagé lorsqu'ils reçoivent les messages.

Ces deux outils peuvent être utilisés de façon autonome mais ce n'est pas la solution retenue dans notre cas. Avec spamassassin, les résultats obtenus à partir des sommes de contrôle sont intégrés dans le calcul global qui sert à déterminer si un courrier est un pourriel ou non. Pyzor et Razor constituent donc des sources d'alimentation supplémentaires pour spamassassin.

Voici une présentation de l'installation et de la configuration de ces trois outils dans le contexte du service amavisd-new.

4.3.1. Pyzor

On débute par l'installation du paquet et le contrôle de sa version.

$ aptitude search 'pyzor'
i   pyzor  - spam-catcher using a collaborative filtering network

Une fois le paquet installé, la configuration doit être appliquée à l'utilisateur amavis.

# su amavis -c 'pyzor discover'
downloading servers from http://pyzor.sourceforge.net/cgi-bin/inform-servers-0-3-x
# cat /var/lib/amavis/.pyzor/servers
public.pyzor.org:24441

Le service étant configuré, on peut contrôler la disponibilité du serveur de distribution du catalogue des sommes de contrôle.

# su amavis -c 'pyzor ping'
public.pyzor.org:24441  (200, 'OK')

Avec la version courante du paquet Debian, un message d'alerte apparaît à chaque exécution. Ce message rend l'outil inopérant.

pyzor: failure to parse response
"/usr/lib/pymodules/python2.6/pyzor/__init__.py:11: DeprecationWarning: the sha
module is deprecated; use the hashlib module instead"

Pour contourner le problème, il faut neutraliser les messages d'alerte lors de l'exécution de l'outil. Voici une copie du fichier /usr/bin/pyzor.

#!/usr/bin/python -Wignore::DeprecationWarning

import os
# set umask
os.umask(0077)

import pyzor.client
pyzor.client.run()

4.3.2. Razor

On débute par l'installation du paquet et le contrôle de sa version.

$ aptitude search razor
v   librazor2-perl -
p   posterazor     - splits an image into multiple sheets for assembly into a poster
i   razor          - spam-catcher using a collaborative filtering network

Une fois le paquet installé, il faut distinguer deux niveaux de configuration : système et utilisateur. Dans le cas présent, on doit créer la configuration pour l'utilisateur amavis. Cette étape est plus complexe que pour l'outil précédent.

Au niveau global ou système, on efface la configuration existante de façon à mettre en place une nouvelle configuration.

# rm /etc/razor/razor-agent.conf                          
# razor-admin -create
# cp ~/.razor/razor-agent.conf /etc/razor/

Le fichier de configuration système est modifié pour que les messages émis par l'outil soient journalisés dans un répertoire spécifique dans lequel le service amavisd-new dispose d'un accès en écriture.

# mkdir /var/log/razor
# chown amavis.adm /var/log/razor
# diff -uBb /etc/razor/razor-agent.conf.orig /etc/razor/razor-agent.conf
--- /etc/razor/razor-agent.conf.orig    2011-10-10 22:12:28.000000000 +0200
+++ /etc/razor/razor-agent.conf 2011-10-10 22:10:47.000000000 +0200
@@ -14,7 +14,7 @@
 listfile_catalogue     = servers.catalogue.lst
 listfile_discovery     = servers.discovery.lst
 listfile_nomination    = servers.nomination.lst
-logfile                = razor-agent.log
+logfile                = /var/log/razor/razor-agent.log
 logic_method           = 4
 min_cf                 = ac
 razordiscovery         = discovery.razor.cloudmark.com

Pour éviter une saturation de l'espace de stockage du volume dédié à la journalisation système, on configure la rotation du fichier de journalisation /var/log/razor/razor-agent.log.

# cat /etc/logrotate.d/razor
/var/log/razor/razor-agent.log {
        weekly
        rotate 52
        compress
        nomail
        notifempty
        missingok
        create 640  amavis adm
        }

Au niveau utilisateur, on enregistre le service.

# mkdir /var/lib/amavis/.razor
# chown amavis.amavis /var/lib/amavis/.razor
# su amavis -c 'razor-admin -home /var/lib/amavis/.razor -register'
Register successful.  Identity stored in /var/lib/amavis/.razor/identity-rumyOpNfhL

Le répertoire /var/lib/amavis/.razor/ contient l'ensemble des éléments de la configuration utilisateur.

4.3.3. Tests de fonctionement

Pour qualifier l'utilisation des deux outils, il faut étudier les rapports délivrés par spamassassin.

La première méthode consiste à tester un échantillon de pourriel fourni avec les sources du service amavisd-new.

# su amavis -c 'spamassassin -D </usr/local/src/amavisd-new-2.7.0/test-messages/sample-spam-GTUBE-junk.txt >test-report.txt 2>&1'

Une fois cette commande exécutée, le rapport peut être consulté avec less par exemple. On peut aussi effectuer des recherches de chaînes de caractères avec egrep. Voici un extrait qui montre que les deux outils ont bien été appelés. Seul Pyzor a détecté un spam.

# egrep -i '(pyzor|razor)' test-report.txt
dbg: plugin: loading Mail::SpamAssassin::Plugin::Pyzor from @INC
dbg: pyzor: network tests on, attempting Pyzor
dbg: plugin: loading Mail::SpamAssassin::Plugin::Razor2 from @INC
dbg: razor2: razor2 is available, version 2.84
dbg: config: fixed relative path: /var/lib/spamassassin/3.003001/updates_spamassassin_org/25_pyzor.cf
dbg: config: using "/var/lib/spamassassin/3.003001/updates_spamassassin_org/25_pyzor.cf" for included file
dbg: config: read file /var/lib/spamassassin/3.003001/updates_spamassassin_org/25_pyzor.cf
dbg: config: fixed relative path: /var/lib/spamassassin/3.003001/updates_spamassassin_org/25_razor2.cf
dbg: config: using "/var/lib/spamassassin/3.003001/updates_spamassassin_org/25_razor2.cf" for included file
dbg: config: read file /var/lib/spamassassin/3.003001/updates_spamassassin_org/25_razor2.cf
dbg: razor2: part=0 noresponse
dbg: razor2: results: spam? 0
dbg: razor2: results: engine 8, highest cf score: 0
dbg: razor2: results: engine 4, highest cf score: 0
dbg: util: executable for pyzor was found at /usr/bin/pyzor
dbg: pyzor: pyzor is available: /usr/bin/pyzor
dbg: pyzor: opening pipe: /usr/bin/pyzor check < /tmp/.spamassassin17676Ek7f7Utmp
dbg: pyzor: [17677] finished successfully
dbg: pyzor: got response: public.pyzor.org:24441 (200, 'OK') 304 0
dbg: pyzor: listed: COUNT=304/5 WHITELIST=0
dbg: rules: ran eval rule PYZOR_CHECK ======> got hit (1)
dbg: check: tests=GTUBE,NO_RECEIVED,NO_RELAYS,PYZOR_CHECK
dbg: timing: total 2001 ms - init: 1136 (56.8%), parse: 1.21 (0.1%),
  extract_message_metadata: 21 (1.1%), get_uri_detail_list: 0.49 (0.0%),
  tests_pri_-1000: 7 (0.4%), compile_gen: 107 (5.3%), compile_eval: 21 (1.1%),
  tests_pri_-950: 6 (0.3%), tests_pri_-900: 6 (0.3%), tests_pri_-400: 5 (0.2%),
  tests_pri_0: 743 (37.1%), dkim_load_modules: 23 (1.2%), check_dkim_signature:
  0.45 (0.0%), check_dkim_adsp: 180 (9.0%), check_spf: 30 (1.5%), check_dcc:
  0.21(0.0%), check_razor2: 209 (10.4%), check_pyzor: 80 (4.0%), tests_pri_500:
  56(2.8%), tests_pri_1000: 11 (0.5%), total_awl: 6 (0.3%), check_awl: 0.56
  (0.0%), update_awl: 1.70 (0.1%)
dbg: markup: [...] * 2.0 PYZOR_CHECK Message list=e9 par Pyzor, voir http://pyzor.sf.net/
    NO_RELAYS,PYZOR_CHECK autolearn=no version=3.3.1
    *  2.0 PYZOR_CHECK Message listé par Pyzor, voir http://pyzor.sf.net/

La seconde méthode consiste à consulter les journaux du service amavisd-new en cours de fonctionnement. Voici un exemple de résultat de calcul sur un message dont la nature ne fait aucun doute. On y voit clairement apparaître les coefficients attribués par Pyzor et Razor.

header_edits_for_quar: <xxxxx@xxxxxxxxx.fr> -> <xxxxxxx@xxxxxxxxx.fr>,
Yes, score=48.957 tag=-999 tag2=6.31 kill=6.31
tests=[AV:Sanesecurity.Junk.38228.UNOFFICIAL=0.1, DIGEST_MULTIPLE=0.001,
FROM_IN_TO_AND_SUBJ=3.399, HELO_DYNAMIC_IPADDR2=3.888,
HELO_DYNAMIC_SPLIT_IP=2.893, HTML_IMAGE_ONLY_28=0.726, HTML_MESSAGE=0.001,
INVALID_MSGID=1.167, L_P0F_UNKN=0.8, MIME_HTML_ONLY=1.105,
MIME_QP_LONG_LINE=0.001, MISSING_DATE=1.396, 
MSGID_SHORT=0.337, PYZOR_CHECK=1.985, RAZOR2_CF_RANGE_51_100=0.365,
RAZOR2_CF_RANGE_E8_51_100=2.43, RAZOR2_CHECK=1.729, RCVD_IN_BRBL_LASTEXT=1.644,
RCVD_IN_PBL=3.558, RCVD_IN_SORBS_DUL=0.001, RCVD_IN_XBL=0.724, RDNS_NONE=1.274,
SPF_FAIL=0.919, TO_EQ_FM_DIRECT_MX=0.001, TO_EQ_FM_DOM_SPF_FAIL=0.001,
TO_EQ_FM_HTML_DIRECT=1.753, TO_EQ_FM_HTML_ONLY=0.001, TO_EQ_FM_SPF_FAIL=0.973,
TO_IN_SUBJ=3.899, TVD_RCVD_IP=0.001, URIBL_AB_SURBL=4.499, URIBL_BLACK=1.775,
URIBL_JP_SURBL=1.948, URIBL_WS_SURBL=1.659, X_MAILER_CME_6543_MSN=2.004]