Table des matières

Installer une passerelle anti-spam avec amavisd-new, SpamAssassin, Razor2 et Postfix

Auteur : Olivier BOYER - oboyer () ajoute ! org

Mots clés

Amavisd-new, SpamAssassin, Vipul's Razor2, Postfix, anti-spam, antispam, passerelle, gateway, chroot, OpenBSD

Introduction

Ce document présente l'installation d'un filtre anti-spam avec Amavisd-new, ses modules Spamassassin et les agents Vipul's Razor2. Le système anti-spam s'interface avec le serveur MTA Postfix et fonctionne dans un environnement à racine déplacé (chroot) sur un système OpenBSD 4.3.

Le document présente tout d'abord l'installation de amavisd-new, puis la création de sa cage. Une fois que le fonctionnement du service et son interaction avec Postfix sont validés, l'installation et la configuration de Vipul's Razor2 est présentée.

Présentation de la maquette

Les éléments suivants sont mis en oeuvre :

  • Un système OpenBSD
  • Un serveur de mails MTA Postfix
  • Un filtre anti-spam avec amavisd-new et ses modules Spamassassin
  • Les agents Vipul's Razor2

Le service amavisd-new s'exécute dans une cage, dont la racine est le répertoire /var/amavisd. Tous les composants liés à amavisd-new s'exécutent dans le même environnement. Le daemon (et tous ses composants), à l'intérieur de la nouvelle racine s'exécute en tant qu'utilisateur _vscan. Cet utilisateur est créé automatiquement lors de l'installation du package amavisd-new.

Schéma général

              +...................+
Courrier -->  :      Postfix      : --> Courrier
Entrant       +...................+     Distribué
                   |    ^
                   |    |
                   v    |
              +....................................+
              :   Amavisd-new <------<----\        :
              :       |                   |        :
              :       v            +-------------+ :
              :  SpamAssassin      | Attribution | :
              :       |            |    d'une    | :
              :       v            |    note     | :
              : Vipul's Razor2     +-------------+ :
              :       |                   ^        :
              :       v                   |        :
              :       \-->----------->----/        :
              +....................................+

Présentation des composants

Postfix

Postfix est un serveur de courriers (MTA) développé pour être sécurisé et simple à administrer. Il offre une interface entièrement compatible avec l'ancêtre des MTA : sendmail.

Postfix est écrit en C.

Amavisd-new

Amavisd-new est une interface performante et sûre entre le serveur de courriers (MTA) et un ou plusieurs analyseurs de contenu (tels que les anti-spam et les anti-virus). Il est normallement installé sur le serveur central de courriers (ou sur un serveur dédié à proximité), pas sur le serveur de distribution. Il communique avec le MTA via (E)SMTP ou LMTP, ou via des programmes externes.

Quand le filtre anti-spam SpamAssassin (SA) est activé, amavisd-new appelle SA une seule fois par message reçu, quelque soit le nombre de destinataire. Enfin, il décode le message reçu et ses pièces jointes, puis les met à disposition des analyseurs de contenu. Ainsi, le décodage est fait une fois pour toute.

Amavisd-new est écrit en Perl.

SpamAssassin

SpamAssassin est un filtre anti-spam de type “analyseur de contenu” (ou “content-filter”). Il utilise une grande variété de mécanismes (analyse des headers et du corps d'un message, filtrage Bayesien, blacklist DNS, catalogues collaboratifs d'identification de spams, …) pour classifier un message en tant que spam (courrier non sollicité) ou ham (courrier légitime). Après chaque test effectué, une note est attribuée. Si la somme de ces notes dépasse le seuil configuré, SpamAssassin identifie le message comme un spam, sinon, comme un ham.

SpamAssassin est écrit en Perl.

Vipul's Razor2

Vipul's Razor2 est un catalogue distribué et constamment mis à jour par les utilisateurs de spams en cours de propagation. L'objectif est de détecter le lancement d'une vague de spams le plus rapidement possible.

Vipul's Razor2 est appelé par SpamAssassin. A chaque message contrôlé par SpamAssassin, un serveur Razor2 externe est interrogé (via le port tcp/2703) et une réponse est renvoyée permettant de déterminer si le contenu est enregistré comme spam ou non. Pour garantir la confidentialité des échanges, le contenu du message n'est jamais directement soumis au serveur Razor2. Seul le résultat d'un hashage est fournit.

Vipul's Razor2 est écrit en Perl.

Note

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

