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
/varou/var/amavisdne doit pas être montée avec les optionsnodevninoexecpuisque le daemonclamd(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 :
clamd(8): /etc/rc.d/clamd.freshclam(1): /etc/rc.d/freshclam.
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/amavisdpour 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.