Squid : scanner le trafic HTTP avec ClamAV

Le daemon c-icap implémente ICAP, un protocole de filtrage de contenus mail et web. Il est normalisé par la RFC 3507 et utilise le port TCP 1344. Le proxy-cache Squid est capable d'utiliser des filtres ICAP. c-icap utilise des modules dynamiques pour filtrer le trafic HTTP . Il existe alors deux possibilités pour vérifier les contenus servis par Squid avec l'anti-virus ClamAV :

  • utiliser le module standard srv_clamav fourni avec c-icap(8),
  • utiliser le module tiers SquidClamav.

Les deux configurations sont présentées.

On travaille sur un système NetBSD (utilisation de pkgsrc) avec Squid et ClamAV installés et déjà fonctionnels.

SquidClamav est un module de filtrage pour le daemon ICAP c-icap aka www/c-icap (on est sur un système NetBSD). Le daemon se configure à l'aide du fichier de configuration /usr/pkg/etc/i-cap.conf. Compilé via pkgsrc, les modules sont dans /usr/pkg/lib/c_icap.

Ajouter un utilisateur icap membre du groupe icap ; outre l'utilisateur icap, le groupe icap comprend les deux utilisateurs squid et clamav. Pour lancer le daemon sous l'identité d'icap, ajouter les lignes suivantes c-icap.conf :

User icap
Group icap

Le daemon utilise le fichier /usr/pkg/etc/c-icap.magic pour déterminer le type du contenu considéré.

Le daemon permet d'authentifier les utilisateurs ; on désactive cette fonctionnalité.

Pour utiliser syslog(3), il faut charger le module sys_logger.so et le configurer :

ModulesDir /usr/pkg/lib/c_icap
Logger sys_logger.so
sys_logger.Prefix "c-icap:"
sys_logger.Facility local5

FIXME La journalisation avec syslog(3) est problématique (erreur à chaque tentative de charger le module sys_logger.so) ⇒ on passe par des fichiers ; attention à créer les fichiers et à leur donner les bons droits : ici, icap:icap doit pouvoir écrire dedans.

ServerLog /var/log/icap-server.log
AccessLog /var/log/icap-access.log

Dans /etc/newsyslog.conf, ajout des lignes :

/var/log/icap-access.log          icap:icap 640  365  *    $D0 Z /var/run/c-icap/c-icap.pid
/var/log/icap-server.log          icap:icap 640  365  *    $D0 Z /var/run/c-icap/c-icap.pid

En effet, en regardant dans les sources, on note que le SIGHUP reconfigure le daemon (cf. mpmt_server.c, fonctions main_signals() et sighup_handler_main()). Ici, les fichiers tournent à minuit, sont compressés, n'ont pas plus de 365 jours et sont la propriété de l'utilisateur icap et du groupe icap.

Le dameon filtre les connexions à l'aide d'ACL dont la syntaxe ressemble beaucoup à celle de Squid :

acl local_respmod src 127.0.0.1/255.255.255.255 type respmod
acl local         src 127.0.0.1/255.255.255.255
acl all           src 0.0.0.0/0.0.0.0

icap_access allow local_respmod
icap_access allow local
icap_access deny  all

Module SquidClamav v6

Installer SquidClamav aka www/squidclamav. SquidClamav v6 est un module dynamique (fichier .so) pour c-icap. Dans cette première version, le module filtre le flux HTTP envoyé par le serveur ICAP en s'adressant au daemon clamd(8).

Activer le module en ajoutant la ligne :

Service squidclamav squidclamav.so

dans le fichier c-icap.conf.

Copier le CGI (un script Perl) :

$ sudo cp /usr/pkg/libexec/squidclamav/clwarn.cgi.fr_FR /users/htdocs/www/cgi-bin/clwarn.cgi

Il sert à afficher une erreur à l'utilisateur se heurtant à un virus.

Le module se configure dans le fichier /usr/pkg/etc/squidclamav.conf :

  • l'URL en cas d'erreur (de virus) :
redirect http://kabs.homeunix.org/cgi-bin/clwarn.cgi
  • la connexion au daemon clamd(8) :
clamd_ip 127.0.0.1
clamd_port 3310

Après avoir modifié configuration, la recharger :

$ sudo sh -c "echo -n "reconfigure" > /var/run/c-icap/c-icap.ctl"

Module srv_clamav

Le module srv_clamav utilise la bibliothèque libclamav.so pour scanner les contenus à l'inverse de squidclamav(1) qui utilise le daemon clamd(8). Cette configuration est réputée plus lente, du fait de l'utilisation de cette bibliothèque.

Dans cette configuration, installer www/c-icap-modules et charger le module srv_clamav en ajoutant une ligne :

Include /usr/pkg/etc/srv_clamav.conf

dans le fichier c-icap.conf. Le module se configure dans le fichier ainsi inclus :

Service antivirus_module srv_clamav.so
ServiceAlias avscan srv_clamav?allow204=on&sizelimit=off&mode=simple