Pré-requis

  • Le serveur OpenBSD doit être installé et fonctionnel.
  • Le serveur de courriers Postfix [/usr/ports/mail/postfix] doit être installé et fonctionnel.
  • L'arbre des ports OpenBSD doit être décompressé, dans le répertoire /usr/ports.
  • La mise à jour des de l'arbre des ports doit avoir été effectuée.
  • La partition /var ou /var/amavisd ne doit pas être montée avec les options nodev ni noexec puisque le daemon amavisd-new va s'exécuter dans la cage /var/amavisd.

Installer les produits

La première étape consiste à installer le daemon amavisd via les packages binaires OpenBSD et, pour certaines dépendances du produit, via l'arbre des ports.

Installer les dépendances

Les packages unarj, unrar et freeze ne sont pas disponibles en version binaire, pour des problèmes de licences. Il faut donc les compiler via l'arbre des ports.

Procédez comme suit :

# cd /usr/ports/archivers/unarj
# make install clean clean-depends
#
# cd /usr/ports/archivers/unrar
# make install clean clean-depends
#
# cd /usr/ports/archivers/freeze
# make install clean clean-depends

Installer les dépendances facultatives

Les packages suivants sont pas liés à amavisd-new, mais sont appelés dans son fichier de configuration pour analyser le contenu de certaines piéces jointes.

Pour installer les dépendances, procédez comme suit :

# PKG_PATH="ftp://ftp.irisa.fr/pub/OpenBSD/$(uname -r)/packages/i386/"
# export PKG_PATH
# pkg_add tnef cabextract lzop

Installer amavisd-new

Les dépendances sont maintenant installées. Pour installer le package binaire de amavisd-new, procédez comme suit :

# PKG_PATH="ftp://ftp.irisa.fr/pub/OpenBSD/$(uname -r)/packages/i386/"
# export PKG_PATH
# pkg_add amavisd-new

Créer le chroot d'amavisd-new

Introduction

Le daemon amavisd est configuré dans cette maquette pour s'exécuter dans un environnement à racine déplacé (chroot). Ce mécanisme permet d'augmenter la sécurité générale du système.

Exécuter un daemon dans un environnement à racine déplacé demande une configuration supplémentaire. Cette configuration est présentée dans ce chapitre.

Le daemon amavisd-new démarre en dehors de la cage, charge tous les modules Perl nécessaires, puis change sa racine d'exécution et abandonne ses privilèges, pour s'exécuter en tant qu'utilisateur _vscan. La création de la cage est donc simplifiée, il n'est pas nécessaire de copier les modules Perl d'amavisd-new dans la cage. Cependant, le 'reload' (HUP) ne fonctionnera pas. Il faut arrêter puis redémarrer le daemon.

La gestion des fichiers d'enregistrement est réalisée par syslogd(8)

Modifier les permissions de la cage

Par défaut, l'installation du package amavisd-new crée le répertoire /var/amavisd. Les permissions affectées à ce répertoire peuvent être améliorées comme suit :

# chown _vscan:_vscan /var/amavisd
# chmod 710 /var/amavisd

Créer les répertoires dans la cage

Exécutez les commandes suivantes :

# mkdir -p /var/amavisd/{dev,etc/mail,tmp,usr,var}
# mkdir -p /var/amavisd/usr/{bin,lib,libexec,share,libdata/perl5,local/share}
# mkdir /var/amavisd/var/{.spamassassin,db,empty,virusmails,run,tmp}
#
# chown -R root:wheel /var/amavisd/{dev,etc,usr,var}
# chown _vscan:_vscan /var/amavisd/tmp
# chown _vscan:_vscan /var/amavisd/var/{.spamassassin,db,virusmails,run,tmp}

Enfin, créez un lien symbolique pour que les processus qui sont “chrootés” puissent faire référence à leur “home directory” en tant que /var/amavisd (comme pour les processus non “chrootés”). Sinon, ces processus devraient identifier leur “home directory” en tant que / (nouvelle racine de la cage).

# cd /var/amavisd/var
# ln -s .. amavisd

Remplir le répertoire : dev

Pour créer les fichiers de périphériques nécessaires au fonctionnement d' amavisd-new et de SpamAssassin dans la cage, procédez comme suit :

# cd /var/amavisd/dev
# mknod -m 666 null c 2 2
# mknod -m 666 stderr c 22 2
# mknod -m 666 stdin c 22 0
# mknod -m 666 stdout c 22 1
# mknod -m 666 zero c 2 12
#
# /dev/MAKEDEV random
# chmod 644 /var/amavisd/dev/*random
#
# chown -R root:wheel /var/amavisd/dev

Le répertoire /var/amavisd/dev doit être semblable à celui ci-dessous :

