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.

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.7.x
# cd amavisd-new-2.7.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.

L'exécution de la commande $ apt-cache depends amavisd-new donne la liste des paquets nécessaires et recommandés pour le fonctionnement du service.

On affiche les versions de la liste des paquets ci-dessus pour faire la correspondance avec le fichier INSTALL à l'aide de la commande suivante.

$ dpkg -l file libconvert-tnef-perl \
  libconvert-uulib-perl libcompress-zlib-perl libarchive-zip-perl \
  libmailtools-perl libmime-perl libunix-syslog-perl libnet-server-perl \
  perl spamassassin clamav clamav-daemon lha arj rar zoo nomarch cpio lzop pax

Comme les numéros de version évoluent régulièrement, donner le résultat des deux commandes précédentes ne présente pas un grand intérêt. Il faut simplement suivre régulièrement l'évolution des paquets en question de façon à ce que la suite des outils soit pleinement efficace.

Une fois les paquets correctement installés, on contrôle la disponibilité des fonctions en lançant le service en mode debug. Dans ce mode, l'exécution du démon lance un processus non détaché du shell courant et tous les messages sont directement envoyés dans le terminal. On lance la commande # amavisd debug.

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, xml: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.8-2         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.

    # grep p0f /etc/amavisd.conf
    $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)