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.
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
.
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
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 linux 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/gpg 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 903765 dbg: channel: current version is 903765, new version is 903765, skipping channel dbg: diag: updates complete, exiting with code 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. |
|
Les transferts de jeux de règles sont signés pour éviter les falsifications. |
|
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. |
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.
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()
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.
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]