# ls -l
total 0
crw-r--r--  1 root  wheel   45,   4 May 30 12:24 arandom
crw-rw-rw-  1 root  wheel    2,   2 May 30 12:24 null
crw-r--r--  1 root  wheel   45,   3 May 30 12:24 prandom
crw-r--r--  1 root  wheel   45,   0 May 30 12:24 random
crw-r--r--  1 root  wheel   45,   1 May 30 12:24 srandom
crw-rw-rw-  1 root  wheel   22,   2 May 30 12:24 stderr
crw-rw-rw-  1 root  wheel   22,   0 May 30 12:24 stdin
crw-rw-rw-  1 root  wheel   22,   1 May 30 12:25 stdout
crw-r--r--  1 root  wheel   45,   2 May 30 12:24 urandom
crw-rw-rw-  1 root  wheel    2,  12 May 30 12:24 zero

Remplir le répertoire : etc

Créez un nouvel ensemble de fichiers de configuration du système.

Fichiers "standards"

Copiez comme suit les fichiers du répertoire /etc :

# cp /etc/{localtime,magic,protocols,resolv.conf,services} /var/amavisd/etc
# grep localhost /etc/hosts > /var/amavisd/etc/hosts

etc/amavisd.conf

Déplacez le fichier de configuration du daemon amavisd du répertoire /etc à la nouvelle racine d'exécution du daemon /var/amavisd.

# mv /etc/amavisd.conf /var/amavisd/etc
#
# cd /etc
# ln -s ../var/amavisd/etc/amavisd.conf amavisd.conf

etc/mail/spamassassin

Déplacez les fichiers de configuration de SpamAssassin du répertoire /etc/mail/spamassassin à la nouvelle racine d'exécution du daemon /var/amavisd.

# mv /etc/mail/spamassassin /var/amavisd/etc/mail
# cd /etc/mail
# ln -s ../../var/amavisd/etc/mail/spamassassin spamassassin

etc/group

Durant son exécution dans la nouvelle racine, le daemon amavisd aura besoin de connaître l'identité de certains groupes. Pour ce faire, il faut récréer une base locale de groupe dans le chroot.

Procédez comme suit :

# egrep '^wheel|_vscan|^_shadow' /etc/group \
|awk -F: '{printf "%s:%s:%s:\n",$1,$2,$3}' > /var/amavisd/etc/group

Le contenu du fichier doit être semblable à celui ci-dessous :

# cat /var/amavisd/etc/group
wheel:*:0:
_shadow:*:65:
_vscan:*:530:

etc/passwd

Durant son exécution dans la nouvelle racine, le daemon amavisd aura besoin de connaître l'identité de certains utilisateurs. Pour ce faire, il faut récréer une base locale d'utilisateurs dans la cage.

Créer un fichier restreint

Procédez comme suit :

# egrep '^root|^_vscan' /etc/master.passwd > /var/amavisd/etc/master.passwd

ATTENTION :
Il est TRES IMPORTANT de :

  • supprimer les mots de passe des utilisateurs et de les remplacer par la chaîne '*LK*'
  • remplacer les shell des utilisateurs par la chaîne : '/sbin/nologin'.

Le contenu du fichier /var/amavisd/etc/master.passwd doit donc être semblable à celui ci-dessous :

# cat /var/amavisd/etc/master.passwd
root:*LK*:0:0:daemon:0:0:Charlie &:/root:/sbin/nologin
_vscan:*LK*:530:530::0:0:Amavisd-new Daemon:/var/empty:/sbin/nologin

Générer la base binaire

Créez, comme suit, la base des mots de passe à partir de ce nouveau fichier :

# pwd_mkdb -p -d /var/amavisd/etc /var/amavisd/etc/master.passwd
pwd_mkdb: warning, unknown root shell
pwd_mkdb: warning, unknown root shell
pwd_mkdb: warning, unknown root shell

Les messages d'avertissement indiquent que le shell pour l'utilisateur root est inconnu, donc invalide. Comme l'utilisateur root de la cage ne se logera jamais, vous pouvez ignorer ces messages.

Contenu attendu

Une fois tous les fichiers copiés ou créés, voici le contenu de /var/amavisd/etc :

# ls -R /var/amavisd/etc/
amavisd.conf    localtime       master.passwd   pwd.db          spwd.db
group           magic           passwd          resolv.conf
hosts           mail            protocols       services

/var/amavisd/etc/mail:
spamassassin

/var/amavisd/etc/mail/spamassassin:
init.pre local.cf v310.pre v312.pre

