Debian logo [inetdoc.LINUX]

5. Les antivirus

À l'heure actuelle, utiliser une seule source de signature de virus n'est pas très professionnel. De nombreux exemples ont montré qu'il est très utile d'utiliser plusieurs antivirus en parallèle pour le traitement du courrier électronique.

  • La réactivité des équipes techniques des fournisseurs d'antivirus doit être inférieure à la dizaine de minutes. Face à une contrainte aussi «infernale», il est tout à fait normal qu'un nouveau (ver|virus) échappe à la vigilance d'un fournisseur. Il est donc logique de chercher à mettre toutes les chances de son côté en utilisant plusieurs antivirus de (sources|marques) différentes.

  • Tous les antivirus ne fonctionnent pas de la même façon. Il existe plusieurs techniques d'analyse qui donnent des résultats différents suivant les modes de propagation des codes malveillants. Là encore, il est logique de chercher à mettre toutes les chances de son côté ...

5.1. Clam AntiVirus

En quelques années, le projet ClamAV™ est devenu la référence en matière de logiciel libre antivirus. La réactivité de l'équipe de développement est excellente qu'il s'agisse de la vitesse de publication des signatures de nouveaux virus ou des publications de correctifs de sécurité du logiciel lui-même.

L'installation et la configuration de cet antivirus est assez immédiate dans la mesure où le paquet Debian est parfaitement maintenu et son adaptation au service amavisd-new ne demande pas beaucoup d'efforts.

5.1.1. Paquets Debian à installer

Les paquets Debian à installer pour une utilisation avec le service amavisd-new sont donnés dans la liste suivante :

$ dpkg -l *clam* |grep ^ii
ii  clamav            0.90.1-2  antivirus scanner for Unix
ii  clamav-base       0.90.1-2  base package for clamav, an anti-virus utility
ii  clamav-daemon     0.90.1-2  antivirus scanner daemon
ii  clamav-freshclam  0.90.1-2  downloads clamav virus databases from the Internet
ii  libclamav2        0.90.1-2  virus scanner library

Cette liste comprend trois fonctions distinctes.

clamav

Ce paquet contient le scanner clamscan que l'on utilise au niveau système de fichiers. Ce mode de traitement est excessivement coûteux en temps d'accès disque et dégrade très sensiblement les performances du traitement du courrier électronique. Le service amavisd-new ne fait appel à ce scanner qu'en secours ; lorsque les antivirus primaires travaillant en RAM ne sont plus disponibles.

Vis-à-vis du service amavisd-new, le scanner est un antivirus secondaire. On obtient les informations suivantes lors du lancement du service.

amavis[3000]: Found secondary av scanner ClamAV-clamscan at /usr/bin/clamscan
clamav-daemon

Ce paquet contient le démon clamd qui réside en mémoire de façon permanente et qui communique avec le service amavisd-new via un socket UNIX. C'est ce mode de traitement qui donne les meilleures performances. Une fois que le service a extrait tous les objets contenu dans les champs d'un message, il transmet ces objets aux anitivirus pour examen. Il est possible de stocker les objets à traiter dans un système de fichiers «monté» en RAM pour accroître encore les performances.

Vis-à-vis du service amavisd-new, le démon est un antivirus primaire. On obtient les informations suivantes lors du lancement du service.

amavis[3000]: Using internal av scanner code for (primary) ClamAV-clamd
freshclam

Ce paquet contient le démon freshclam qui réside en mémoire de façon permanente et qui collecte périodiquement les nouvelles signatures de virus. Ce démon est aussi chargé de notifier le démon clamd pour qu'il recompose son cache en fonction des nouvelles signatures.

Ce démon n'a aucune interaction avec le service amavisd-new.

5.1.2. Interaction avec amavisd-new

Comme les communications entre les démons freshclam, clamd et le service amavisd-new son basées sur un socket UNIX, les principales opérations de configuration consistent à organiser l'arborescence et les permissions sur le système de fichiers.

  1. On choisit de stocker les informations sur l'état courant des démons dans le répertoire /var/run/amavis.

  2. Ce répertoire et tous ses objets doivent avoir pour propriétaire l'utilisateur et le groupe amavis.

En cours d'exécution, on obtient les informations suivantes.

$ ls -lA /var/run/amavis/
total 8
-rw-r----- 1 amavis amavis 0 2006-12-30 19:21 amavisd.lock
-rw-r----- 1 amavis amavis 5 2006-12-30 09:35 amavisd.pid
srwxr-x--- 1 amavis amavis 0 2006-12-30 09:35 amavisd.sock
-rw-rw---- 1 amavis amavis 4 2006-12-30 09:34 clamd.pid
srwxrwxrwx 1 amavis amavis 0 2006-12-30 09:34 clamd.sock
Configuration de freshclam

