Humus numericus

Aller au contenu | Aller au menu | Aller à la recherche

R, Spip et autres

Mot-clé - clamav

Fil des billets

lundi 6 février 2006

Mettre en place un antivirus pour Linux à la maison

A priori, le fait d'utiliser un système Linux met déjà son utilisateur à l'abri de la plupart des virus circulant sur le réseau et qui ciblent des systèmes plus répandus et moins fiables (suivez mon regard). Mais cela ne dispense pas d'utiliser un antivirus, surtout quand il en existe de très bons libres et gratuits comme ClamAV.

Voici la méthode que j'utilise pour filtrer mes mails à la maison. Elle utilise un ptit script Perl trouvé sur le web, et n'est certainement pas adéquate pour un gros serveur gérant des dizaines de comptes mails. Elle suppose que vous ayiez déjà un MTA (type postfix ou exim) qui tourne sur votre machine.

La première chose à faire est d'installer clamav en tant que démon. Sous Debian, comme toujours, c'est très simple, en une commande on installe tout ça ainsi que le service de mise à jour automatique de la base de virus :

# apt-get install clamav-freshclam clamav-daemon

La seconde chose est de faire passer tous les mails à travers l'antivirus. Ceci se fait à l'aide de la commande clamdscan. La solution la plus simple que j'ai trouvée consiste en un petit script Perl nommé clamfilter.pl. Le seul inconvénient est qu'il n'utilise pas le démon, mais le client clamav qui lui lance un processus à chaque mail scanné et prend beaucoup plus de ressources système. Le script étant du domaine public (vive le libre !), j'ai donc modifié une dizaine de caractères pour lui faire utiliser clamdscan plutôt que clamscan. Le résultat est le suivant :

#!/usr/bin/perl -w
#
# ClamFilter 1.0
# by Matt Hahnfeld (http://www.everysoft.com/)
# Requires perl, clamscan, procmail, and this script.
#
# This script is public domain.
#

use strict;
use File::Temp 'tempfile';

&main();
exit 0;

sub main {
  # Set up a temporary file for the original message
  my ($tmpfh, $tmpfn) = tempfile( UNLINK => 1 );
  -w $tmpfn or die 'Could not open temp file!';

  # Pass 1: Write out the temporary file
  while (<STDIN>) {
    print $tmpfh $_;
  }
  seek($tmpfh, 0, 0);

  # Pass 2: Scan the message
  open CLAMSCAN, "/bin/cat $tmpfn | /usr/bin/clamdscan --stdout - 2>/dev/null |" or die 'Could not open clamscan!';
  my $clamstatus = qq|X-Virus-Found: yes
X-Virus-Status:
 
 Virus Scan Status:
 
|;
  while (<CLAMSCAN>) {
    $clamstatus .= ' ' . $_;
  }
  close CLAMSCAN;
  $clamstatus .= qq| 
 

|;

  # Pass 3: Print out the message
  my $bodyflag = 0;
  while (<$tmpfh>) {
    if (! $bodyflag and $_ eq "
") {
      if ($?) {
	print $clamstatus;
      }
      else {
	print "
";
      }
      $bodyflag = 1;
    }
    else {
      print;
    }
  }
}

L'installation de ce script est très simple : copiez le contenu dans un fichier /usr/local/bin/clamfilter.pl, rendez le exécutable avec un petit chmod +x clamfilter.pl et ajoutez la ligne suivante dans votre fichier .procmailrc :

:0fw
| /usr/local/bin/clamfilter.pl

Et voilà ! Normalement tous vos mails devraient être scannés avant leur distribution. S'ils contiennent un virus détecté, le script rajoute un flag X-virus-found: yes dans les en-têtes (pratique pour créer des filtres automatiques dans votre lecteur de mail préféré) et ajoute quelques lignes d'information au début du message.

Vous pouvez tester le bon fonctionnement de votre installation d'abord en vérifiant qu'un mail normal passe sans problème, et ensuite en testant avec le fichier de test d'antivirus eicar.