Fixer les permissions du répertoire etc

Pour fixer les permissions, procédez comme suit :

# chown -R root:wheel /var/amavisd/etc
# chown root:_shadow /var/amavisd/etc/master.passwd

Remplir le répertoire : usr

Pour remplir le contenu du répertoire /var/amavisd/usr nous allons utiliser un script shell qui copie les binaires nécessaires au fonctionnement du daemon amavisd et toutes les bibliothèques de fonction dont ils dépendent. Ce script automatise le travail qu'il est nécessaire de faire “à la main”.

Télécharger le script

Téléchargez le script inst_chroot_bin.sh à l'adresse suivante : http://ajoute.org/cvs/sysutils/openbsd/admin/inst_chroot_bin.sh et copiez le dans le répertoire /var/tmp. Procédez comme suit :

# cd /var/tmp
# > inst_chroot_bin.sh
# ftp http://ajoute.org/cvs/~checkout~/sysutils/openbsd/admin/inst_chroot_bin.sh
# chmod 744 inst_chroot_bin.sh

Copier les binaires et les bibliothèques partagées

Exécutez la commande suivante :

for i in \
  /usr/bin/ar \
  /usr/bin/file \
  /usr/bin/gzip \
  /usr/bin/perl \
  /usr/local/bin/arc \
  /usr/local/bin/cabextract \
  /usr/local/bin/bzip2 \
  /usr/local/bin/freeze \
  /usr/local/bin/lha \
  /usr/local/bin/lzop \
  /usr/local/bin/tnef \
  /usr/local/bin/unarj \
  /usr/local/bin/unrar \
  /usr/local/bin/zoo
do
   env PREFIX=/var/amavisd /var/tmp/inst_chroot_bin.sh $i
done

Copiez aussi le binaire static /bin/pax :

# cp /bin/pax /var/amavisd/usr/bin

Copiez aussi le script Perl rpm2cpio :

# cp /usr/local/bin/rpm2cpio /var/amavisd/usr/bin

Effacez le script téléchargé comme suit :

# rm -f /var/tmp/inst_chroot_bin.sh

Gestion des fichiers UTF-8

Pour que Perl sache gérer les fichiers UTF-8, vous devez copier certains éléments dans la cage. Procédez comme suit :

# cp -pR /usr/libdata/perl5/unicore /var/amavisd/usr/libdata/perl5

Fichiers de zone

Copiez les fichiers de définition de zone dans la cage :

# cp -pR /usr/share/zoneinfo /var/amavisd/usr/share

Fichiers de SpamAssassin

Amavisd-new intègre les modules Perl de SpamAssassin pour classifier les mails. Il faut tout de même copier certains éléments de SpamAssassin dans la cage. Procédez comme suit :

# cp -pR /usr/local/share/spamassassin /var/amavisd/usr/local/share

Fixer les permissions du répertoire usr

Exécutez les commandes suivantes :

# chmod 111 /var/amavisd/usr/bin/*
# chown -R root:wheel /var/amavisd/usr

La cage est maintenant remplie.

Configurer amavisd-new

etc/amavisd.conf

Modifiez les paramètres suivants du fichier de configuration livré par défaut :

use strict;
#/etc/amavisd.conf
# configuration file for amavisd-new
#
#   see amavisd.conf-default for a list of all variables with their defaults;
#   see amavisd.conf-sample for a traditional-style commented file;
#   for more details see documentation in INSTALL, README_FILES/*
#   and at http://www.ijs.si/software/amavisd/amavisd-new-docs.html


# COMMONLY ADJUSTED SETTINGS:

@bypass_virus_checks_maps = (1);  # uncomment to DISABLE anti-virus code
# @bypass_spam_checks_maps  = (1);  # uncomment to DISABLE anti-spam code
# $bypass_decode_parts = 1;         # controls running of decoders&dearchivers


## GENERAL

$mydomain = 'leaves.org';     # a convenient default for other settings
$myhostname = 'mx.leaves.org';  # must be a fully-qualified domain name!
$daemon_user  = '_vscan';     # (no default;  customary: vscan or amavis)
$daemon_group = '_vscan';     # (no default;  customary: vscan or amavis)
$max_servers = 2;             # number of pre-forked children (2..15 is common)

