Pour river leur clou aux virus et autres spams
Nous avons déjà pas mal protégé notre serveur, mais tout de même…
L'idéal serait de pouvoir connecter notre Postfix à des outils comme Clamav et Spamassassin, pour améliorer encore notre bien-être. Amavis est là pour répondre à cette question.
Amavis va servir de glue pour passer les messages entrants à des filtres comme Clamav et Spamassassin. Nous allons mettre CLamav à l'œuvre. Spamassassin.
Le module smtpd
va se connecter à Amavis par une connexion TCP sur le port 10024 par défaut. Lorsqu'un message entrera sur smtpd
, ce dernier le transmettra au service amavisd
.
Celui-ci va filtrer le message en le passant à Clamav (et à Spamassassin s'il est en état de fonctionner).
Amavis va alors retransmettre un message à smtpd
toujours par une connexion TCP, sur le port 10025 par défaut. Ce message retransmis pourra avoir plusieurs formes suivant le cas :
Debian stable c'est bien, mais ça vieillit parfois assez mal. Ce n'est souvent pas très gênant, sauf pour des applications comme Clamav ou Spamassassin. Le dépôt « volatile » est là pour pallier cet inconvénient. Il y a toute une série de miroirs dans le monde, choisissez celui qui vous convient et ajoutez-le à votre source.list
.
Il faut installer :
# aptitude search clamav | grep ^i i clamav - anti-virus utility for Unix - command-line i A clamav-base - anti-virus utility for Unix - base package i clamav-daemon - anti-virus utility for Unix - scanner daem i A clamav-freshclam - anti-virus utility for Unix - virus databa i clamav-testfiles - anti-virus utility for Unix - test files i A libclamav4 - anti-virus utility for Unix - library
Clamav-testfiles est optionnel, il fournit des fichiers de test.
Spamassassin mériterait à lui seul tout un chapitre. Nous nous contenterons ici de la configuration par défaut, juste pour vérifier que notre montage fonctionne.
Passons à la glue :
~# aptitude install amavisd-new Lecture des listes de paquets... Fait Construction de l'arbre des dépendances... Fait Lecture de l'information d'état étendu Initialisation de l'état des paquets... Fait Lecture des descriptions de tâches... Fait Construction de la base de données des étiquettes... Fait Les NOUVEAUX paquets suivants vont être automatiquement installés : libarchive-tar-perl libarchive-zip-perl libberkeleydb-perl libcompress-zlib-perl libconvert-binhex-perl libconvert-tnef-perl libconvert-uulib-perl libio-multiplex-perl libio-stringy-perl libio-zlib-perl libmailtools-perl libmime-perl libnet-cidr-perl libnet-server-perl libtimedate-perl libunix-syslog-perl Les NOUVEAUX paquets suivants vont être installés : amavisd-new libarchive-tar-perl libarchive-zip-perl libberkeleydb-perl libcompress-zlib-perl libconvert-binhex-perl libconvert-tnef-perl libconvert-uulib-perl libio-multiplex-perl libio-stringy-perl libio-zlib-perl libmailtools-perl libmime-perl libnet-cidr-perl libnet-server-perl libtimedate-perl libunix-syslog-perl 0 paquets mis à jour, 17 nouvellement installés, 0 à enlever et 0 non mis à jour. Il est nécessaire de télécharger 1772ko d'archives. Après dépaquetage, 5468ko seront utilisés. Voulez-vous continuer ? [Y/n/?] ...
Ce n'est pas parce que c'est installé que ça va coller tout seul. Nous avons un /usr/share/doc/amavisd-new/README.postfix.gz
qui va bien nous aider à l'interfacer avec Postfix.
La configuration d'amavisd-new sur Debian est une chose finalement assez amusante à faire. Tout est dans /etc/amavis/conf.d
# ls -l /etc/amavis/conf.d/ total 56 -rw-r--r-- 1 root root 1458 2007-02-24 19:30 01-debian -rw-r--r-- 1 root root 692 2007-02-24 19:30 05-domain_id -rw-r--r-- 1 root root 235 2007-02-24 19:30 05-node_id -rw-r--r-- 1 root root 13907 2007-02-24 19:30 15-av_scanners -rw-r--r-- 1 root root 554 2007-02-24 19:30 15-content_filter_mode -rw-r--r-- 1 root root 9187 2007-02-24 19:30 20-debian_defaults -rw-r--r-- 1 root root 573 2007-02-24 19:30 25-amavis_helpers -rw-r--r-- 1 root root 2130 2007-02-24 19:30 30-template_localization -rw-r--r-- 1 root root 1223 2008-06-23 14:19 50-user
Bref, il y en a dans tous les coins, à nous de nous y retrouver.
Comme dans toute critique d'un bon roman à « suspense » ou d'un bon jeu d'action, il faut bien se garder de déflorer l'intrigue, aussi vous laisserais-je le soin de vous y retrouver…
Juste un ou deux indices cependant, histoire de ne décourager personne :
50-user
est, en l'état, le dernier à être lu ;Tirez-en les conclusions qui s'imposent.
En lisant le fichier /etc/amavis/conf.d/15-content_filter_mode
, vous comprendrez probablement que pour activer l'appel de l'antivirus et de l'antispam :
use strict; # You can modify this file to re-enable SPAM checking through spamassassin # and to re-enable antivirus checking. # # Default antivirus checking mode # Uncomment the two lines below to enable it back # #@bypass_virus_checks_maps = ( # \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re); # # Default SPAM checking mode # Uncomment the two lines below to enable it back # #@bypass_spam_checks_maps = ( # \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re); 1; # insure a defined return
Nous allons bien nous garder de le faire, mais allons plutôt ajouter ces lignes dans 50-user
:
@bypass_virus_checks_maps = ( \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
@bypass_spam_checks_maps = ( \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
Il y a un fichier bien intéressant à lire : /etc/amavis/conf.d/20-debian_defaults
, car il contient bon nombre de paramètres de configuration d' Amavis. Dans les grandes lignes, mieux vaut garder cette configuration, sauf que :
En effet, Amavisd-new ne retranscrit les tags de spamassassin que pour les messages à destination des domaines référencés dans la variable (liste) @local_domains_acl
.
De plus, la variable $sa_kill_level_deflt
définit le score à partir duquel nous sommes « surs » qu'un message est un spam, et la variable $final_spam_destiny
indique quoi faire de ce message dans pareil cas.
Dans la configuration par défaut (allez fouiller dans /etc/amavis/conf.d/20-debian_defaults
), vous constaterez que si un message obtient un score >= 100, il est « D_BOUNCE » ce qui veut dire qu'il est mis en quarantaine locale et que le destinataire ne reçoit rien. Certes, un score de 100 est assez significatif mais tout de même, peut-être souhaiterez-vous vous montrer plus libéral.
La variable @local_domains_acl
telle qu'elle est configurée devrait faire l'affaire ici, mais n'ira pas dans le cas de domaines virtuels. Vérifiez tout de même, en cas de refus de tags de la part d'amavis, de vérifier que le problème ne vient pas de là. La configuration suivante :
@local_domains_acl = ( "." );
Permettra d'effectuer le marquage des tags antispam quel que soit le domaine de destination.
Enfin, les variables $sa_tag_level_deflt
et $sa_tag2_level_deflt
ont leur importance sur la façon dont le message est marqué, de même que $sa_spam_subject_tag
a un effet direct sur l'esthétique du message remis.
Voici un exemple de 50-user
# # Place your configuration directives here. They will override those in # earlier files. # # See /usr/share/doc/amavisd-new/ for documentation and examples of # the directives you can use in this file # #@local_domains_acl = ( "." ); # éventuellement, en cas de soucis @bypass_virus_checks_maps = ( \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re); @bypass_spam_checks_maps = ( \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re); $sa_tag_level_deflt = -9999; # note minimale pour ajouter les tags X-Spam... à l'en-tête des emails # ici, nous sommes à peu près surs que le tag sera toujours présent $sa_tag2_level_deflt = 5.0; # note minimale pour ajouter le tag X-Spam-Flag: YES # et modifier l'objet $sa_kill_level_deflt = 100; # note à partir de laquelle les mails sont traités comme définis # par la variable $final_spam_destiny (ici ils sont acceptés) $sa_spam_subject_tag = '[SPAM]'; # chaine ajoutée à l'objet de l'email $final_spam_destiny = D_PASS; # Pour ne pas en dire trop sur les armes employées $X_HEADER_LINE = "spam & virus filtering at $mydomain"; #------------ Do not modify anything below this line ------------- 1; # insure a defined return
Jusqu'à présent, nous avons pu éviter de toucher à master.cf
. Maintenant, il va falloir y aller.
Ce fichier de configuration permet essentiellement de configurer les divers services fournis par Postfix, ainsi que des services annexes que l'on peut lui rattacher. En gros, c'est un outil pour faire de la chirurgie dans l'architecture de Postfix. Il est donc recommandé d'y aller avec précautions.
Nous allons juste faire ce qui est dit dans la documentation d'amavisd-new :
Il faut ajouter ceci à la fin du fichier :
# # Amavisd-new # smtp-amavis unix - - - - 2 smtp -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes -o disable_dns_lookups=yes -o max_use=20 127.0.0.1:10025 inet n - - - - smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -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 mynetworks=127.0.0.0/8,,[::1]/128 -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
Ces deux paragraphes vont permettre la création des points d'accrochage entre le module smtpd
de Postfix et le daemon Amavisd
. De plus, il faudra modifier le fichier main.cf
pour indiquer à Postfix que smtpd
doit se connecter à Amavisd.
Les options (-o) indiquées ici surchargeront éventuellement celles qui seraient données dans main.cf
pour les services en question, c'est à dire d'une part smtp-amavis
et d'autre part le service smtpd attaché à amavis sur le port 10025.
Il y a juste une ligne à ajouter :
content_filter=smtp-amavis:[127.0.0.1]:10024
Enfin, comme le dit la documentation de Amavisd-new, il faut ajouter l'utilisateur clamav
sous l'identité duquel le service de l'antivirus (clamd) tourne, au groupe amavis
:
# usermod -a -G amavis clamav
Après avoir relancé amavis
et forcé Postfix à relire sa configuration, vérifions que Amavisd-new tourne, Postfix (et Dovecot) aussi :
~# netstat -tap
Connexions Internet actives (serveurs et établies)
Proto Recv-Q Send-Q Adresse locale Adresse distante Etat PID/Program name
tcp 0 0 localhost:10024 *:* LISTEN 4280/amavisd (master)
tcp 0 0 localhost:10025 *:* LISTEN 2532/master
...
tcp 0 0 *:imap2 *:* LISTEN 3536/dovecot
tcp 0 0 *:smtp *:* LISTEN 2532/master
Nous envoyons un message à test@nain-t.net et regardons l'en-tête du message reçu :
Return-Path: <machin@chose.truc>
Received: from cyrus.nain-t.net ([unix socket])
by cyrus.nain-t.net (Cyrus v2.2.13-Debian-2.2.13-10) with LMTPA;
Mon, 23 Jun 2008 14:20:47 +0200
X-Sieve: CMU Sieve 2.2
Received: from localhost (localhost [127.0.0.1])
by cyrus.nain-t.net (Postfix) with ESMTP id B1DC080FF274
for <test@nain-t.net>; Mon, 23 Jun 2008 14:20:47 +0200 (CEST)
X-Virus-Scanned: spam & virus filtering at cyrus.nain-t.net
X-Spam-Score: 0.644
X-Spam-Level:
X-Spam-Status: No, score=0.644 tagged_above=-9999 required=5 tests=[AWL=0.644]
Received: from cyrus.nain-t.net ([127.0.0.1])
by localhost (cyrus.nain-t.net [127.0.0.1]) (amavisd-new, port 10024)
with ESMTP id D38UlkWl4ypt for <test@nain-t.net>;
Mon, 23 Jun 2008 14:20:40 +0200 (CEST)
Received: from smtp20.orange.fr (smtp20.orange.fr [193.252.22.29])
by cyrus.nain-t.net (Postfix) with ESMTP id 26C1880FF273
for <test@nain-t.net>; Mon, 23 Jun 2008 14:20:39 +0200 (CEST)
Received: from me-wanadoo.net (localhost [127.0.0.1])
by mwinf2018.orange.fr (SMTP Server) with ESMTP id 1DA561C00046
for <test@nain-t.net>; Mon, 23 Jun 2008 14:20:37 +0200 (CEST)
Received: from jupiter.chose.truc (LSt-Amand-152-32-18-95.w82-127.abo.wanadoo.fr [82.127.57.95])
by mwinf2018.orange.fr (SMTP Server) with ESMTP id F39901C000BA
for <test@nain-t.net>; Mon, 23 Jun 2008 14:20:36 +0200 (CEST)
X-ME-UUID: 20080623122036997.F39901C000BA@mwinf2018.orange.fr
Received: from [172.16.129.245] (test-desktop.chose.truc [172.16.129.245])
by jupiter.chose.truc (Postfix) with ESMTP id 8977EEA3
for <test@nain-t.net>; Mon, 23 Jun 2008 14:20:36 +0200 (CEST)
Message-ID: <485F9514.4000807@eme-enseignement.fr>
Date: Mon, 23 Jun 2008 14:20:36 +0200
From: machin <machin@chose.truc>
User-Agent: Thunderbird 2.0.0.14 (X11/20080505)
MIME-Version: 1.0
To: test@nain-t.net
Subject: test des tags
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
ça taggue.
Si nous avions le temps, nous pourrions aussi envoyer un message identique à celui qui est fourni en exemple de spam avec spamassassin, pour constater que le travail est bien fait. De mêqme, nous pouvons aussi envoyer un exemple de virus fourni avec Clamav et constater qu'il est mis en quarantaine et non transmis au destinataire
Enfin, il faut s'assurer que le dossier de quarantaine ne va pas exploser. Peut-être faut-il écrire un script qui nettoie les messages trop vieux, ou même créer une poubelle sans fond (/dev/null
) ?
Il n'y a pas qu'Amavis qui permette l'interaction de Postfix avec des filtres de messages. Il y a aussi MailScanner. Sa méthode de rattachement à Postfix est bien plus simple (peut-être même un peu simpliste), mais pour ce que nous avons fait ici, MailScanner aurait pu suffire.