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.
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.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
donne la liste des paquets nécessaires
et recommandés pour le fonctionnement du service.$
apt-cache depends
amavisd-new
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
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, 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.
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 portudp/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.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)