$MYHOME   = '/var/amavisd';   # a convenient default for other settings
$TEMPBASE = "$MYHOME/tmp";    # working directory, needs to be created manually
$ENV{TMPDIR} = $TEMPBASE;     # environment variable TMPDIR
$daemon_chroot_dir = $MYHOME;   # chroot directory or undef
$db_home   = "$MYHOME/var/db";
$helpers_home = "$MYHOME/var";  # prefer $MYHOME clean and owned by root?
$pid_file  = "$MYHOME/var/run/amavisd.pid";
$lock_file = "$MYHOME/var/run/amavisd.lock";
$unix_socketname = "$MYHOME/var/run/amavisd.sock";
$enable_db = 1;              # enable use of BerkeleyDB/libdb (SNMP and nanny)
$enable_global_cache = 1;    # enable use of libdb-based cache if $enable_db=1
@local_domains_maps = ( [".$mydomain"] );
$path = '/usr/bin';

## LOGGING AND DEBUGGING

$log_level = 1;              # verbosity 0..5
$log_recip_templ = undef;    # disable by-recipient level-0 log entries
$DO_SYSLOG = 1;              # log via syslogd (preferred)
$syslog_facility = 'mail';   # Syslog facility as a string
$syslog_priority = 'debug';  # Syslog base (minimal) priority as a string,
$nanny_details_level = 2;    # nanny verbosity: 1: traditional, 2: detailed


## MTA INTERFACE

$inet_socket_port = 10024;   # listen on this local TCP port(s) (see $protocol)
$forward_method  = 'smtp:[127.0.0.1]:10025';
$notify_method = $forward_method;

## QUARANTINE

$QUARANTINEDIR = undef;
#$QUARANTINEDIR = "$MYHOME/var/virusmails";
# $virus_quarantine_to     = '';  # If no '@' is present, go to $QUARANTINEDIR
# $banned_quarantine_to    = '';
# $bad_header_quarantine_to= '';
# $spam_quarantine_to      = '';
# $spam_quarantine_bysender_to = undef;
# $quarantine_subdir_levels = 0;  # add level of subdirs to disperse quarantine

## SpamAssassin settings

$dspam = undef;
$sa_spam_subject_tag = '*****SPAM***** ';

$sa_tag_level_deflt  = -10;  # add spam info headers if at, or above that level
                             # set '-10'to have spam status of all messages
$sa_tag2_level_deflt = 6.2; # add 'spam detected' headers at that level
$sa_kill_level_deflt = 6.2; # triggers spam evasive actions
$sa_dsn_cutoff_level = 9;    # spam level beyond which a DSN is not sent
$sa_quarantine_cutoff_level = 20;  # spam level beyond which quarantine is off

$sa_mail_body_size_limit = 200*1024; # don't waste time on SA if mail is larger
$sa_local_tests_only = 0;    # only tests which do not require internet access?
$sa_auto_whitelist = 1;      # turn on AWL in SA 2.63 or older (irrelevant
                             # for SA 3.0, cf option is 'use_auto_whitelist')
$final_virus_destiny      = D_PASS;     # D_DISCARD;
$final_banned_destiny     = D_PASS;     # D_BOUNCE;
$final_spam_destiny       = D_PASS;     # D_BOUNCE;
$final_bad_header_destiny = D_PASS;     # D_PASS;

# Anti-virus settings
$virus_admin               = undef;     # notifications recip.
$mailfrom_notify_admin     = undef;     # notifications sender
$mailfrom_notify_recip     = undef;     # notifications sender
$mailfrom_notify_spamadmin = undef;     # notifications sender
$mailfrom_to_quarantine = ''; # null return path; uses original sender if undef

@addr_extension_virus_maps      = ('virus');
@addr_extension_spam_maps       = ('spam');
@addr_extension_banned_maps     = ('banned');
@addr_extension_bad_header_maps = ('badh');
# $recipient_delimiter = '+';  # undef disables address extensions altogether
# when enabling addr extensions do also Postfix/main.cf: recipient_delimiter=+

$defang_virus  = 1;  # MIME-wrap passed infected mail
$defang_banned = 1;  # MIME-wrap passed mail containing banned name
# for defanging bad headers only turn on certain minor contents categories:
$defang_by_ccat{+CC_BADH.",3"} = 1;  # NUL or CR character in header
$defang_by_ccat{+CC_BADH.",5"} = 1;  # header line longer than 998 characters
$defang_by_ccat{+CC_BADH.",6"} = 1;  # header field syntax error


$remove_existing_x_scanned_headers = 0;
$X_HEADER_TAG  = 'X-Virus-Scanned';
$X_HEADER_LINE = "$myproduct_name at $mydomain";


# Defending against mail bombs
$MAXLEVELS = 14;
$MAXFILES = 1500;
$MIN_EXPANSION_QUOTA =      100*1024;  # bytes  (default undef, not enforced)
$MAX_EXPANSION_QUOTA = 300*1024*1024;  # bytes  (default undef, not enforced)