La configuration de ce démon suit les directives du paquet Debian.

$ cat /etc/clamav/freshclam.conf
# Automatically created by the clamav-freshclam postinst
# Comments will get lost when you reconfigure the clamav-freshclam package

DatabaseOwner clamav
UpdateLogFile /var/log/clamav/freshclam.log
LogFileMaxSize 0
MaxAttempts 5
# Check for new database 8 times a day
Checks 8
DatabaseMirror db.local.clamav.net
DatabaseMirror database.clamav.net
DatabaseDirectory /var/lib/clamav/
NotifyClamd 1
DNSDatabaseInfo current.cvd.clamav.net

1

La notification du démon clamd est l'élément essentiel de ce fichier de configuration.

Configuration de clamd

La configuration de ce démon suit aussi les directives du paquet Debian.

$ cat /etc/clamav/clamd.conf
#Automatically Generated by clamav-base postinst
#To reconfigure clamd run #dpkg-reconfigure clamav-base
#Please read /usr/share/doc/clamav-base/README.Debian.gz for details
LocalSocket /var/run/amavis/clamd.sock 1
FixStaleSocket
User amavis 2
AllowSupplementaryGroups
ScanMail
ScanArchive
ArchiveMaxRecursion 5
ArchiveMaxFiles 1000
ArchiveMaxFileSize 10M
ArchiveMaxCompressionRatio 250
ScanRAR
MaxDirectoryRecursion 15
ReadTimeout 180
MaxThreads 12
MaxConnectionQueueLength 15
LogSyslog
LogFile /var/log/clamav/clamav.log
LogTime
LogFileMaxSize 0
PidFile /var/run/amavis/clamd.pid
DatabaseDirectory /var/lib/clamav/
SelfCheck 3600

1

Conformément au choix énoncé ci-dessus, on utilise le répertoire /var/run/amavis/ pour stocker le fichier socket.

2

Le propriétaire du processus clamd est l'utilisateur amavis.

Utilisateur clamav

L'utilisateur clamav doit faire partie du groupe amavis.

$ cat /etc/group |grep clam
amavis:!:109:clamav
clamav:!:112:

5.1.3. Configuration du service amavisd-new

C'est dans la Section VII - External programs, virus scanners du fichier amavisd.conf que l'on trouve les paramètres d'appel à l'antivirus clamd. Il faut désigner le fichier socket tel qu'il a été défini ci-avant : /var/run/amavis/clamd.sock

