Postfix et Spamassassin

par julien, juillet 2007

Avez-vous déjà essayer de brancher un serveur mail sur le Net sans configurer d’antispam au préalable ? Je l’ai fait quelques fois, et bas c’est pas triste !!! On arrive vite au point ou checker sa mailbox est un supplice sans nom. La solution c’est de demander à Postfix de soumettre les mails entrants à l’excellent Spamassassin avant de les faire suivre au serveur Imap (enfin, je dit imap, mais ya ptete des sadiques qui utilisent encore pop…).
Spamassassin vite fait bien fait

Les packages qui vont bien sous Debian (Etch ici) sont :

apt-get install spamassassin spamc razor pyzor

Attention, ya du monde qui va s’installer 🙂 Et une fois que c’est fait, il suffit d’aller dans ‘/etc/default/spamassassin’ et de passer la valeur de ENABLED à 1. Une petite relance du serveur, et hop, c’est dans la poche. Spamd est maintenant dans les processus :

root 17989 1 3 19:38 ? 00:00:00 /usr/sbin/spamd –create-prefs –max-children 5 –helper-home-dir -d –pidfile=/var/run/spamd
root 17990 17989 0 19:38 ? 00:00:00 spamd child
root 17991 17989 0 19:38 ? 00:00:00 spamd child

Bon, c’est quand même mieux de le configurer un peu plus précisément, en particulier pour activer l’utilisation des modules Pyzor et Razor (des outils collaboratifs de détections des spams). Pour cela, il faut aller dans ‘/etc/spamassassin/local.cf’ et modifier un peu le fichier. Ci-dessous, le fichier que j’utilise :

# 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
#
###########################################################################

# Add *****SPAM***** to the Subject header of spam e-mails
#
rewrite_header Subject *****SPAM*****

# Save spam messages as a message/rfc822 MIME attachment instead of
# modifying the original message (0: off, 2: use text/plain instead)
#
report_safe 1

# Set which networks or hosts are considered ‘trusted’ by your mail
# server (i.e. not spammers)
#
# trusted_networks 212.17.35.

# Set file-locking method (flock is not safe over NFS, but is faster)
#
lock_method flock

# Set the threshold at which a message is considered spam (default: 5.0)
#
required_score 5.0

# Use Bayesian classifier (default: 1)
#
use_bayes 1

# Bayesian classifier auto-learning (default: 1)
#
bayes_auto_learn 1

# Set headers which may provide inappropriate cues to the Bayesian
# classifier
#
# bayes_ignore_header X-Bogosity
# bayes_ignore_header X-Spam-Flag
# bayes_ignore_header X-Spam-Status

# Enable or disable network checks
skip_rbl_checks 0
use_razor2 1
use_pyzor 1

Désactiver les préférences par utilisateur

Dans /etc/default/spamassassin, il faut changer la ligne d’options pour désactiver les préférences par utilisateur (qui serait normalement stockées dans leur home directory) et utiliser les préférences globales à la place.

On remplace l’option –create-prefs par -x:

# vim /etc/default/spamassassin

[…]

17 #OPTIONS= »–create-prefs –max-children 1 –helper-home-dir »
18 OPTIONS= »-x –max-children 3 –helper-home-dir »

Changer l’utilisateur de spamassassin

Par défaut spamassassin est lancé par Root. On va créer un user spamassassin et lancer le daemon sous ce user.

# useradd spamassassin -d /var/spool/spamassassin -m -s /bin/false

Cela crée un user qui ne peux pas se loguer et à un répertoire home dans /var/spool. Maintenant on change l’option de lancement de spamassassin dans /etc/default/spamassassin/

# vim /etc/default/spamassassin

[…]

18 OPTIONS= »-x –max-children 3 –helper-home-dir -u spamassassin »

Et on relance le daemon. Il est maintenant lancé sous l’utilisateur spamassassin.

# /etc/init.d/spamassassin restart
Restarting SpamAssassin Mail Filter Daemon: spamd.

# ps -edf|grep spam

root 31991 1 33 12:40 ? 00:00:01 /usr/sbin/spamd -x –max-children 3 –helper-home-dir -u spamassassin -d –pidfile=/var/run/spamd.pid

1015 31993 31991 0 12:40 ? 00:00:00 spamd child
1015 31994 31991 0 12:40 ? 00:00:00 spamd child

root@zerhuel:/var/spool# grep spamassassin /etc/passwd
spamassassin:x:1015:1015::/var/spool/spamassassin:/bin/false

Activer la validation DKIM

Il est possible d’activer la validation DKIM. Pour cela, le package libmail-dkim-perl doit être installé. Ensuite, il suffit d’activer le module DKIM dans la configuration de spamassassin.

# vim /etc/spamassassin/v312.pre

[…]

18 ###########################################################################
19 # experimental plugins
20
21 # DKIM – perform DKIM verification
22 #
23 # Mail::DKIM module required for use, see INSTALL for more information.
24 #
25 # Note that if C version 0.20 or later is installed, this
26 # renders the DomainKeys plugin redundant.
27 #
28 loadplugin Mail::SpamAssassin::Plugin::DKIM

Relancez spamassassin. Lorsqu’un mail arrivera avec une signature DKIM, Spamassassin placera la valeur suivante dans le résultat de l’inspection

X-Spam-Status: No, score=2.9 required=8.0 tests=DKIM_SIGNED,DKIM_VERIFIED,
HTML_MESSAGE,TVD_SPACE_RATIO autolearn=no version=3.2.5

(test effectué avec un email provenant de gmail)
Postfix tout aussi rapidement

Seul le fichier Master.cf est à modifier. Il faut demander (poliment hein) au daemon smtpd d’appeler spamassassin, que l’on va définir juste après. Donc, dans ‘/etc/postfix/master.cf’ à la fin de la ligne smtp, on ajoute ‘-o spamassassin’ :

#
# Postfix master process configuration file. For details on the format
# of the file, see the master(5) manual page (command: « man 5 master »).
#
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
smtp inet n – – – – smtpd -o content_filter=spamassassin

De fait, à la fin du fichier Master.cf il faut créer un service spamassassin :

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

Bon, normalement les chemins des exécutables sont bons pour Debian Etch mais faites quand même une vérif avant 😉

Et hop, on reload postfix et ça roule.
Ils disent quoi les logs ?

Le fichier /var/log/mail.info contient maintenant les notifications de spamassassin. Un peu partout vous verrez des lignes du type :

Jul 4 19:59:09 mailbox spamd[17990]: spamd: result: . 4 – EXTRA_MPART_TYPE,HTML_10_20,HTML_IMAGE_ONLY_24,HTML_MESSAGE,HTML_SHORT_LINK_IMG_3,MSGID_FROM_MTA_ID scantime=0.1,size=11864,user=nobody,uid=65534,required_score=5.0,rhost=localhost,raddr=127.0.0.1,rport=37360,mid=<20070704175908.CA0D8564271@smtp.linuxwall.info>,autolearn=no

Et les entetes des mails contiennent maintenant :

X-Spam-Checker-Version: SpamAssassin 3.1.7-deb (2006-10-05) on sachiel.linuxwall.info
X-Spam-Level:
X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=failed

Variable selon que le mail est detecté comme spam ou non.

That’s all folks !