[...]
[reste non modifié]

#EOF

etc/mail/spamassassin/local.cf

Modifiez les paramètres suivants du fichier de configuration livré par défaut :

#/etc/mail/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.
###########################################################################

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

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

#   Use Bayesian classifier (default: 1)
use_bayes 1

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

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

#   Skip RBL, MTA already did it
skip_rbl_checks 1

# Location of systemwide bayes database.
# We need to set this so that the root account can run the sa-learn(1) program
# to update the bayes database normally used by the amavisd user.
bayes_path /var/amavisd/var/.spamassassin/bayes

#EOF

Valider la configuration

Pour valider la configuration décrite plus haut, lancez amavisd en mode debug, comme suit :

# amavisd debug
[...]

Vérifiez l'absence d'erreur dans les informations qui s'affichent.

Configurer syslog

Le daemon amavisd enregistre son activité via le daemon syslog. Pour ce faire, il faut indiquer à syslog où trouver la socket de communication avec amavisd.

Ajoutez la chaine suivante au fichier /etc/rc.conf.local

syslogd_flags="-a /var/spool/postfix/dev/log -a /var/amavisd/dev/log"

Puis redémarrez le démon syslogd.

# pkill syslogd
# syslogd -a /var/spool/postfix/dev/log -a /var/amavisd/dev/log

Configurer Postfix

Le daemon amavisd est maintenant configuré dans sa cage. Il reste à intégrer ce service au serveur de courriers (MTA) du domaine.

Voici le schéma de l'architecture mise en place :

      .......................................
      :                Postfix              :
   ----->smtpd \                            :
      :         -pre-cleanup-\       /local---->
   ---->pickup /              -queue-       :
      :             -cleanup-/   |   \smtp----->
      :     bounces/    ^        v          :
      : and locally     |        v          :
      :   forwarded   smtpd  smtp-amavis    :
      :    messages   10025      |          :
      ...........................|...........
                        ^        |
                        |        v
            ............|...............................
            :           |   $inet_socket_port=10024    :
            :           |                              :
            : $forward_method='smtp:[127.0.0.1]:10025' :
            : $notify_method ='smtp:[127.0.0.1]:10025' :
            :                                          :
            :    amavisd-new                           :
            ............................................

Modifier le fichier /etc/postfix/master.cf

Ajoutez les lignes suivantes au fichier /etc/postfic/master.cf :

# amavisd-new filter (used by content_filter)
smtp-amavis unix -  -   n -   2  lmtp
  -o lmtp_data_done_timeout=1200
  -o lmtp_send_xforward_command=yes
  -o disable_dns_lookups=yes
  -o max_use=20

# For injecting mail back into postfix from the filter
127.0.0.1:10025 inet n  -  n   -   -   smtpd
  -o content_filter=
  -o smtpd_delay_reject=no
  -o smtpd_client_restrictions=permit_mynetworks,reject
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o smtpd_data_restrictions=reject_unauth_pipelining
  -o smtpd_end_of_data_restrictions=
  -o smtpd_restriction_classes=
  -o mynetworks=127.0.0.0/8
  -o smtpd_error_sleep_time=0
  -o smtpd_soft_error_limit=1001
  -o smtpd_hard_error_limit=1000
  -o smtpd_client_connection_count_limit=0
  -o smtpd_client_connection_rate_limit=0
  -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o mynetworks_style=host
  -o strict_rfc821_envelopes=yes

Cette configuration transfert les messages sur le port tcp/10025 de cette machine (le port où amavisd écoute). Plus précisément, amavisd écoute sur le port tcp/10024. La seconde “instance” de Postfix écoute sur le port tcp/10025. La seconde instance de Postfix est utilisée pour faire tout le filtrage.

Modifier le fichier /etc/postfix/main.cf

Ajoutez la ligne suivante au fichier /etc/postfix/main.cf :

content_filter = smtp-amavis:[127.0.0.1]:10024

Redémarrer postfix

Redémarrez Postfix pour prendre en compte la nouvelle configuration :

# postfix stop
# postfix start

Tester le fonctionnement

Tester la communication avec amavisd

Le test suivant vérifie qu'amavisd est bien à l'écoute. Une connexion fonctionnelle est similaire à celle ci-dessous :

$ telnet localhost 10024
220 [127.0.0.1] ESMTP amavisd-new service ready
EHLO localhost
250-[127.0.0.1]
250-VRFY
250-PIPELINING
250-SIZE
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250 XFORWARD NAME ADDR PROTO HELO
QUIT
221 2.0.0 [127.0.0.1] amavisd-new closing transmission channel