# ### http://www.clamav.net/
['ClamAV-clamd',
  \&ask_daemon, ["CONTSCAN {}\n", "/var/run/amavis/clamd.sock"],
  qr/\bOK$/, qr/\bFOUND$/,
  qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
# # NOTE: run clamd under the same user as amavisd, or run it under its own
# #   uid such as clamav, add user clamav to the amavis group, and then add
# #   AllowSupplementaryGroups to clamd.conf;
# # NOTE: match socket name (LocalSocket) in clamav.conf to the socket name in
# #   this entry; when running chrooted one may prefer socket "$MYHOME/clamd".

5.2. Sophos

Sophos est un fournisseur d'antivirus propriétaire non libre.

5.2.1. SAV interface

En plus des outils antivirus propriétaires traditionnels, Sophos™ fournit un jeu de bibliothèques qui permettent de développer un produit tiers. C'est ce jeu de bibliothèques appelé SAV interface qui est utilisé par le démon sophie. Voir Section 5.2.2, « Sophie ».

Chaque mois, il faut télécharger une nouvelle archive SAV interface pour que le démon sophie puisse bénéficier des nouveaux développements du fournisseur.

Téléchargement de l'archive SAV interface

À partir du site Mises à jour Sophos, on télécharge l'archive linux.intel.libc6.glibc.2.2.tar.Z.

Installation du jeu de bibliothèques

Il s'agit essentiellement de copier des fichiers dans l'arborescence /usr/local/.

$ tar xvzf linux.intel.libc6.glibc.2.2.tar.Z
<snipped/>
$ cd sav-install
$ su
Password:
# ./install.sh -v 
Utilitaire d'installation de Sophos Anti-Virus [[Linux/Intel]]
Copyright (c) 1998-2005 Sophos Plc, Oxford, Angleterre

Initialisation...

Les binaires seront installés dans '/usr/local/bin'
Les bibliothèques seront installées dans '/usr/local/lib'
Les pages man seront installées dans '/usr/local/man'
Les données virales seront installées dans '/usr/local/sav'
Le texte de message sera installé dans '/usr/local/sav'

SWEEP sera installé
InterCheck ne sera pas installé
<snipped/>
Ajustement en cours de /etc/sav.conf
<snipped/>
Purge des anciens fichiers

Les mises à jour mensuelles et le script sophos-ide-update.pl renomment les fichiers de signatures virales et les bibliothèques sans les effacer. Le répertoire /usr/local/sav/ doit donc être purgé régulièrement.

Voici une exemple de script exécuté chaque mois :

MailGw:/etc/cron.monthly# cat sav-cleanup
#! /bin/sh

[ -d /usr/local/sav/ ] || exit 0

find /usr/local/sav/ -mtime +90 -exec rm {} \;

5.2.2. Sophie

sophie est un démon libre qui utilise les bibliothèques Sophos™. Associé au service amavisd-new, ce démon joue le rôle d'antivirus primaire travaillant directement en mémoire vive (RAM). Ce mode de fonctionnement allie efficacité et vitesse de traitement.

Téléchargement des sources

Le site principal sophie indique la version la plus récente du démon.

$ wget http://www.clanfield.info/sophie/sophie-3.05.tar.bz2
$ su
Password:
# mv sophie-3.05.tar.bz2 /usr/local/src
# cd /usr/local/src
# tar xf sophie-3.05.tar.bz2
# chown -R root.src sophie-3.05
Appel de la bibliothèque SAVI

Pour que la compilation du logiciel fasse appel à la bibliothèque d'exploitation des signatures de virus, il est nécessaire de créer un lien symbolique vers la dernière version de cette bibliothèque.

MailGw:/usr/local/lib# ln -s libsavi.so.3 libsavi.so
MailGw:/usr/local/lib# ls -larth libsavi.so*
-r-xr-xr-x 1 bin  bin   1,7M 2006-09-04 16:12 libsavi.so.3.2.07.145
-r-xr-xr-x 1 bin  bin   1,7M 2006-10-03 23:34 libsavi.so.3.2.07.149
-r-xr-xr-x 1 bin  bin   1,7M 2006-11-09 09:57 libsavi.so.3.2.07.155
-r-xr-xr-x 1 bin  bin   1,7M 2006-12-01 20:07 libsavi.so.3.2.07.157
lrwxrwxrwx 1 root staff   21 2006-12-01 20:07 libsavi.so.3 -> libsavi.so.3.2.07.157
lrwxrwxrwx 1 root staff   21 2006-12-01 20:07 libsavi.so.2 -> libsavi.so.3.2.07.157
lrwxrwxrwx 1 root staff   12 2006-12-01 22:11 libsavi.so -> libsavi.so.3
Compilation de sophie

On retrouve ici les étapes rituelles de compilation d'un logiciel libre.

La commande ./configure contrôle la présence des outils et des bibliothèques nécessaires à la compilation et génère les Makefiles.

MailGw:/usr/local/src/sophie-3.05# ./configure
<snipped/>
checking if only fatal errors will be reported... no
configure: creating ./config.status
config.status: creating Makefile
config.status: creating sophie.cfg
config.status: creating config.h
config.status: config.h is unchanged

La commande make lance la compilation proprement dite.

MailGw:/usr/local/src/sophie-3.05# make
gcc -g -O2 -Wall -Isav_if   -c -o sophie.o sophie.c
gcc -g -O2 -Wall -Isav_if   -c -o sophie_init.o sophie_init.c
gcc -g -O2 -Wall -Isav_if   -c -o sophie_scandir.o sophie_scandir.c
gcc -g -O2 -Wall -Isav_if   -c -o sophie_core.o sophie_core.c
gcc -g -O2 -Wall -Isav_if   -c -o sophie_notify.o sophie_notify.c
gcc -g -O2 -Wall -Isav_if -Wl,--strip-all -Wl,-rpath,/usr/local/lib \
                 -L/usr/local/lib -lsavi sophie.o sophie_init.o \
		 sophie_scandir.o sophie_core.o sophie_notify.o \
		 -o sophie
Installation de sophie

Comme pour les autres éléments, on installe le programme dans l'arborescence locale du système indépendante des paquets de la distribution /usr/local.

# mv /usr/local/bin/sophie /usr/local/bin/sophie.old
# cp /usr/local/src/sophie-3.05/sophie /usr/local/bin/
Exécution de sophie

Il ne reste plus qu'à lancer le démon.

# /etc/init.d/sophie stop
# /etc/init.d/sophie start

On valide le chargement du démon en mémoire en consultant les messages systèmes.

# tail -250 /var/log/syslog
<snipped/>
sophie[337]: NOTICE           : SIGNAL '15' caught - cleaning up and exiting.
sophie[337]: NOTICE           : pSAVI cleaned up and released/terminated
sophie[903]: WARNING          : Socket '/var/run/amavis/sophie.sock' already exists!
sophie[903]: NOTICE           : Removing existing socket
sophie[905]: NOTICE           : Setting configuration options - please wait...
sophie[903]: /usr/local/bin/sophie Placed in the background [PID: 9004]
sophie[905]: NOTICE           : Configuration options set
sophie[905]: Sophos engine    : Sophos engine version 2.40
sophie[905]: Sophie IDE       : Sophos IDE version 4.12 (detects 202043 viruses)
sophie[905]: SAVI config      : /etc/sophie.savi
sophie[905]: Max processes    : 20
sophie[905]: Socket path      : /var/run/amavis/sophie.sock
sophie[905]: Umask            : 7
sophie[905]: PID file         : /var/run/amavis/sophie.pid
sophie[905]: Timeout          : 300 seconds
sophie[905]: Running as user  : amavis
sophie[905]: Socket group     : amavis
sophie[905]: Logname          : sophie
sophie[905]: Log facility     : 16 (mail)
sophie[905]: Log priority     : 5 (notice)
sophie[905]: Error strings?   : yes
sophie[905]: Timestamps?      : no
sophie[905]: Show virus name? : yes
sophie[905]: Callbacks?       : yes
sophie[905]: limit_classif    : 10
sophie[905]: limit_nextfile   : 10000
sophie[905]: limit_decompr    : 1000
sophie[905]: socket_check     : yes
sophie[905]: Sophie version   : 3.05
Script d'initialisation du démon

Voici un script d'initialisation à la mode Debian GNU/Linux que l'on intègre dans les runlevels à l'aide de la commande # update-rc.d sophie defaults.

# cat /etc/init.d/sophie
#!/bin/sh

PATH=/sbin:/bin
DAEMON=sophie
SOPHIE=/usr/local/bin/$DAEMON

test -f $SOPHIE || exit 0

case "$1" in
start)
  echo -n "Running $DAEMON daemon"
  start-stop-daemon --start --quiet -c amavis \
                    --pidfile /var/run/amavis/$DAEMON.pid \
                    --exec $SOPHIE -- -D
  sleep 5
  test -f /var/run/amavis/$DAEMON.pid || echo "(failed)." || exit 1
  echo "."
  ;;
