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-newet ses modulesSpamassassin - 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
/varou/var/amavisdne doit pas être montée avec les optionsnodevninoexecpuisque le daemonamavisd-newva 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
amavisdtourne-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
mboxd'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.