Installer une passerelle anti-spam avec SpamAssassin et procmail

Auteur : Olivier BOYER - oboyer () ajoute ! org

Mots clés

OpenBSD, spam, SpamAssassin, procmail, fetchmail, spamd

Introduction

Ce document décrit comment mettre en place une passerelle anti-spam avec SpamAssassin.

Il existe de nombreuses façons de filtrer les courriers non sollicités (spams) avec SpamAssassin. Dans cette maquette, l'idée est de filtrer les spams reçus dans différentes boîtes aux lettres, en dehors de notre domaine d'administration. Ce filtrage ne peut être effectué par les techniques classiques de greylisting puisque ces boîtes aux lettres ne sont pas du ressort de l'administrateur mails du domaine. Il faut donc utiliser une technique de filtrage post réception. Les spams vont dans un premier temps être reçus, puis, filtrés par SpamAssassin.

Ce document présente deux types de configuration.

  • La première décrite est dite user-side. C'est-à-dire qu'elle ne dépend que de fichiers remplis par chaque utilisateur. Il est possible de mettre en place des systèmes plus complexes de filtrage au niveau du serveur. Ces derniers ne seront pas abordés ici.
  • La seconde décrite est plutôt server-side. Le marquage des mails est effectué par le daemon de SpamAssassin spamd (ne pas confondre avec le daemon de greylisting d'OpenBSD).

Présentation de la maquette

  • Le serveur de mails MTA fonctionne sous OpenBSD.
  • Chaque utilisateur dispose d'une compte shell sur le serveur.
  • Les spams entrants à destination du domaine sont filtrés par la technique de greylisting présentée dans un autre document.
  • Le produit anti-spam utilisé pour le traitement des messages d'autres boîtes aux lettres est SpamAssassin.
  • Les mails sont rapatriés par les utilisateurs via fetchmail(1)
  • Le Mail Delivery Agent utilisé par fetchmail(1) est procmail(1).

Note

Toutes les commandes présentées ici, sont à exécuter, sauf mention contraire, en tant qu'administrateur de la machine.

Pré-requis

  • un système OpenBSD installé et fonctionnel

Installer les produits

Procmail

procmail permet de classer le courrier entrant. Pour l'installer, procédez comme suit :

# cd /usr/ports/mail/procmail
# make install clean

Fetchmail

fetchmail est un client mail qui permet de télécharger le courrier de différentes boîtes aux lettres via différents protocoles : pop3(s), imap(s), … Pour l'installer, procédrez comme suit :

# cd /usr/ports/mail/fetchmail
# make install clean

SpamAssassin

SpamAssassin est l'outil qui est utilisé ici comme logiciel de marquage de mails. Pour l'installer, procédez comme suit :

# cd /usr/ports/mail/p5-Mail-SpamAssassin
# make install clean

Tronc commun : configuration des produits

Les deux solutions de marquage de courriers décrites dans ce document possèdent un tronc commun : la configuration de fetchmail(1) et de SpamAssassin. La différence se situe lors de l'appel à SpamAssassin.

Fetchmail

La configuration de fetchmail(1) ci-dessous permet de télécharger les mails de boîtes aux lettres distantes imap.undomaine.com et pop.autredomain.fr via les protocoles imap et pop3s. Les mails reçus sont passés à procmail(1), qui lui, appliquera les filtres SpamAssassin, et autres règles.

#$HOME/.fetchmailrc
#see fetchmail(1)

#set logfile ~/fetchmail.log
defaults
   no fetchall
   keep
   mda "procmail -d %T"

poll imap.undomaine.com
   proto imap
   user "user-undomaine.com" is "utilisateur_local"
   password "motDePasse_de_user-undomaine.com"
   nokeep

poll pop.autredomaine.fr
   proto pop3
   user "user-autredomaine.fr" is "utilisateur_local"
   password "motDePasse_de_user-autredomaine.com"
   ssl
   nokeep

Configurer SpamAssassin

La configuration livrée par défaut convient pratiquement à nos besoins. Cependant, il est posible de l'améliorer un peu en ajoutant les lignes suivantes au fichier /etc/mail/spamassassin/local.cf :

#/etc/mail/spamassassin/local.cf

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

# which locales are considered OK for incoming mail
# 'en'   - Western character sets in general
ok_locales en 

# Use Bayesian classifier (default: 1)
use_bayes 1

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

# skip RBL, MTA already did it
skip_rbl_checks 1

dns_available yes

# whitelist
whitelist_from  *@a_white_listed_domain.com
whitelist_from  a_white_listed_friend@domain.com

Pour plus de détails, voir la page de documentation :

# perldoc Mail::SpamAssassin::Conf

Première configuration possible

La configuration décrite est dite user-side. C'est-à-dire qu'elle ne dépend que de fichiers remplis par chaque utilisateur.

Procmail

Dans la maquette présentée ici, procmail(1) fait office de Mail Delivery Agent. C'est-à-dire qu'il est chargé par fetchmail(1) de déposer le courrier dans la boîte aux lettres de l'utilisateur final, en appliquant certaines règles.

#$HOME/.procmailrc

MAILDIR=$HOME/mail
DEFAULT=$MAILDIR/Inbox
#LOGFILE=$HOME/procmail.log

#
## Spam Filtering
#
# check for spam with SpamAssassin
:0fw: $HOME/tmp/spamassassin.lock
* < 256000
| /usr/local/bin/spamassassin

# All mail tagged as spam (eg. with a score higher than the set threshold)
# is moved to "spam" mailbox.
:0:
* ^X-Spam-Status: Yes
$MAILDIR/spam

#
## procmail rules
#

# Autres règles de procmail ci-dessous.

Premier lancement et entretien de SpamAssassin

SpamAssassin intègre un filtre d'apprentissage statistique bayesien. Pour améliorer sa pertinence, il faut sauvegarder tous les spams reçus et non interceptés par SpamAssassin dans une boîte aux lettres.

A l’initialisation de SpamAssassin, il est possible d’accélérer le processus d’apprentissage en exécutant la commande sa-learn(1). Pour que l'apprentissage initial soit efficace, il est conseillé de respecter les points suivants :

  • s'assurer que les mbox d'apprentissage ne contiennent que des “spam” ou que des “ham”,
  • que le nombre de “spam” dans la boîte aux lettres soit supérieur à 1000,
  • que le nombre de “ham” soit bien supérieur au nombre de “spam”,
  • que les dates des “spam” et des “ham” soient assez proches. Si vous faites l'apprentissage avec de vieux “spam”, mais des “ham” récents, SpamAssassin va penser qu'un message avec une date ancienne est un “spam”.

Exécutez les commandes suivantes en tant qu'utilisateur :

  • pour apprendre ce qu'est un spam :
$ sa-learn --spam --mbox ~/mail/spam
  • pour apprendre ce qu'est un courier légitime :
$ sa-learn --ham --mbox /var/mail/$USER

Remarques :

  • Si vous ne disposez pas de mbox sur la machine, créez un compte mail auquel vous transfèrerez les spams.
  • Il faut exécuter les commandes ci-dessus de temps à autre pour entretenir son SpamAssassin.

Deuxième configuration possible

La configuration décrite maintenant est plutôt server-side. Le marquage des mails est effectué par le daemon de SpamAssassin spamd (ne pas confondre avec le daemon de greylisting d'OpenBSD).

Dans la première configuration présentée, chaque utilisateur exécutait spamassassin dans son .procmailrc. Chaque utilisateur maintenait donc ses propres bases de connaissances de spam et de ham. L'idée dans cette nouvelle configuration est de mutualiser ces bases de connaissances.

Procmail

Au lieu d'exécuter la commande spamassasin par chaque utilisateur, nous allons utiliser le daemon spamd. Les mails sont transmis pour analyse à spamd via le client spamc.

Créer le fichier /etc/procmailrc

procmail(1) recherche, dans l'ordre, ses règles dans les fichiers /etc/procmailrc puis $HOME/.procmailrc.

Créer comme suit le fichier /etc/procmailrc :

#/etc/procmailrc
# initial global rcfile
# see procmail(1) and procmailrc(5)

PATH=/bin:/usr/bin:/usr/local/bin
DROPPRIVS=yes

## Spam Filtering
# All messages go through SpamAssassin
:0fw
* < 256000
| /usr/local/bin/spamc

#EOF

Modifier le fichier $HOME/.procmailrc

Il faut maintenant supprimer l'appel à spamassassin des fichiers $HOME/.procmailrc :

#$HOME/.procmailrc

MAILDIR=$HOME/mail
DEFAULT=$MAILDIR/Inbox
#LOGFILE=$HOME/procmail.log

#
## Spam Filtering
#

# All mail tagged as spam (eg. with a score higher than the set threshold)
# is moved to "spam" mailbox.
:0:
* ^X-Spam-Status: Yes
$MAILDIR/spam

#
## procmail rules
#

# Autres règles de procmail ci-dessous.

spamd

spamd est la version daemon de spamassassin. Les utilisateurs passent les mails pour marquage au daemon spamd via la commande spamc. spamd lit sa configuration dans le fichier /etc/mail/spamassassin/local.cf. Il peut en outre, accepter des arguments lors de son lancement.

Les paragraphes ci-dessous présentent comment configurer spamd.

Créer un utilisateur dédié

Dans notre maquette, le daemon spamd s'exécute sous l'identité d'un utilisateur dédié : _spamdaemon. Pour créer cet utilisateur, procédez comme suit :

# useradd -m -c "SpamAssassin Daemon" -b "/var/spool/spamdaemon" \
-s /sbin/nologin -u 506 -g =uid _spamdaemon

Fixez les permissions du répertoire d'accueil de ce pseudo-utilisateur :

# chown root:_spamdaemon /var/spool/spamdaemon
# chmod 710 /var/spool/spamdaemon

Répertoire de travail de spamd

Durant son fonctionnement, spamd apprend ce qu'est un spam ou un courrier valide. Pour cela, il stocke des informations dans le répertoire ~/.spamassassin. Dans cette maquette, spamd s'exécute sous l'identité de l'utilisteur _spamdaemon. Il faut donc créer le répertoire .spamassassin dans la HOME de l'utilisateur _spamdaemon.

Pour créer le répertoire de travail de spamd, procédez comme suit :

# cd /var/spool/spamdaemon
# mkdir .spamassassin
# chown _spamdaemon:_spamdaemon .spamassassin
# chmod 700 .spamassassin

Démarrer spamd

Pour démarrer spamd, exécutez la commande suivante :

# /usr/local/bin/spamd -x -l -u _spamdaemon -d

Ajoutez les lignes suivantes au fichier /etc/rc.local pour exécuter spamd à chaque démarrage de la machine :

# Start spamd (SpamAssasin daemon)

if [ -x /usr/local/bin/spamd ]; then
  echo -n ' spamd'
  /usr/local/bin/spamd -x -l -u _spamdaemon -d
fi

Liens

 
doc/openbsd/spamassassin.txt · Dernière modification: 2009/12/23 22:36 (édition externe)     Haut de page