stop)
  echo -n "Killing $DAEMON daemon"
  start-stop-daemon --stop --quiet -c amavis --pidfile /var/run/amavis/$DAEMON.pid
  echo "."
  ;;
*)
  echo "Usage: /etc/init.d/sophie {start|stop}"
  exit 1
esac

exit 0
Configuration du démon

Pour que la configuration soit complète, il manque deux fichiers de configuration nécessaires au bon fonctionnement du démon et à son association avec le service amavisd-new. Ces deux fichiers doivent être placés dans le répertoire /etc.

le fichier sophie.cfg contient les paramètres de fonctionnement du démon tels que son identification de processus, l'emplacement du fichier socket, son propriétaire, etc.

Voici un patch adapté à la configuration des services utilisés dans ce document.

# diff -uBb /usr/local/src/sophie-3.05/etc/sophie.cfg /etc/sophie.cfg
--- /usr/local/src/sophie-3.05/etc/sophie.cfg   2003-03-06 13:00:00.000000000 +0100
+++ /etc/sophie.cfg     2004-02-06 18:27:05.000000000 +0100
@@ -23,12 +23,12 @@
 # Location of PID file
 #
 # Change requires: RESTART
-pidfile: /var/run/sophie.pid
+pidfile: /var/run/amavis/sophie.pid

 # Location of socket file
 #
 # Change requires: RESTART
-socketfile: /var/run/sophie
+socketfile: /var/run/amavis/sophie.sock

 # Umask for the socket file
 #
@@ -38,12 +38,12 @@
 # User to run Sophie as
 #
 # Change requires: RESTART
-user: mail
+user: amavis

 # Group to run Sophie as
 #
 # Change requires: RESTART
-group: mail
+group: amavis

 # Scanning timeout (in seconds)
 # If Sophie child doesn't finish scanning a file within this timeframe,

