Debian logo [inetdoc.LINUX]

3. Le service amavisd-new

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.

3.1. L'installation

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.

3.1.1. Le téléchargement des sources et les dépendances

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 :

  1. 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
    
  2. 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).

3.2. La gestion de l'arborescence de quarantaine

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.

3.3. La libération d'un message en quarantaine

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++ ))1 ; do \
zcat /var/log/amavis.mail.info.$i.gz |grep "fram\.fr"2 |grep "Blocked" ; \
done

Feb  9 08:59:23 MailGw amavis[30460]: (30460-14) Blocked SPAM,3 [aaa.bbb.ccc.ddd] \
<xxxxxxxx@fram.fr> -> <DIRECTION@xxxxx.FR>, quarantine: l/spam-l1bnIZN88okd.gz4, \
Message-ID: <45CC2AC0.2090800@fram.fr>, mail_id: l1bnIZN88okd, Hits: 8.43,5 4730 ms

1

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.

2

La scrutation recherche une ligne comprenant le domaine de l'adresse de courrier électronique suspecte ainsi que le mot clé Blocked indiquant que le courrier n'a pas été transmis à son destinataire.

3 5

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.

4

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.

3.4. La reconnaissance passive d'empreinte de système d'exploitation

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 :

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

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

  3. 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)