Si le test précédent échoue, les questions suivantes peuvent vous aider à trouver l'erreur :

  • le daemon amavisd tourne-t'il ?
  • le daemon a-t'il écrit des messages d'erreurs dans les logs ?
  • utilisez-vous la bonne adrese Ip et le bon port ?
  • le firewall bloque t'il les connexions ?

Tester le daemon Postfix de filtrage

Quand Postfix a été relancé, le nouveau, et dédié daemon smtp (127.0.0.1:10025) doit être activé. Une connexion fonctionnelle est similaire à celle ci-dessous :

$ telnet 127.0.0.1 10025
220 mx.leaves.org ESMTP (Mail Server)
EHLO localhost
250-mx.leaves.org
250-PIPELINING
250-SIZE 40960000
250-ETRN
250-STARTTLS
250-AUTH PLAIN CRAM-MD5 LOGIN DIGEST-MD5
250-AUTH=PLAIN CRAM-MD5 LOGIN DIGEST-MD5
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
QUIT
221 2.0.0 Bye

Si le test précédent échoue, les questions suivantes peuvent vous aider à trouver l'erreur :

  • Le daemon principal de Postfix fonctionne t'il ?
  • Postfix a t'il écrit des erreurs dans les logs ?
  • utilisez-vous la bonne adrese Ip et le bon port ?
  • le firewall bloque t'il les connexions ?

Installer et configurer les agents Vipul's Razor2

Maintenant que la configuration du daemon amavisd-new, de ses modules SpamAssassin, et l'interaction avec le MTA Postfix sont validées, il faut installer et configurer les agents Vipul's Razor2.

Le produit Vipul's Razor2 doit communiquer avec les serveurs de catalogue de spams pour classifier les messages. Cette communication s'effectue via le port tcp/2703. Le firewall du site doit donc autoriser le serveur de courriers à émettre des requêtes sortantes vers l'extérieur via le port tcp/2703.

Installer les agents Vipul's Razor2

Pour installer le package binaire des agents Vipul's Razor2, procédez comme suit :

# PKG_PATH="ftp://ftp.irisa.fr/pub/OpenBSD/$(uname -r)/packages/i386/"
# export PKG_PATH
# pkg_add razor-agents

Configurer Vipul's Razor2

Dans notre maquette, Vipul's Razor2 va être intégré à amavisd-new (plus précisément aux modules SpamAssassin), et va fonctionner dans la cage (/var/amavisd).

Modifier la configuration de SpamAssassin

Pour activer l'appel aux agents Vipul's Razor2 dans SpamAssassin, ajoutez la ligne suivante au fichier /var/amavisd/etc/mail/spamassassin/local.cf :

# enable Vipul's Razor2 checks
use_razor2 1

Modifier la configuration de amavisd-new

Vérifiez que la configuration de amavisd-new (via le fichier /var/amavisd/etc/amavisd.conf) autorise bien les tests réseaux :

# grep sa_local_tests_only /var/amavisd/etc/amavisd.conf
$sa_local_tests_only = 0;    # only tests which do not require internet access?

Si la variable sa_local_tests_only est positionnée à 1, alors les tests réseaux (tels que Razor2 ou DCC) sont désactivés.

Créer le fichier de configuration razor-agent.conf

Pour créer un fichier de configuration des agents Razor2, exécutez les commandes suivantes :

# razor-admin -home=/etc/razor -d -create
[...]
#
# ls /etc/razor
razor-agent.conf                        servers.discovery.lst
server.joy.cloudmark.com.conf           servers.nomination.lst
servers.catalogue.lst

Négocier l'enregistrement auprès du Nomination Server

Pour négocier l'enregistrement auprès du Nomiation Server, et créer le fichier identity exécutez la commande suivante :

# razor-admin -home=/etc/razor -d -register
[...]
# echo $?
0

Si la commande s'est exécutée sans erreur, le code de retour doit être égal à 0.

Intégrer les agents Razor2 dans la cage

Pour intégrer les agents Vipul's Razor2 dans la cage du daemon amavisd-new, exécutez les commandes suivantes :

# mv /etc/razor /var/amavisd/var/.razor
# chown -R _vscan:_vscan /var/amavisd/var/.razor
# chmod 750 /var/amavisd/var/.razor

Puis, créez le lien symbolique suivant pour faciliter l'accès aux données :