Le fichier sophie.savi contient les paramètres des bibliothèques d'exploitation des signatures de virus. À priori, on s'appuie sur les paramètres fournis avec la distribution de sophie. On se contente donc de copier ce fichier.

# cp /usr/local/src/sophie-3.05/etc/sophie.savi /etc

5.2.3. Configuration du service amavisd-new

C'est dans la Section VII - External programs, virus scanners du fichier amavisd.conf que l'on trouve les paramètres d'appel au démon sophie. Il faut désigner le fichier socket tel qu'il a été défini ci-avant : /var/run/amavis/sophie.sock

# ### http://www.vanja.com/tools/sophie/
['Sophie',
  \&ask_daemon, ["{}/\n", '/var/run/amavis/sophie.sock'],
  qr/(?x)^ 0+ ( : | [\000\r\n]* $)/,  qr/(?x)^ 1 ( : | [\000\r\n]* $)/,
  qr/(?x)^ [-+]? \d+ : (.*?) [\000\r\n]* $/ ],

5.2.4. Mise à jour des signatures de virus

Le script Perl sophos-ide-update a pour but de télécharger les signatures individuelles des nouveaux virus publiées sur le site du fournisseur Sophos. Ces signatures étant publiées après chaque découverte de nouveaux virus, il faut lancer ce script périodiquement pour les collecter. Si de nouvelles signatures de virus sont apparues entre deux exécutions du script, il faut relancer le démon antivirus résidant en mémoire sophie (voir Section 5.2.2, « Sophie »).

Voici un patch adapté à la configuration des services utilisés dans ce document. Il s'agit principalement d'identifier le socket le numéro du processus du démon sophie.

# diff -uBb /usr/local/src/sophos-ide-update_1.4/sophos-ide-update.pl \
  /usr/local/sbin/sophos-ide-update.pl
--- /usr/local/src/sophos-ide-update_1.4/sophos-ide-update.pl 2007-02-27 15:03:27.00 +0100
+++ /usr/local/sbin/sophos-ide-update.pl 2007-02-27 18:13:19.00 +0100
@@ -222,8 +222,9 @@
 # status reports of each run, along with local timezone timestamps (ISO 8601).
 # "$savdir/" will be prepended to $log_filename if it does not start with a "/"
 #
-  $log_filename = '000last_updated.log';
+# $log_filename = '000last_updated.log';
 # $log_filename = '/var/log/000last_updated.log';
+ $log_filename = '/var/log/sophos/000last_updated.log';

 # Check also the procedure get_sophos_data_directory() further down
 # if you keep both the /etc/sav.conf and /usr/local/sav in other locations.
@@ -280,20 +281,23 @@
 # writes its process id (supposedly since Sophie V1.17, although
 # not in sophie-1.20a1). It does not hurt if the file does not exist.
 #
-  $sophie_pidfile = '/var/run/sophie.pid';
+#  $sophie_pidfile = '/var/run/sophie.pid';
+  $sophie_pidfile = '/var/run/amavis/sophie.pid';

 # $sophie_socket is a Unix socket name which Sophie daemon keeps open.
 # Must be an absolute path. 'lsof' (if available) will try to locate
 # a parent process (i.e. Sophie children will be ignored) which has
 # this socket open and runs a command named 'sophie'.
 #
-  $sophie_socket = '/var/run/sophie';
+#  $sophie_socket = '/var/run/sophie';
+  $sophie_socket = '/var/run/amavis/sophie.sock';

 # Full path of the 'lsof' program.
 # In case you do not have it, home of lsof is at:
 #   ftp://vic.cc.purdue.edu/pub/tools/unix/lsof
 #
-  $lsof_path = '/usr/local/sbin/lsof';
+#  $lsof_path = '/usr/local/bin/lsof';
+  $lsof_path = '/usr/bin/lsof';

 # Comment out the $lsof_path or $sophie_socket if you want to prevent
 # 'lsof' from being called regardless of the existence of Sophie socket file.

Une fois que le script de téléchargement des nouvelles signatures est utilisable, il faut automatiser son exécution à l'aide du service système cron.

Voici une copie du fichier /etc/cron.d/sophie  un exemple de configuration qui lance l'exécution du script toutes les 45 minutes. Cette exécution se fait avec l'identité root pour avoir la capacité à relancer le démon antivirus.

# /etc/cron.d/sophie: crontab entry for sophie

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

*/45 * * * *  root  test -e /usr/local/sbin/sophos-ide-update.pl && \
                    /usr/local/sbin/sophos-ide-update.pl