Spamassasin

Spamassasin est un excellent outil de gestion de spams. Il est généralement greffé sur un serveur SMTP comme postfix et permet de faire du whitelisting et du blacklisting.

Il existe en réalité 3 types de filtrages mails:

  • whitelisting: autoriser
  • blacklisting: marquer comme spam
  • graylisting: demander de retenter plus tard

Le graylisting peut être intéressant car il oblige un réseau de bot générant des spams à utiliser des mécaniques moins standard, et souvent moins supportées. postgray permet de répondre à cette problématique, mais nous ne le traiterons pas ici.

Nous allons voir dans cet article comment installer spamassassin et l’interfacer avec postfix.

Installation

Sous FreeBSD:

cd /usr/ports/mail/p5-Mail-Spamassassin
make install clean

Choisissez les options par défaut pour le port et pour toutes ses dépendances (hormis si vous avez des besoins précis).

A la fin de l’installation, vous serez invité à mettre à jour les blacklists. Acceptez.

*******************************************************
* _  _  _ _______  ______ __   _ _____ __   _  ______ *
* |  |  | |_____| |_____/ | \  |   |   | \  | |  ____ *
* |__|__| |     | |    \_ |  \_| __|__ |  \_| |_____| *
*                                                   *
*******************************************************
*  You must install rules before starting spamd!    *
*******************************************************
Do you wish to run sa-update to fetch new rules [N]? y

Enfin activez le service dans /etc/rc.conf

spamd_enable="YES"

Configuration

Configuration de spamassassin

Dans un premier temps, on va activer la mise à jour automatique des listes de spamassassin. Ouvrez le fichier /etc/crontab et ajoutez l’entrée suivante:

00      3       *     *     *     root    /usr/local/bin/sa-update

Allez ensuite dans le répertoire de configuration de spamassassin et copiez le fichier d’exemple

cd /usr/local/etc/mail/spamassassin
cp local.cf.sample local.cf

Par défaut peu d’options sont présentes et elles sont toutes commentées.

  • rewrite_header Subject: permet de définir quelle chaîne ajouter dans l’en-tête du mail par exemple /!\ SPAM /!
  • trusted_networks: permet de définir des réseaux IP définis comme sûrs, sous la forme 10.2.3 (tout le réseau 10.2.3.0/24)
  • required_score: définit le score minimal avant qu’un mail soit considéré comme spam. Le niveau par défaut 5 est normalement suffisant, il est possible de descendre à 3 ou moins mais il y a des chances que des faux positifs apparaissent.
  • required_hits: définit un score en fonction du nombre de mails identiques. Pour une petite organisation 3 est un bon chiffre, pour une grande 8 est mieux.

Configuration de postfix

Pour terminer on va relier postfix et spamassassin. Ouvrez le fichier /usr/local/etc/postfix/master.cf. Editez tout d’avoir la ligne concernant smtp afin d’ajouter la notion de filtre:

smtp      inet  n       -       n       -       -       smtpd -o content_filter=spamassassin

Ensuite déclarez le filtre spamassassin:

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

Lancement des services

Vous pouvez désormais lancer vos services:

service postfix restart
service sa-spamd restart

Vérification de l’antispam

Envoyez vous un mail. Vous devriez voir apparaître une sortie similaire dans /var/log/maillog

Jun  8 20:15:01 MailServer spamd[57413]: spamd: connection from localhost [127.0.0.1] at port 54641
Jun  8 20:15:01 MailServer spamd[57413]: spamd: setuid to spamd succeeded
Jun  8 20:15:01 MailServer spamd[57413]: spamd: creating default_prefs: /var/spool/spamd/.spamassassin/user_prefs
Jun  8 20:15:01 MailServer spamd[57413]: config: created user preferences file: /var/spool/spamd/.spamassassin/user_prefs
Jun  8 20:15:01 MailServer spamd[57413]: spamd: processing message <1370715664.2282.0.camel@Arch-PC> for spamd:58
Jun  8 20:15:03 MailServer spamd[57413]: spamd: clean message (-0.8/3.0) for spamd:58 in 1.9 seconds, 2248 bytes.
Jun  8 20:15:03 MailServer spamd[57413]: spamd: result: . 0 - DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,HTML_MESSAGE,RCVD_IN_DNSWL_LOW,SPF_PASS scantime=1.9,size=2248,user=spamd,uid=58,required_score=3.0,rhost=localhost,raddr=127.0.0.1,rport=54641,mid=<1370715664.2282.0.camel@Arch-PC>,autolearn=ham
Jun  8 20:15:03 MailServer spamd[57412]: prefork: child states: II