# cd /etc
# ln -s ../var/amavisd/var/.razor razor
# ls -l /etc/razor
lrwxr-xr-x  1 root  wheel  21 Jun 19 22:44 /etc/razor -> ../var/amavisd/var/.razor

Puis, redémarrez le daemon amavisd-new pour intégrer les modifications.

Note

Vipul's Razor2 n'utilise pas le daemon syslogd pour tracer son activité. Il utilise son propre fichier d'enregistrement : /var/amavisd/var/.razor/razor-agent.log.

Ce fichier risque de grossir avec le temps, et de remplir le répertoire /var/amavisd. Une fois que vous êtes sûr que razor2 est fonctionnel, il est conseillé de modifier comme suit le fichier /var/amavisd/var/.razor/razor-agent.conf :

debuglevel = 3

en

debuglevel = 0

Puis redémarrez le service amavisd-new.

Intégrer le service amavisd-new au système

Créer un script de démarrage

Pour arrêter et redémarrer amavisd de manière simple, créez un script de démarrage.

Pour ce faire, créez le répertoire /etc/rc.d comme suit :

# mkdir /etc/rc.d
# chown root:wheel /etc/rc.d
# chmod 750 /etc/rc.d

Puis, créez comme suit, le fichier de démarrage /etc/rc.d/amavisd.

Et enfin, positionnez les permissions :

# chown root:wheel /etc/rc.d/amavisd
# chmod 740 /etc/rc.d/amavisd

Modifier le fichier /etc/rc.conf.local

Pour gérer le service, ajoutez la ligne suivante à la fin du fichier /etc/rc.conf.local :

amavisd_flags=""     # for normal use: ""

Modifier le fichier /etc/rc.local

Pour lancer automatiquement le service au démarrage de la machine, ajoutez les lignes suivantes au début du fichier /etc/rc.local :

# Start amavisd-new
if [ -x /etc/rc.d/amavisd ]; then
        echo -n ' amavisd'; /etc/rc.d/amavisd start & >/dev/null
fi

Modifier le fichier /etc/rc.shutdown

Pour arrêter le service à l'arrêt de la machine, ajoutez les lignes suivantes à la fin du fichier /etc/rc.shutdown :

# Stop amavisd-new
if [ -x /etc/rc.d/amavisd ]; then
        echo -n ' amavisd'; /etc/rc.d/amavisd stop >/dev/null
fi

Modifier le fichier /etc/changelist

Pour que le système OpenBSD surveille les modifications apportées au script de démarrage et aux fichiers de configuration du service, ajoutez les lignes suivantes au fichier /etc/changelist :

/etc/rc.d/amavisd
/var/amavisd/etc/amavisd.conf
/var/amavisd/etc/mail/spamassassin/local.cf
/var/amavisd/var/.razor/razor-agent.conf

Entretenir 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 classifiés comme tel par SpamAssassin dans une boîte aux lettres.

Apprentissage

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”.

Apprendre ce qu’est un spam

Pour apprendre à SpamAssassin ce qu'est un courrier illégitime (spam), exécutez les commandes suivantes :

# /usr/local/bin/sa-learn \
--username=_vscan --progress \
--siteconfigpath /var/amavisd/etc/mail/spamassassin \
--spam <path/to/mbox/spam>
#
# chown _vscan /var/amavisd/var/.spamassassin/bayes*

Apprendre ce qu’est un ham

Pour apprendre à SpamAssassin ce qu'est un courrier légitime (ham), exécutez les commandes suivantes :

# /usr/local/bin/sa-learn \
--username=_vscan --progress \
--siteconfigpath /var/amavisd/etc/mail/spamassassin \
--ham --mbox <path/to/mbox/ham>
#
# chown _vscan /var/amavisd/var/.spamassassin/bayes*

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.

Vérifier la santé des bases

Pour vérifier la santé des bases bayes, exécutez périodiquement la commande suivante :

# /usr/local/bin/sa-learn \
--username=_vscan --progress \
--siteconfigpath /var/amavisd/etc/mail/spamassassin \
--force-expire --sync
#
# chown _vscan /var/amavisd/var/.spamassassin/bayes*

Liens

Annexes

Automatiser la création de la cage

Le script inst_amavisd_chroot.sh permet :

  • d'installer Amavisd-new, SpamAssassin, Vipul's Razor2 sur un système OpenBSD (i386),
  • de créer la cage /var/amavisd,
  • de copier les éléments nécessaires dans la cage

Une fois exécuté, il ne reste plus que la configuration des daemons à effectuer.

Superviser amavisd-new avec Nagios

Le script check_amavisd permet de tester le fonctionnement du service amavisd-new.

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