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 avecc-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.
c-icap
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é.
Journaux
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
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
.
ACL
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
Modules de service
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
Lancement et arrêt
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
: à creuser pour supprimer la commande
restart
ou trouver comment jouer avec ipcrm(8)
avec restart
…
Configurer Squid
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