Ajouter un anti-virus à la passerelle anti-spam (réalisée avec Amavisd-new)

Auteur : Olivier BOYER - oboyer () ajoute ! org

Mots clés

Clamav, freschclam, Amavisd-new, Postfix, anti-virus, antivirus, anti-spam, antispam, passerelle, gateway, chroot, OpenBSD

Introduction

Ce document présente l’installation de l'anti-virus ClamAV. Cette installation s'effectue après la configuration d'une passerelle anti-spam (réalisée avec Amavisd-new). Le système anti-virus fonctionne dans un environnement à racine déplacée (chroot) sur un système OpenBSD 4.3.

Présentation de la maquette

Les éléments suivants sont mis en oeuvre :

  • Un système OpenBSD 4.3
  • Un serveur de mails MTA Postfix
  • Un filtre anti-spam avec amavisd-new, ses modules Spamassassin et les agents Vipul’s Razor2
  • Un filtre anti-virus avec clamAV

Le service amavisd-new s’exécute dans une cage, dont la racine est le répertoire /var/amavisd. Tous les composants liés à amavisd-new (les filtres anti-spam et anti-virus) s’exécutent dans le même environnement. Cependant, le filtre anti-spam s'exécute sous l'identité _vscan, tant dit que le filtre anti-virus s'exécute sous l'identité _clamav.

Schéma général

              +...................+
Courrier -->  :      Postfix      : --> Courrier
Entrant       +...................+     Distribué
                    |    ^
                    |    |
                    v    |
              +....................................+
              :   Amavisd-new <------<----\        :
              :       |                   |        :
              :       v                   |        :
              :    ClamAV                 ^        :
              :       |                   |        :
              :       +->-Virus-détecté->-+        :
              :       |                   |        :
              :       v            +-------------+ :
              :  SpamAssassin      | Attribution | :
              :       |            |    d'une    | :
              :       v            |    note     | :
              : Vipul's Razor2     +-------------+ :
              :       |                   ^        :
              :       v                   |        :
              :       \-->----------->----/        :
              +....................................+

Présentation des composants

Composants anti-spam

