Le service amavisd-new n'est pas unique en son genre, mais il n'existe pas beaucoup d'équivalents. Citons juste MIMEDefang qui s'appuie sur milter pour composer un système de filtrage centralisé du courrier électronique.
Le service amavisd-new est une branche de la famille Amavis. Parmi les autres membres on trouve : amavis-perl, amavisd et amavis-ng. Aujourd'hui, le code du service amavisd-new est très éloigné des versions initiales d'amavis-perl.
Le code du service amavisd-new a été complètement revu. Il se distingue par l'utilisation de démons pour lesquels toutes les phases d'initialisations sont effectuées avant de commencer les traitements sur le courrier électronique. C'est ce «pré-chargement» de démon pour chaque fonction de sécurité qui assure une tenue en charge très supérieure à celle obtenue avec les outils classiques qui recourent massivement au système de fichiers.
Bien qu'il existe un paquet Debian dont l'évolution est présentée à la page : amavisd-new source package, celui-ci n'est pas mis à jour assez fréquemment pour pouvoir coller à l'actualité de la sécurité du courrier électronique. On touche ici à la question sensible de la Veille Sécurité (FIXME section journalisation). Il est possible que dans les semaines à venir la maintenance du paquet Debian rattrape son retard. Il serait alors préférable de l'utiliser. Depuis Janvier 2004, les vagues de (virus|vers) ont précipité les évolutions du service amavisd-new. Dans le cas de l'utilisation de milter (FIXME section sendmail), il est indispensable d'utiliser les sources à la place du paquet.
Le présent document décrit donc l'installation du service amavisd-new à partir de ses sources disponibles à la page : amavisd-new. Comme la distribution utilisée est Debian GNU/Linux, l'organisation des fichiers et répertoires du service essaie de se conformer aux recommandations de la Charte Debian.
Enfin, ce qui suit ne peut se substituer à la documentation officielle
sur l'installation du service : le fichier
INSTALL.
Rien de bien original pour ce qui concerne l'obtention des sources :
$ wget http://www.ijs.si/software/amavisd/amavisd-new.tar.gz
$ su
# mv amavisd-new.tar.gz /usr/local/src ; cd /usr/local/src
# tar xf amavisd-new.tar.gz
# chown -R root.src amavisd-new-2.4.x
# cd amavisd-new-2.4.x
# cp amavisd amavisd-agent amavisd-nanny amavisd-release p0f-analyzer.pl \
/usr/local/sbin
Pour ce qui est des autres logiciels nécessaires au fonctionnement du
service, il faut comparer la liste fournie dans le fichier
INSTALL et les dépendances du paquet Debian. Voici ce que
l'on obtient avec une installation Debian/testing :
On liste les dépendances de paquets :
$ apt-cache depends amavisd-new
amavisd-new
|Dépend: debconf
Dépend: <debconf-2.0>
cdebconf
debconf
Dépend: adduser
Dépend: file
Dépend: libmime-perl
|Dépend: libmime-perl
Dépend: libmime-perl
Dépend: libconvert-tnef-perl
Dépend: libconvert-uulib-perl
Dépend: libcompress-zlib-perl
Dépend: libarchive-tar-perl
Dépend: libarchive-zip-perl
Dépend: libmailtools-perl
Dépend: libunix-syslog-perl
|Dépend: libnet-perl
Dépend: perl-modules
Dépend: libnet-server-perl
Dépend: <libtime-hires-perl>
perl
Dépend: <libdigest-md5-perl>
perl
Dépend: <libmime-base64-perl>
perl
Dépend: libio-stringy-perl
Dépend: libberkeleydb-perl
|Dépend: exim4
Dépend: <mail-transport-agent>
courier-mta
esmtp-run
exim
hula-mta
masqmail
msmtp-mta
nullmailer
postfix
sendmail-bin
smail
ssmtp
xmail
exim4-daemon-heavy
nbsmtp
exim4-daemon-light
Dépend: perl
Suggère: spamassassin
Suggère: clamav
Suggère: clamav-daemon
Suggère: lha
Suggère: arj
Suggère: unrar
Suggère: zoo
Suggère: nomarch
Suggère: cpio
Suggère: lzop
Suggère: cabextract
Suggère: apt-listchanges
Suggère: libnet-ldap-perl
Suggère: libauthen-sasl-perl
Suggère: libdbi-perl
Est en conflit avec: <amavis>
Remplace: <amavis>
amavisd-new
On affiche les versions de la liste des paquets ci-dessus pour faire
la correspondance avec le fichier
INSTALL :
$ dpkg -l adduser file libconvert-tnef-perl libconvert-uulib-perl \ libcompress-zlib-perl libarchive-tar-perl libarchive-zip-perl libmailtools-perl \ libunix-syslog-perl libnet-server-perl perl spamassassin clamav clamav-daemon \ lha arj rar zoo nomarch cpio lzop pax apt-listchanges \ Souhait=inconnU/Installé/suppRimé/Purgé/H=à garder | État=Non/Installé/fichier-Config/dépaqUeté/échec-conFig/H=semi-installé |/ Err?=(aucune)/H=à garder/besoin Réinstallation/X=les deux (État,Err: maj=mauvais) ||/ Nom Version Description +++-======================-==========-============================================== ii adduser 3.102 Add and remove users and groups ii apt-listchanges 2.72.5 Display change history from .deb archives ii arj 3.10.22-2 archiver for .arj files ii clamav 0.90.1-2 antivirus scanner for Unix ii clamav-daemon 0.90.1-2 antivirus scanner daemon ii cpio 2.6-17 GNU cpio a program to manage archives of files ii file 4.17-5 Determines file type using "magic" numbers ii lha 1.14i-10.1 lzh archiver ii libarchive-tar-perl 1.30-2 Archive::Tar - manipulate tar files in perl ii libarchive-zip-perl 1.16-1 Module for manipulation of ZIP archives ii libcompress-zlib-perl 1.42-2 Perl module for manipulation of gzip files ii libconvert-tnef-perl 0.17-5 Perl module to read TNEF files ii libconvert-uulib-perl 1.06-1 Perl interface to the uulib library ii libmailtools-perl 1.74-1 Manipulate email in perl programs ii libnet-server-perl 0.94-1 An extensible, general perl server engine ii libunix-syslog-perl 0.100-5 Perl interface to the UNIX syslog(3) calls ii lzop 1.01-4 fast compression program ii nomarch 1.3-3 Unpacks .ARC and .ARK MS-DOS archives ii pax 1.5-15 Portable Archive Interchange ii perl 5.8.8-7 LW's Practical Extraction and Report Language ii rar 3.7b1-2 Archiver for .rar files ii spamassassin 3.1.7-2 Perl-based spam filter using text analysis ii zoo 2.10-18 manipulate zoo archives
Ces numéros version évoluent régulièrement. Les indications de liste ci-dessus ne sont pas à prendre au pied de la lettre. On retrouve dans le journal de démarrage du service, les versions reconnues par amavisd-new (FIXME démarrage amavisd-new).
Une politique minimum de gestion des messages mis en quarantaine est nécessaire pour ne pas saturer l'espace de stockage d'une passerelle de courrier électronique. Ici, on se fixe comme règle de conserver les spams pendant 90 jours et les messages infectés pendant 6 jours. Ainsi, si un utilisateur du service de messagerie émet une réclamation sur un message à l'administrateur de la passerelle, il est toujours possible de retrouver le message en question et d'extraire manuellement une partie non infectée. Il s'agit plus d'une précaution d'usage que d'une pratique d'exploitation sachant qu'un message reconnu comme porteur de virus est rarement réclamé par son émetteur ou son destinataire.
Par configuration du service amavisd-new, le
répertoire de quarantaine est généralement : /var/lib/amavis/virusmails/. Il contient
l'ensemble des messages interceptés.
L'application des règles énoncées ci-avant, se fait à l'aide d'un
simple script shell placé dans le répertoire /etc/cron.daily. Voici le code du script
quarantine-cleanup :
#!/bin/bash
if [ -d /var/lib/amavis/virusmails/ ]; then
find /var/lib/amavis/virusmails/ -mtime +90 -exec rm -rf {} \;
fi
for file in `find /var/lib/amavis/virusmails/ -type f -name "virus*" -mtime +6 \
-exec grep -l ^'X-Amavis-Alert: INFECTED' {} \;` ; do
rm -rf $file
done
exit 0
En ayant placé le script dans le répertoire indiqué, le service de planification cron lance son exécution tous les jours à 6h25.
Le service amavisd-new prévoit que l'on puisse libérer un message placé en quarantaine par erreur. Même si le nombre de faux positifs est extrêmement faible, il est important de pouvoir effectuer des recherches pour identifier et forcer la transmission d'un message placé en quarantaine.
L'archive de distribution du service contient un utilitaire dédié
appelé amavisd-release que l'on place
habituellement dans le même répertoire que le démon du service :
/usr/local/sbin.
Il faut intervenir sur la configuration du service en éditant le
fichier amavisd.conf pour autoriser le fonctionnement de
l'utilitaire.
$policy_bank{'AM.PDP-SOCK'} = {
protocol => 'AM.PDP', # Amavis policy delegation protocol
auth_required_release => 0, # don't require secret_id for amavisd-release
};
<snip/>
$interface_policy{'SOCK'} = 'AM.PDP-SOCK';
Ces deux modifications du fichier de configuration prinicpal du service
ont pour but d'autoriser l'accès au socket UNIX du
démon amavisd via l'utilitaire
amavisd-release.
Sachant que par configuration, on a choisi de placer les
sockets dans le répertoire /var/run/amavis, il faut aussi éditer le fichier
source de l'utilitaire pour qu'il communique avec le bon fichier de
socket.
$ ll /var/run/amavis/amavisd.sock srwxr-x--- 1 amavis amavis 0 2007-03-21 17:26 /var/run/amavis/amavisd.sock
La modification correspondante dans le code de l'utilitaire amavisd-release donne :
$ diff -uBb /usr/local/src/amavisd-new-2.4.5/amavisd-release amavisd-release
--- /usr/local/src/amavisd-new-2.4.5/amavisd-release 2006-08-08 20:14:47.000000000 +0200
+++ amavisd-release 2007-03-21 17:24:23.000000000 +0100
@@ -76,7 +76,7 @@
$log_level = 1;
# $socketname = '127.0.0.1:9998';
- $socketname = '/var/amavis/amavisd.sock';
+ $socketname = '/var/run/amavis/amavisd.sock';
sub sanitize_str {
my($str, $keep_eol) = @_;
Maintenant que l'utilitaire est prêt à fonctionner, il faut trouver un faux positif en quarantaine à libérer. Nous allons prendre un cas classique de service publicitaire sensible pour les utilisateurs et la réputation de l'administrateur du service de courrier électronique : une agence de voyage !.
Comme on a pris soin de journaliser toutes les transactions du service amavisd-new, on commence par rechercher les références d'un message mis en quarantaine avec l'adresse de notre fameuse agence de voyage.
$ for (( i=2 ; i < 50 ; i++ )); do \ zcat /var/log/amavis.mail.info.$i.gz |grep "fram\.fr"
|grep "Blocked" ; \ done Feb 9 08:59:23 MailGw amavis[30460]: (30460-14) Blocked SPAM,
[aaa.bbb.ccc.ddd] \ <xxxxxxxx@fram.fr> -> <DIRECTION@xxxxx.FR>, quarantine: l/spam-l1bnIZN88okd.gz
, \ Message-ID: <45CC2AC0.2090800@fram.fr>, mail_id: l1bnIZN88okd, Hits: 8.43,
4730 ms
|
Avec une rotation quotidienne des journaux du service de courrier électronique, la recherche est effectuée sur les 50 derniers jours moins les deux les plus récents pour lesquels les journaux ne sont pas compressés. |
|
|
La scrutation recherche une ligne comprenant le domaine de l'adresse
de courrier électronique suspecte ainsi que le mot clé
|
|
|
Le résultat de la recherche montre qu'un message émis depuis le domaine suspect a bien été considéré comme un spam et qu'il a obtenu un score supérieur au seuil de mise en quarantaine mais relativement faible comparé au flot de spams habituel. Dans cet exemple, le seuil de mise en quarantaine est de 6.31 et le score atteint est de 8.43. Les scores classiques obtenus par les spams dépassent facilement les 20 points. |
|
|
Le même résultat de recherche désigne la référence du fichier de quarantaine. C'est cette référence qui doit être utilisée par l'utilitaire amavisd-release pour extraire le message et le transmettre au MTA. |
# amavisd-release l/spam-l1bnIZN88okd.gz 250 2.6.0 Ok, id=rel-l1bnIZN88okd, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as AF6DF4E8004
L'appel à l'utilitaire amavisd-release indique que le message à été transmis au gestionnaire de mise en file d'attente du service de courrier électronique (MTA).
Dernière remarque très importante ; toutes ces opérations ont été effectuées sans jamais consulter le contenu du moindre message. On respecte ainsi caractère privé du courrier électronique.
Comme les journaux peuvent être déposés sur un serveur dédié et que l'utilitaire amavisd-release peut communiquer via un socket inet, il est possible d'organiser la délégation d'administration de façon à ce qu'il soit totalement impossible à l'administrateur responsable de la «libération» des messages d'en connaître le contenu.
Depuis la version 2.4.0, le service
amavisd-new propose de compléter la pondération
des scores calculés par spamassassin en exploitant
les informations fournies par le scanner passif
p0f.
Il existe une condition importante pour l'exploitation de cet outil.
L'adresse IP de l'hôte pair du dialogue SMTP doit être
transmise au service amavisd-new par l'agent de
transport de courrier électronique (Mail Transfer
Agent ou MTA). Dans le cas de
Postfix, l'extension XFORWARD
doit être activée. Voici un extrait du fichier de configuration
master.cf de Postfix.
smtp-amavis unix - - y - 2 lmtp
-o lmtp_data_done_timeout=1200
-o lmtp_send_xforward_command=yes
-o max_use=20
Le fichier
RELEASE_NOTES contient les instructions de
configuration de transfert des résultats de p0f
vers amavisd-new puis
spamassassin. Le principe de fonctionnement est le
suivant :
Le scanner p0f est exécuté de façon à
identifier le système d'exploitation de l'hôte pair lors du dialogue
SMTP. Il intercepte donc les requêtes sur le port
destination tcp/25 et génère des rapports sur la console
courante.
Le programme p0f-analyzer.pl, fourni avec
la distribution du service amavisd-new, lit le
rapport du scanner p0f sur la console courante
(flux stdin). Ce programme conserve en cache pendant 10
minutes les rapports générés par p0f. Ce même
programme reste en écoute sur le port udp/2345 de
l'interface de boucle locale. Tous les paramètres indiqués ici sont soit
des valeurs par défaut soit donnés dans la ligne de commande.
Le service amavisd-new interroge le programme p0f-analyzer.pl qui maintient les rapports du scanner en cache. Les informations collectées sont transmises à spamassassin via un champ d'en-tête inséré spécifiquement. Il faut éditer le fichier de configuration du service pour activer cette fonctionnalité.
Pour mettre en place cet outil, on effectue les opérations suivantes :
Installation du paquet p0f.
# dpkg -l p0f Souhait=inconnU/Installé/suppRimé/Purgé/H=à garder | État=Non/Installé/fichier-Config/dépaqUeté/échec-conFig/H=semi-installé |/ Err?=(aucune)/H=à garder/besoin Réinstallation/X=les deux (État,Err: maj=mauvais) ||/ Nom Version Description +++-===============-===============-================================================ ii p0f 2.0.5-1 Passive OS fingerprinting tool
Lancement du scanner et du gestionnaire de cache de rapports d'identification.
# p0f -l -i eth0 'dst host <MailGw_IP_address> and tcp dst port 25' 2>&1 \ | p0f-analyzer.pl 2345 &
Édition du fichier amavisd.conf pour décommenter
la ligne d'appel au programme
p0f-analyzer.pl.
# cat /etc/amavisd.conf |grep p0f $os_fingerprint_method = 'p0f:127.0.0.1:2345'; # query p0f-analyzer.pl
Insertion des scores à intégrer dans les calculs de spamassassin dans le fichier de configuration global.
# echo # p0f \ header L_P0F_WXP X-Amavis-OS-Fingerprint =~ /^Windows XP/ \ score L_P0F_WXP 3.5 \ header L_P0F_W X-Amavis-OS-Fingerprint =~ /^Windows(?! XP)/ \ score L_P0F_W 1.7 \ header L_P0F_UNKN X-Amavis-OS-Fingerprint =~ /^UNKNOWN/ \ score L_P0F_UNKN 0.8 \ header L_P0F_Unix X-Amavis-OS-Fingerprint =~ /^((Free|Open|Net)BSD|Solaris|HP-UX|Tru64)/ \ score L_P0F_Unix -1.0 \ >> /etc/spamassassin/local.cf
Après redémarrage du service amavisd-new,
on peut valider le fonctionnement de l'identification passive de système
d'exploitation en consultant les journaux système. Dans l'exemple
ci-dessous, on constate que le score a été augmenté à partir de la
correspondance : L_P0F_W=1.7.
MailGw amavis[23777]: (23777-08) OS_fingerprint: 88.242.7.27 \ 46.023 Windows 2000 SP4, XP SP1, (distance 19, link: unknown-1460) MailGw amavis[23777]: (23777-08) SPAM, <xxxx@xxx-xx.com> -> <xxxxx@xxx-xxx3.fr>, \ Yes, score=46.023 tag=-999 tag2=6.31 kill=6.31 tests=[BAYES_95=5, DCC_CHECK=4.5, \ DIGEST_MULTIPLE=0.765, HTML_MESSAGE=0.001, L_P0F_W=1.7, MIME_HTML_ONLY=0.001, \ NO_RECEIVED=-0.001, NO_RELAYS=-0.001, RAZOR2_CF_RANGE_51_100=3.5, \ RAZOR2_CF_RANGE_E4_51_100=1.5, RAZOR2_CF_RANGE_E8_51_100=1.5, \ RAZOR2_CHECK=2.5, SARE_SPEC_REPLICA_OBFU=1.812, SARE_SPEC_ROLEX_NOV5A=1.062, \ URIBL_AB_SURBL=3.812, URIBL_BLACK=3, URIBL_JP_SURBL=4.087, URIBL_OB_SURBL=3.008, \ URIBL_SBL=1.639, URIBL_SC_SURBL=4.498, URIBL_WS_SURBL=2.14], \ autolearn=spam, quarantine ZLIibG52Rt-A (spam-quarantine)
Vous êtes ici :