Table des matières

Postfix et SpamAssassin

Mise en place d'un marqueur de SPAM bien connu: SpamAssassin.

Ça ne va pas faire disparaitre les SPAM, mais juste les marquer pour pouvoir ensuite les envoyer a la poubelle ou dans un dossier particulier de son client de mail.

~~READMORE~~

Install

# aptitude install spamassassin

Ce qui installe aussi “spamc” en passant.

spamc

spamc permet de traiter les messages a la volé en s'intégrant dans Postfix , comme un filtre.

spamc devra etre executé en un équivalent de nobody, et avec une home.

:!: UPDATE : Debian Wheezy créé déjà un utilisateur debian-spamd. Voir ici

On va donc créé un modeste utilisateur spamc-nobody :

# adduser spamc-nobody --system --ingroup nogroup --disabled-login

Verifions:

# id spamc-nobody
uid=104(spamc-nobody) gid=65534(nogroup) groupes=65534(nogroup)

Le répertoire /home/spamc-nobody/ sera utilisé par la suite.

On peut modifier la conf de spamc en modifiant le fichier: /etc/spamassassin/spamc.conf

Pour ma part, j'ai ajouté dedans:

# TJ ---------------------
-s 1024000
# ------------------------

… car dans les logs, plus tard, j'ai eu des avertissements comme cela:

Mar 12 00:13:10 mx1 spamc[8725]: skipped message, greater than max message size (512000 bytes)

… et j'ai donc augmenté cette limite.

daemon spamassassin

Activer le daemon dans /etc/default/spamassassin :

# Change to one to enable spamd
# TJ -----------
#ENABLED=0
ENABLED=1
# --------------
...
# TJ -----------
#OPTIONS="--create-prefs --max-children 5 --helper-home-dir"
OPTIONS="--create-prefs --max-children 5 --helper-home-dir --ipv4only"
# --------------
...
# TJ ---------
#CRON=0
CRON=1
# ------------