srv_clamav.ScanFileTypes TEXT DATA EXECUTABLE ARCHIVE GIF JPEG MSOFFICE
srv_clamav.SendPercentData 5
srv_clamav.StartSendPercentDataAfter 2M
srv_clamav.MaxObjectSize  5M
srv_clamav.ClamAvTmpDir /var/tmp/icap-clamav
srv_clamav.ClamAvMaxFilesInArchive 0
srv_clamav.ClamAvMaxFileSizeInArchive 100M
srv_clamav.ClamAvMaxRecLevel 5

Pour lancer le daemon et tester la configuration :

$ sudo c-icap -f /usr/pkg/etc/c-icap.conf -N -D -d 10 |egrep -v "^Searching.*for default value"

Aucun fichier n'est fournit pour /etc/rc.d ; copier le fichier suivant c_icap dans ce dernier répertoire en le nommant c_icap :

#!/bin/sh
#
# PROVIDE: c_icap
# REQUIRE: squid clamd
# BEFORE: monit
# KEYWORD: shutdown
#
 
if [ -f /etc/rc.subr ]; then
        . /etc/rc.subr
fi
 
name="c_icap"
rcvar=$name
ngname="c-icap"
command="/usr/pkg/bin/$ngname"
etcdir="/usr/pkg/etc"
pidfile="/var/run/c-icap/${ngname}.pid"
required_files="$etcdir/c-icap.conf $etcdir/squidclamav.conf $etcdir/srv_clamav.conf"
command_args="-f $etcdir/c-icap.conf $rc_flags"
reload_cmd="cicap_reload"
extra_commands="reload"
 
cicap_reload() {
        kill -HUP `cat ${pidfile}`
}
 
load_rc_config $name
run_rc_command "$1"

et ajouter une ligne dans /etc/rc.conf :

c_icap=YES              c_icap_flags="-d 0"

Lorsque le daemon meurt « salement » (SIGKILL, SIGSEGV, etc.) ou non (SIGTERM), les segments de mémoire partagée et les sémaphores qu'il utilise restent, il faut les supprimer à la main :

$ ipcs
IPC status from <running system> as of Sun Jul 24 19:09:28 2011

Message Queues:
T        ID     KEY        MODE       OWNER    GROUP

Shared Memory:
T        ID     KEY        MODE       OWNER    GROUP
m   1769472          0 --rw-rw-rw-     root    wheel
m   1769473          0 --rw-------     icap     icap
m    131083          0 --rw-rw-rw-     root    wheel

Semaphores:
T        ID     KEY        MODE       OWNER    GROUP
s  11730944          0 --rw-rw-rw-     root    wheel
s  11730945          0 --rw-rw-rw-     root    wheel
s   9895938          0 --rw-------      www      www
s   6422531          0 --rw-------     icap     icap
s   6225924          0 --rw-------     icap     icap
$ sudo ipcrm -m 1769473
$ sudo ipcrm -s 6422531
$ sudo ipcrm -s 6225924

Complétons donc le script /etc/rc.d/c_icap ci-dessus avec les lignes :

if [ $1 == "stop" ]; then
        echo "ipcs | grep icap | awk '{ print "ipcrm -" $1, $2 }'" | sh
fi

FIXME : à creuser pour supprimer la commande restart ou trouver comment jouer avec ipcrm(8) avec restart

Vérifier que Squid a bien été compilé avec l'option enable-icap-client :

$ squid -v | grep -o "enable-icap-client"
enable-icap-client

Pour configurer Squid, suivre les indications du manuel squidclamav :

icap_enable on
...
icap_send_client_ip on
...
icap_service service_req reqmod_precache bypass=1 icap://127.0.0.1:1344/squidclamav
icap_service service_resp respmod_precache bypass=1 icap://127.0.0.1:1344/squidclamav
...
adaptation_access service_req allow all
adaptation_access service_resp allow all

Si on utilise non pas squidclamav mais srv_clamav, remplacer les lignes icap_service ci-dessus par :

icap_service service_req reqmod_precache bypass=1 icap://127.0.0.1:1344/antivirus_module
icap_service service_resp respmod_precache bypass=1 icap://127.0.0.1:1344/antivirus_module

En cas d'arrêt du daemon ICAP, Squid dit dans cache.log :

2011/07/24 17:58:42| optional ICAP service is down after an options fetch failure: icap://127.0.0.1:1344/squidclamav [down,!opt]
2011/07/24 17:58:43| optional ICAP service is down after an options fetch failure: icap://127.0.0.1:1344/squidclamav [down,!opt]

et après reprise :

2011/07/24 19:01:43| optional ICAP service is up: icap://127.0.0.1:1344/squidclamav [up]
2011/07/24 19:01:43| optional ICAP service is up: icap://127.0.0.1:1344/squidclamav [up]

Pour tester, utilisons EICAR, le pseudo-virus de test : eicar.com.txt

  • user/pc/sysadmin/squid-clamav.txt
  • Dernière modification : 2011/07/30 12:05
  • de pc