Le score est de 0, le mail passera sans souci.

Maintenant envoyez vous un mail avec pour sujet:

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

Vous devriez voir le mail se faire marquer comme spam:

Jun  8 20:15:56 MailServer spamd[57413]: spamd: connection from localhost [127.0.0.1] at port 39519
Jun  8 20:15:56 MailServer spamd[57413]: spamd: setuid to spamd succeeded
Jun  8 20:15:56 MailServer spamd[57413]: spamd: processing message <1370715720.2282.2.camel@Arch-PC> for spamd:58
Jun  8 20:15:57 MailServer spamd[57413]: spamd: identified spam (999.2/3.0) for spamd:58 in 1.5 seconds, 2437 bytes.
Jun  8 20:15:57 MailServer spamd[57413]: spamd: result: Y 999 - DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,GTUBE,HTML_MESSAGE,RCVD_IN_DNSWL_LOW,SPF_PASS,TVD_SPACE_RATIO scantime=1.5,size=2437,user=spamd,uid=58,required_score=3.0,rhost=localhost,raddr=127.0.0.1,rport=39519,mid=<1370715720.2282.2.camel@Arch-PC>,autolearn=no
Jun  8 20:15:57 MailServer spamd[57412]: prefork: child states: II

Ici le score est de 999. C’est un spam. Notre serveur va donc rajouter l’en-tête que vous avez mentionné plus haut et vous remettre le mail.

Capture d'écran de 2013-06-08 20:31:10Comme vous le voyez le message est tagué.

Aller plus loin

Trier les mails tagués avec dovecot2 et pigeonhole

Pigeonhole est le successeur de l’ancien plugin sieve qui était présent sur la version 1 de dovecot. Il permet de trier les mails en fonction de différents critères.

Installez le port dovecot2-pigeonhole et créez le fichier 90-sieve.conf dans le répertoire conf.d de dovecot.

service managesieve-login {
  inet_listener sieve {
    port = 4190
  }

  # Number of connections to handle before starting a new process. Typically
  # the only useful values are 0 (unlimited) or 1\. 1 is more secure, but 0
  # is faster. <doc/wiki/LoginProcess.txt>
  #service_count = 1

  # Number of processes to always keep waiting for more connections.
  #process_min_avail = 0

  # If you set service_count=0, you probably need to grow this.
  #vsz_limit = 64M
}

service managesieve {
  # Max. number of ManageSieve processes (connections)
  process_limit = 1024
}

# Service configuration

protocol sieve {
  # Maximum ManageSieve command line length in bytes. ManageSieve usually does
  # not involve overly long command lines, so this setting will not normally need
  # adjustment
  #managesieve_max_line_length = 65536

  # Maximum number of ManageSieve connections allowed for a user from each IP address.
  # NOTE: The username is compared case-sensitively.
  #mail_max_userip_connections = 10

  # Space separated list of plugins to load (none known to be useful so far). Do NOT
  # try to load IMAP plugins here.
  #mail_plugins =

  # MANAGESIEVE logout format string:
  #  %i - total number of bytes read from client
  #  %o - total number of bytes sent to client
  #managesieve_logout_format = bytes=%i/%o

  # To fool ManageSieve clients that are focused on CMU's timesieved you can specify
  # the IMPLEMENTATION capability that the dovecot reports to clients.
  # For example: 'Cyrus timsieved v2.2.13'
  #managesieve_implementation_string = Dovecot Pigeonhole

  # Explicitly specify the SIEVE and NOTIFY capability reported by the server before
  # login. If left unassigned these will be reported dynamically according to what
  # the Sieve interpreter supports by default (after login this may differ depending
  # on the user).
  #managesieve_sieve_capability =
  #managesieve_notify_capability =

  # The maximum number of compile errors that are returned to the client upon script
  # upload or script verification.
  #managesieve_max_compile_errors = 5

  # Refer to 90-sieve.conf for script quota configuration and configuration of
  # Sieve execution limits.
}

plugin {
  # Used by both the Sieve plugin and the ManageSieve protocol
  sieve = ~/.dovecot.sieve
  sieve_dir = ~/sieve
  sieve_default = /usr/local/etc/dovecot/conf.d/sieve/default
}

Enfin, créez le fichier /usr/local/etc/dovecot/conf.d/sieve/default contenant le script suivant (remplacez Spam par le répertoire de votre choix. Il peut être idéal d’auto créer la boîte si elle n’existe pas via dovecot).

require "fileinto";

if header :contains "X-Spam-Flag" ["YES"] {
  fileinto "Spam";
  stop;
}

Vous avez désormais un serveur avec spamassassin et un tri automatique des mails !