Les composants anti-spam (Amavisd-new, SpamAssassin, Vipul's Razor2) sont présentés dans le document d'installation de la passerelle anti-spam, section Présentation des composants.

ClamAV

Clam AntiVirus (ClamAV), est un logiciel anti-virus très utilisé sous UNIX. Il est généralement utilisé avec les serveurs de messagerie pour filtrer les courriers comportant des virus. Les virus ciblés sont très majoritairement des virus s'attaquant au système d'exploitation Microsoft Windows et non pas aux systèmes sur lesquels ClamAV s'installe, qui sont peu menacés par les virus.

La base de données des virus connus est basée sur celle de l'ancien projet libre anti-virus OpenAntiVirus. ClamAV reconnaît en moyenne une cinquantaine de nouveaux virus chaque jour. Le moteur anti-virus télécharge automatiquement la mise à jour de la liste des virus.

Le 17 mars 2007, la base de données atteint 100 000 virus connus. Fin mars 2007, elle en contient plus de 102 000.

Le moteur anti-virus est constitué de la bibliothèque libclamav écrite en langage C.

Note

Toutes les commandes présentées ici, sont à exécuter, sauf mention contraire, en tant qu'administrateur de la machine.

Pré-requis

  • Le serveur OpenBSD doit être installé et fonctionnel.
  • Le serveur de courriers Postfix [/usr/ports/mail/postfix] doit être installé et fonctionnel.
  • La passerelle anti-spam doit être installée en suivant cette procédure et fonctionnelle
  • La partition /var ou /var/amavisd ne doit pas être montée avec les options nodev ni noexec puisque le daemon clamd(8) va s'exécuter dans la cage /var/amavisd.

Installer clamAV

La produit clamAV est disponible sous forme de package binaire. Pour l'installer, exécutez les commandes suivantes :

# PKG_PATH="ftp://ftp.irisa.fr/pub/OpenBSD/$(uname -r)/packages/i386/"
# export PKG_PATH
#
# pkg_add clamav
clamav-0.92.1:gmp-4.2.2: complete
clamav-0.92.1: complete
--- clamav-0.92.1 -------------------
Edit /etc/clamd.conf and /etc/freshclam.conf
to use ClamAV.

Use freshclam to install an up-to-date virus signature database.

If you want to scan RAR(2.0) and/or ARJ archives, you have to manually
build and install the archivers/unarj and archivers/unrar ports.

Un utilisateur dédié est automatiquement créé :

# grep _clamav /etc/passwd /etc/group
/etc/passwd:_clamav:*:539:539:Clam AntiVirus:/nonexistent:/sbin/nologin
/etc/group:_clamav:*:539:

Le produit est installé. Il faut maintenant l'intégrer à la cage du daemon amavisd-new.

Intégrer clamAV à la passerelle anti-spam

Introduction

Le filtre anti-virus clamAV va être appelé après le traitement anti-spam par le daemon Amavisd-new qui réalise l'interface entre le serveur de courriers et les filtres de contenus.

Le daemon amavisd est configuré dans cette maquette pour s'exécuter dans un environnement à racine déplacé (chroot). Ce mécanisme permet d'augmenter la sécurité générale du système. Le filtre anti-virus est configuré pour s'exécuter dans la même racine.

Le daemon anti-virus clamd(8) fonctionne sous l'identité de l'utilisateur dédié _clamav, et enregistre son activité via le daemon syslog(8).

La majorité des répertoires, des fichiers, des périphériques nécessaires au fonctionnement du filtre anti-virus dans la cage ont été créés lors de l'installation de la passerelle anti-spam. Seuls sont présents ici les éléments manquants. Pour savoir comment la cage a été crée, reportez-vous au document d’installation de la passerelle anti-spam, section Créer le chroot d'amavisd-new.

Modifier le fichier /etc/group

Pour permettre à l'utilisateur _clamav d'accéder au contenu de la cage, ajouter l'utilisateur _clamav au groupe _vscan :

# usermod -G _vscan _clamav

Créer le répertoire des bases de signatures de virus

Pour créer le répertoire où clamd(8) stocke les signatures de virus, procédez comme suit :

# mkdir -p /var/amavisd/var/db/clamav
# chown _clamav:_clamav /var/amavisd/var/db/clamav 

Remplir le répertoire : etc

etc/clamd.conf

Déplacez le fichier de configuration du daemon clamd(8) du répertoire /etc à la nouvelle racine d’exécution du daemon /var/amavisd.

# mv /etc/clamd.conf /var/amavisd/etc
#
# cd /etc
# ln -s ../var/amavisd/etc/clamd.conf clamd.conf

etc/freshclam.conf

Déplacez le fichier de configuration de freshclamd(1) du répertoire /etc à la nouvelle racine d’exécution du daemon /var/amavisd.

# mv /etc/freshclam.conf /var/amavisd/etc
#
# cd /etc
# ln -s ../var/amavisd/etc/freshclam.conf freshclam.conf

etc/group

Ajoutez le groupe du daemon clamd(8) au fichier etc/group de la cage.

# grep "^_clamav" /etc/group >> /var/amavisd/etc/group

La daemon clamd et le daemon amavisd partagent en écriture un certain nombre de répertoires. Il faut donc ajouter l'utilisateur _clamd au groupe _amavisd. Procédez comme suit :

# > /tmp/ngroup && chmod 600 /tmp/ngroup
# awk '{if ($0 ~ /^_vscan/) {printf "%s_clamav\n",$0} else {print $0}}' \
 /var/amavisd/etc/group > /tmp/ngroup
#
# cat /tmp/ngroup > /var/amavisd/etc/group
# rm -f /tmp/ngroup

etc/master.passwd

Durant son exécution dans la nouvelle racine, le daemon clamd aura besoin de connaître l’identité de l'utilisateur _clamav. Pour ce faire, il faut modifier la base locale d’utilisateurs dans la cage.

Ajouter l'utilisateur _clamav

Exécutez la commande suivante :

# grep ^_clamav /etc/master.passwd >>/var/amavisd/etc/master.passwd

Générer la base binaire

Recréez, comme suit, la base des mots de passe à partir de ce nouveau fichier :

# pwd_mkdb -p -d /var/amavisd/etc /var/amavisd/etc/master.passwd
pwd_mkdb: warning, unknown root shell
pwd_mkdb: warning, unknown root shell
pwd_mkdb: warning, unknown root shell

Les messages d’avertissement indiquent que le shell pour l’utilisateur root est inconnu, donc invalide. Comme l’utilisateur root de la cage ne se logera jamais, vous pouvez ignorer ces messages.

Remplir le répertoire : usr

Pour remplir le contenu du répertoire /var/amavisd/usr nous allons utiliser un script shell qui copie les binaires nécessaires au fonctionnement du daemon clamd et toutes les bibliothèques de fonction dont ils dépendent. Ce script automatise le travail qu'il est nécessaire de faire “à la main”.

Télécharger le script

Téléchargez le script inst_chroot_bin.sh à l'adresse suivante : http://ajoute.org/cvs/sysutils/openbsd/admin/inst_chroot_bin.sh et copiez le dans le répertoire /var/tmp. Procédez comme suit :

# cd /var/tmp
# > inst_chroot_bin.sh
# ftp http://ajoute.org/cvs/~checkout~/sysutils/openbsd/admin/inst_chroot_bin.sh
# chmod 744 inst_chroot_bin.sh

Copier les binaires et les bibliothèques partagées

Exécutez la commande suivante :

for i in \
  /usr/local/sbin/clamd \
  /usr/local/bin/clamscan \
  /usr/local/bin/clamdscan \
  /usr/local/bin/freshclam
do
   env PREFIX=/var/amavisd /var/tmp/inst_chroot_bin.sh $i
done

Effacez le script téléchargé comme suit :

# rm -f /var/tmp/inst_chroot_bin.sh

Modifier les permissions des répertoires

La daemon clamd et le daemon amavisd partagent en écriture un certain nombre de répertoires. Modifiez comme suit les permissions de la cage :

# chmod 111 /var/amavisd/usr/bin/*
# chmod 444 /var/amavisd/usr/lib/*
# chmod 775 /var/amavisd/tmp
# chmod 775 /var/amavisd/var/run \
/var/amavisd/var/tmp \
/var/amavisd/var/virusmails

La cage est maintenant remplie.

Configurer les daemons

etc/clamd.conf

Dans notre maquette, clamd(8) s'exécute dans une cage dont la racine est /var/amavisd. Les chemins présents dans le fichier de configuration devraient dont être relatifs à cette racine. Or, durant l'installation d'amavasid-new nous avons créé un lien symbolique qui permet de garder l'arborescence présente en dehors de la cage, dans la cage. Ainsi, même si clamd(8) est exécuté sans cage, les chemins du fichier de configuration restent valables.

La majorité des paramètres par défaut du fichier clamd.conf ont été gardé. Pour connaître les paramètres par défaut, voir le fichier /usr/local/share/examples/clamav/clamd.conf.

Voici le contenu attendu du fichier var/amavisd/etc/clamd.conf. Pour plus d'informations, consultez la page de manuel clamd.conf(5).

# egrep -v '^#|^$' /var/amavisd/etc/clamd.conf
LogSyslog yes
LogFacility LOG_MAIL
LogTime yes
PidFile /var/amavisd/var/run/clamd.pid
TemporaryDirectory /tmp
DatabaseDirectory /var/amavisd/var/db/clamav
LocalSocket /var/amavisd/var/run/clamd.sock
FixStaleSocket yes
User _clamav
AlgorithmicDetection yes
DetectBrokenExecutables yes
ScanPDF yes
ArchiveLimitMemoryUsage yes

etc/amavisd.conf

Modifiez le fichier de configuration /var/amavisd/etc/amavisd.conf, pour qu'amavisd-new utilise clamd(8). Au minimum, les éléments suivants doivent être présents dans le fichier /var/amavisd/etc/amavisd.conf :

# @bypass_spam_checks_maps  = (1);  # uncomment to DISABLE anti-spam code

## Anti-virus settings
$final_virus_destiny      = D_PASS;
$final_banned_destiny     = D_PASS;

$virus_admin               = undef;     # notifications recip.
$mailfrom_notify_admin     = undef;     # notifications sender
$mailfrom_notify_recip     = undef;     # notifications sender
$mailfrom_notify_spamadmin = undef;     # notifications sender
$mailfrom_to_quarantine = ''; # null return path; uses original sender if undef

$defang_virus  = 1;  # MIME-wrap passed infected mail
$defang_banned = 1;  # MIME-wrap passed mail containing banned name

$remove_existing_x_scanned_headers = 0;
$X_HEADER_TAG  = 'X-Virus-Scanned';
$X_HEADER_LINE = "$myproduct_name at $mydomain";

@av_scanners = (
# ### http://www.clamav.net/
 ['ClamAV-clamd',
   \&ask_daemon, ["CONTSCAN {}\n", "$MYHOME/var/run/clamd.sock"]
   qr/\bOK$/, qr/\bFOUND$/,
   qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
);

@av_scanners_backup = (
  ### http://www.clamav.net/   - backs up clamd or Mail::ClamAV
  ['ClamAV-clamscan', 'clamscan',
    "--stdout --disable-summary -r --tempdir=$TEMPBASE {}", [0], [1],
    qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
);

Attention

La ligne @bypass_spam_checks_maps = (1); doit être commentée. Cette ligne active (si elle est commentée) le filtre anti-virus. Dans la cas contraire, elle le désactive.

Le filtre anti-virus s'applique avant le filtre anti-spam. Ainsi, si un message reçu contient un virus, il est automatiquement marqué, transféré à l'utilisateur, et ne passe pas les filtres anti-spam. Cela évite la consommation de mémoire et de temps processeur pour un message infecté.

Explications de la configuration

Avec cette configuration, quand clamd(8) reçoit un mail transmis par amavisd-new, il ajoute le header X-Virus-Scanned: amavisd-new at leaves.org.

Si clamd(8) détecte un virus dans le mail :

  • il laisse passer le message, paramètre $final_virus_destiny = D_PASS;
  • il transfert le message original dans une pièce jointe, paramètre $defang_virus = 1; et $defang_banned = 1;. Le corps du message envoyé contient le nom du virus détecté.
  • il ajoute les headers : X-Virus-Scanned:, X-Amavis-Alert: INFECTED, message contains virus: , X-Amavis-Alert: BANNED, message contains part:

Redémarrer amavisd-new

Une fois ces modifications apportées, il faut redémarrer le service amavisd-new pour qu'elle soient effectives.

# /etc/rc.d/amavisd restart

etc/freshclam.conf

Dans notre maquette, clamd(8) et freshclam(1) s'exécutent dans une cage dont la racine est /var/amavisd. Les chemins présents dans le fichier de configuration devraient dont être relatifs à cette racine. Or, durant l'installation d'amavasid-new nous avons créé un lien symbolique qui permet de garder l'arborescence présente en dehors de la cage, dans la cage. Ainsi, même si frshclam(1) est exécuté sans cage, les chemins du fichier de configuration restent valables.

La majorité des paramètres par défaut du fichier freshclam.conf ont été gardé. Pour connaître les paramètres par défaut, voir le fichier /usr/local/share/examples/clamav/freshclam.conf.

Voici le contenu attendu du fichier /var/amavisd/etc/freshclam.conf. Pour plus d'informations, consultez la page de manuel freshclam.conf(5).

# egrep -v '^#|^$' /var/amavisd/etc/freshclam.conf
DatabaseDirectory /var/amavisd/var/db/clamav
LogVerbose yes
LogSyslog yes
LogFacility LOG_MAIL
PidFile /var/amavisd/var/run/freshclam.pid
DatabaseOwner _clamav
DatabaseMirror db.fr.clamav.net
DatabaseMirror database.clamav.net
Checks 12
NotifyClamd /var/amavisd/etc/clamd.conf
ConnectTimeout 60
ReceiveTimeout 60

ATTENTION : le paramètre DatabaseDirectory doit être identique à celui du fichier /var/amavisd/etc/clamd.conf.

Créer de nouveaux aliases

Si vous souhaitez que l'administrateur mail du domaine soit informé de la détection d'un virus dans un message, vous devez modifiez changer, comme suit, les paramètres $virus_admin, $mailfrom_notify_admin et $mailfrom_notify_recip du fichier /var/amavisd/etc/amavisd.conf.

$virus_admin               = "virusalert\@$mydomain";  # notifications recip.
$mailfrom_notify_admin     = "virusalert\@$mydomain";  # notifications sender  
$mailfrom_notify_recip     = "virusalert\@$mydomain";  # notifications sender

Puis, créez l'adresse virusalert@<domain>. Le plus simple est de définir deux aliases pour l'utilisateur postmaster. Pour ce faire, ajoutez les lignes suivantes au fichier /etc/postfix/aliases :

# anti-virus user
_clamav:        postmaster
virusalert:     postmaster

Puis, générez la nouvelle base des aliases :

# newaliases

Mettre à jour la base de virus

Après l'installation de clamd(8) il faut télécharger la base de virus pour que le système fonctionne. Une fois cette base initiale obtenue, il faut la mettre à jour très régulièrement pour détecter les nouveaux virus. C'est l'élément le plus important dans une configuration anti-virus.

Manuellement

Pour mettre à jour la base de virus manuellement, exécutez la commande suivante :

# chroot -u _clamav /var/amavisd /usr/bin/freshclam --log-verbose --notify-daemon

Automatiquement

La commande freshclam(1) qui met à jour la base de données de virus, supporte le mode daemon, c'est-à-dire que la commande peut fonctionner en arrière plan et mettre à jour automatiquement la base. La configuration présentée plus haut est conçue pour faire fonctionner freshclam(1) en mode daemon.

Pour démarrer automatiquement le service freshclam, créez le script /etc/rc.d/freshclam.

La base de signatures sera mise à jour automatiquement 12 fois par jour. Les paragraphes suivants vont expliquer comment automatiser les phases de démarrage et d'arrêt du service freshclam.

Tester le fonctionnement

Tester en local

Démarrez le service anti-virus:

# chroot -u _clamav /var/amavisd /usr/bin/clamd

Vérifiez que le daemon clamd fonctionne :

# echo VERSION | nc -U /var/amavisd/var/run/clamd.sock

Tester la détection de virus

Maintenant que le service fonctionne, il faut vérifier que clamd(8) détecte bien les virus envoyés dans un mail. L'EICAR ([European Institute for Computer Anti-Virus Research]) a produit une signature de virus que quasiment tous les anti-virus peuvent détecter. Il n'y a pas d'inquiétude a avoir quant au téléchargement de ce fichier. Ce n'est pas un virus, juste une signature. C'est un programme DOS qui affiche un message à l'écran, mais ne peut s'exécuter sur un système OpenBSD. Téléchargez ces fichiers, et envoyez les, un par un, en pièce jointe dans un mail. Vérifiez à la réception des messages qu'ils sont bien classés comme virus.

Pour télécharger ces signatures, exécutez les commandes suivantes (en tant qu'utilisateur non privilégié) :

$ cd /tmp
$ ftp http://www.eicar.org/download/eicar.com
$ ftp http://www.eicar.org/download/eicar_com.zip
$ ftp http://www.eicar.org/download/eicarcom2.zip 

A la réception des messages, vérifiez les messages tracés dans le fichier /var/mail/maillog.

Exemple d'entrée de clamd(8) :

/var/amavisd/tmp/amavis-20070628T145810-20396/parts/p001: OK
LibClamAV debug: Eicar-Test-Signature found in descriptor 9
/var/amavisd/tmp/amavis-20070628T145810-20396/parts/p002: Eicar-Test-Signature FOUND

Exemple d'entrée de amavisd-new :

Jun 28 14:58:11 mx amavis[20396]: (20396-01) Passed INFECTED (Eicar-Test-Signa
ture), LOCAL [ip1] [ip2] <?@mx.leaves.org> -> <user@leaves.org>, Message-ID: 
<Pine.BSO.4.64.0706281457140.26016@mx.leaves.org>, mail_id:aEDqz+suV8u6, 
Hits: -, 1161 ms

Intégrer le service clamAV au système

Créer un script de démarrage

Pour arrêter et redémarrer clamd de manière simple, créez un script de démarrage.

Pour ce faire, créez le répertoire /etc/rc.d comme suit :

# mkdir /etc/rc.d
# chown root:wheel /etc/rc.d
# chmod 750 /etc/rc.d

Puis, créez comme suit, le fichier de démarrage pour le daemon :

Et enfin, positionnez les permissions :

# chown root:wheel /etc/rc.d/{clamd,freshclam}
# chmod 740 /etc/rc.d/{clamd,freshclam}

Modifier le fichier /etc/rc.conf.local

Pour gérer le service, ajoutez la ligne suivante à la fin du fichier /etc/rc.conf.local :

clamd_flags=""        # for normal use: ""
freshclam_flags=""    # for normal use: ""

Modifier le fichier /etc/rc.local

Pour lancer automatiquement le service au démarrage de la machine, ajoutez les lignes suivantes avant le démarrage du service amavisd-new, dans le fichier /etc/rc.local :

# Start clamd (anti-virus daemon)
if [ -x /etc/rc.d/clamd ]; then
        echo -n ' clamd'; /etc/rc.d/clamd start & >/dev/null
fi

Puis, à la fin du fichier /etc/rc.local, ajoutez les lignes suivantes :

# Start freshclam (update virus database daemon)
if [ -x /etc/rc.d/freshclam ]; then
        echo -n ' freshclam'; /etc/rc.d/freshclam start >/dev/null
fi

Il est nécessaire de laisser du temps entre le démarrage de clamd(8) et de freshclam(1), car clamd(8) met du temps à démarrer.

Modifier le fichier /etc/rc.shutdown

Pour arrêter le service à l'arrêt de la machine, ajoutez les lignes suivantes à la fin du fichier /etc/rc.shutdown :

# Stop freshclam (update virus database daemon)
if [ -x /etc/rc.d/freshclam ]; then
        echo -n ' freshclam'; /etc/rc.d/freshclam stop >/dev/null
fi

# Stop clamd (anti-virus daemon)
if [ -x /etc/rc.d/clamd ]; then
        echo -n ' clamd'; /etc/rc.d/clamd stop >/dev/null
fi

Modifier le fichier /etc/changelist

Pour que le système OpenBSD surveille les modifications apportées au script de démarrage et aux fichiers de configuration du service, ajoutez les lignes suivantes au fichier /etc/changelist :

/etc/rc.d/clamd
/etc/rc.d/freshclam
/var/amavisd/etc/clamd.conf
/var/amavisd/etc/freshclam.conf

Liens

ANNEXES

Automatiser la création de la cage

Le script inst_clamd_chroot.sh permet :

  • d'installer clamAV sur un système OpenBSD (i386),
  • de préparer la cage /var/amavisd pour clamAV,
  • de copier les éléments nécessaires dans la cage

Une fois exécuté, il ne reste plus que la configuration des daemons à effectuer.

Superviser clamAV avec Nagios

Le script check_clamd_proc permet de tester le fonctionnement du daemon clamd(8).

Le script check_freshclam_proc permet de tester que freshclam(1) fonctionne en mode daemon.

 
doc/openbsd/clamav.txt · Dernière modification: 2009/12/23 22:36 (édition externe)     Haut de page