(Bonus: je désactive ipv6 , c'est mon kiff :-) )

Et puis:

# /etc/init.d/spamassassin restart
:!: Le répertoire /home/spamc-nobody/.spamassassin/ devrait se peupler au fur et a mesure des traitements antispam…

A propos de “CRON=1” , cela va vérifier quotidiennement, et si nécessaire, mettre à jour, les règles anti-spam en peuplant le répertoire /var/lib/spamassassin/.

Pour forcer immédiatement une mise à jour:

# sa-update && /etc/init.d/spamassassin reload

Postfix

Enfin, on va intégrer le filtre “spamassassin” dans Postfix.

Modifier le fichier /etc/postfix/master.cf pour avoir:

# TJ ------------

spamassassin    unix    -       n       n       -       -       pipe
   flags=Rq user=spamc-nobody argv=/usr/bin/spamc -f -e
   /usr/sbin/sendmail -oi -f ${sender} ${recipient}

smtp      inet  n       -       -       -       -       smtpd
        -o content_filter=spamassassin
        -o smtpd_client_connection_count_limit=60
        -o smtpd_authorized_xforward_hosts=127.0.0.0/8

# ---------------

# TJ ----------
#smtp      inet  n       -       -       -       -       smtpd
# -------------

… sans oublier de mettre en commentaire la ligne ci-dessus.

Faire de même pour les entrées submission (port 587) et ssmtp (port 465) , si elles existent dans votre configuration.

Dans main.cf ajouter une ligne comme cela:

spamassassin_destination_recipient_limit = 1

Sinon, lorsque spamc doit traiter beaucoup de destinataire, il va caler avec ce message:

... local configuration error. Command output: Exceeded max number of arguments (24) in /etc/spamassassin/spamc.conf

La limite de “24” est en dur dans le source… et doit être vraisemblablement respecté.

# postfix reload

Dans les logs (entre autres choses):

Mar 16 22:16:07 mx1 spamd[9717]: spamd: connection from localhost [127.0.0.1] at port 60667
Mar 16 22:16:07 mx1 spamd[9717]: spamd: setuid to spamc-nobody succeeded
Mar 16 22:16:07 mx1 spamd[9717]: spamd: creating default_prefs: /home/spamc-nobody/.spamassassin/user_prefs
Mar 16 22:16:07 mx1 spamd[9717]: config: created user preferences file: /home/spamc-nobody/.spamassassin/user_prefs
Mar 16 22:16:07 mx1 spamd[9717]: spamd: processing message <51521011.9050608@free.fr> for spamc-nobody:104
Mar 16 22:16:08 mx1 spamd[9717]: spamd: clean message (0.0/5.0) for spamc-nobody:104 in 1.8 seconds, 847 bytes.
Mar 16 22:16:08 mx1 spamd[9717]: spamd: result: . 0 - FREEMAIL_FROM,RCVD_IN_DNSWL_NONE scantime=1.8,size=847,user=spamc-nobody,uid=104,required_score=5.0,rhost=localhost,raddr=127.0.0.1,rport=60667,mid=<51521011.9050608@free.fr>,autolearn=ham

spamassassin configuration

général

Personnaliser a minima:

Dans /etc/spamassassin/local.cf :

rewrite_header Subject [SPAM]
report_safe 1
trusted_networks <VOTRE_RESEAU>
# Exemple: trusted_networks 192.168.0.
required_score 5.0
ok_languages    fr
ok_locales      all
add_header      all Checker-Version SpamAssassin _VERSION_ (_SUBVERSION_) sur _HOSTNAME_

Dans /etc/spamassassin/v310.pre :

loadplugin Mail::SpamAssassin::Plugin::TextCat
# /etc/init.d/spamassassin reload

bayes

Deja actif par defaut, voir dans /home/spamc-nobody/.spamassassin/ et aussi dans les entêtes des mails.

J'ai quand même ça dans local.cf :

use_bayes 1
bayes_auto_learn 1
bayes_ignore_header X-Bogosity
bayes_ignore_header X-Spam-Flag
bayes_ignore_header X-Spam-Status

construire bayes

Ce n'est pas indispensable car la base se construit toute seule…

Source: http://wiki.apache.org/spamassassin/SiteWideBayesSetup

Trouver une source de “SPAM” et de “HAM” (“pas SPAM”).

Et puis , devenir spamc-nobody :

# su -s /bin/bash spamc-nobody
$ cd ~

Puis faire apprendre le HAM et SPAM:
Le HAM :

$ sa-learn --ham --showdots /<REPERTOIRE_DE_HAM>/
...............................
Learned tokens from 6560 message(s) (6631 message(s) examined)

Le SPAM :

$ sa-learn --spam --showdots /<REPERTOIRE_DE_SPAM>/
...........................................................................
Learned tokens from 40627 message(s) (41956 message(s) examined)

(C'est long: presque 2 heures d'éxécution)

Pour ma part, il s'agit simplement de répertoire “Maildir” assez bien fournit.

:!: Parce que les messages de SPAM avaient déjà été traité , et tagués, par SpamAssassin, j'ai préalablement nettoyé les messages en ne gardant que la pièce jointe du SPAM original…

pyzor

Lien: http://wiki.apache.org/spamassassin/UsingPyzor

# aptitude install pyzor

On va installer pyzor dans l'environnement “spamc-nobody”

# su -s "/bin/bash" spamc-nobody
$ pyzor discover
/usr/lib/pymodules/python2.6/pyzor/__init__.py:11: DeprecationWarning: the sha module is deprecated; use the hashlib module instead
import sha
/usr/lib/pymodules/python2.6/pyzor/client.py:12: DeprecationWarning: the multifile module has been deprecated since Python 2.5
import multifile
downloading servers from http://pyzor.sourceforge.net/cgi-bin/inform-servers-0-3-x

Warnings??
Il n’empêche pas “pyzor” de fonctionner, mais si toutefois vous vouliez faire disparaitre ces warnings, il suffit d’éditer le fichier /usr/bin/pyzor , et de changer la 1er ligne en :

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

Bref. Un repertoire “.pyzor” est créé dans /home/spamc-nobody/

Dans /etc/spamassassin/local.cf :

use_pyzor       1

Verifier aussi le chargement du module dans v310.pre

Et enfin:

# /etc/init.d/spamassassin reload
:!: Ca fonctionne , et ca ne laisse une trace dans les entetes que lorsque “pyzor” a trouvé quelque chose

Exemple:

 1.4 PYZOR_CHECK            Message listé par Pyzor, voir http://pyzor.sf.net/

razor

Lien: http://wiki.apache.org/spamassassin/InstallingRazor?highlight=%28%28UsingRazor%29%29

# aptitude install razor

Lien: http://www.raygibson.net/kb/amavis/

# su -s "/bin/bash" spamc-nobody
$ razor-admin -d -create -home=/home/spamc-nobody/.razor
$ razor-admin -d -register 

Dans local.cf , j'ai :

...
# Razor
use_razor2      1

score RAZOR2_CHECK      2.500

Verifier aussi le chargement du module dans v310.pre

Et enfin:

# /etc/init.d/spamassassin reload

LOG

Soit: traiter les logs

Ajouter le traitement de la rotation des log de /home/spamc-nobody/.razor/razor-agent.log … par exemple dans /etc/logrotate.d/razor :

/var/log/razor-agent.log /home/spamc-nobody/.razor/razor-agent.log {
      weekly
      rotate 3
      compress
      nomail
      notifempty
      missingok
}
Soit: desactiver les logs

Sinon, modifier le fichier /home/spamc-nobody/.razor/razor-agent.conf en mettant:

debuglevel = 0

dcc

N'est pas “opensource” , donc n'est pas installé par defaut !

Il faut installer des trucs !

Pré-requis (squeeze?):

# aptitude install libmilter-dev
$ cd /usr/local/src/
$ wget http://www.rhyolite.com/anti-spam/dcc/source/dcc.tar.Z
$ tar xvzf dcc.tar.Z
$ cd dcc-1.3.144
$ ./configure --disable-dccm
$ make
$ su
# make install

(Sans –disable-dccm, le make echoue)

Le binaire cdcc se retrouve la: /usr/local/bin/cdcc Ainsi que: /usr/local/bin/dccproc

Mais ca ne suffit pas ! Dans /etc/spamassassin/local.cf bien ajouter:

use_dcc         1
add_header      all DCC _DCCB_: _DCCR_

S'il n'y a pas “add_header”, alors bien que le test soit fait, il n'est pas enregistré dans les entêtes.

:!: En fait, ca ne semble pas fonctionner ! avec “spamd” il faut préciser le chemin vers “dccproc” :

# which dccproc
/usr/local/bin/dccproc

et ajouter dans local.cf

dcc_path /usr/local/bin/dccproc

Source: http://wiki.apache.org/spamassassin/UsingDcc

Ne pas oublier d'avoir dans v310.pre :

loadplugin Mail::SpamAssassin::Plugin::DCC
# /etc/init.d/spamassassin reload

un petit test montre dans les entête mails:

X-Spam-DCC: dcc1.aftenposten.no: mail 1215; Body=1 Fuz1=1 Fuz2=1

Ca marche !

LOG

Si vous avez un serveur mail fortement sollicité, vous aurez sans doute le repertoire /var/dcc/log remplit de log (et autres?).

Il faut executer chaque jour le script: /var/dcc/libexec/cron-dccd

Ainsi, dans le cron, ajouter par exemple:

15 2  *  *  *  /var/dcc/libexec/cron-dccd

language

Un peu trop sévere pour les langues etrangeres…

Donc editer le fichier “local.cf” et mettre:

# TextCat
score UNWANTED_LANGUAGE_BODY 0.500

DKIM Perl

Source: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=689414

spamassassin interprete mal les mails signées avec DKIM

Exemple en recevant un mail de “gmail.com” , on voit dans les entêtes:

X-Spam-Status: ... T_DKIM_INVALID

Pour corriger ce problème, il faut installer le package “libmail-dkim-perl” :

# aptitude install libmail-dkim-perl

Et puis bien sur:

# /etc/init.d/spamassassin reload

Un nouvel essai nous montre que ça marche mieux:

X-Span-Status: ... DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU