Einleitung

Seit gut einem Jahr unterstützt der Proxy-Server Squid in der Version 3.0 das Internet Content Adaptation Protocol (ICAP) mit dessen Hilfe HTTP-Anfragen von weiteren Serverdiensten verarbeitet und anschließend an Squid zurückgegeben werden können. Dieser Ansatz eignet sich ideal für Virenscanner. Läd ein Benutzer eine Datei herunter, wird diese zuerst per ICAP-Schnittstelle an den Virenscanner umgeleitet und nach erfolgreicher Virenprüfung an Squid und damit auch dem Benutzer übermittelt. Lediglich im Fall eines Virenfundes wird der Benutzer auf eine Fehlerseite umgeleitet.

Der Virenscanner Clamav unterstützt jedoch das ICAP Protokoll nicht. Hier kommt nun c-icap ins Spiel. c-icap fungiert als Adapter zwischen Squid und Clamav indem es die HTTP-Daten per ICAP-Protokoll engegennimmt und anschließend an Clamav weitergibt. Enthalten die überprüften HTTP-Daten keinen Virus, werden sie unverändert an Squid zurückgegeben. Wird ein Virus gefunden, liefert c-icap folgende Fehlerseite zurück:

c-icap Fehlermeldung bei Virenfund

Die Einrichtung des Dreigespanns wird nun im folgenden erörtert.

Die Installation

Für diese Installationsanleitung wird eine funktinsfähige squid3 Installation vorausgesetzt. Zunächst werden die benötigten Pakete installiert:

1
$ apt-get install libclamav-dev clamav clamav-freshclam

Nachdem kein offizielles Paket von c-icap existiert, muss es aus den Quellen kompiliert werden. Dazu ist gegebenfalls die Installation eines passenden Compilers nötig.

1
2
3
$ wget "http://mesh.dl.sourceforge.net/sourceforge/c-icap/c_icap-060708rc1.tar.gz"
$ tar xfvz c_icap-060708rc1.tar.gz
$ cd c_icap-060708rc1

Standardmäßig verwendet c-icap die unter Debian nicht existierende Gruppe nobody. Aus diesem Grund müssen alle Stellen an denen die Gruppe nobody vorkommt in die Debian konforme Gruppe nogroup umbenannt werden:

1
2
3
4
5
6
7
$ grep -irn nobody *
c-icap.conf:23:Group nobody
c-icap.conf.in:23:Group nobody
Makefile.am:74: chgrp nobody $(DESTDIR)$(LOGDIR)
Makefile.am:76: chgrp nobody $(DESTDIR)$(SOCKDIR)
Makefile.in:1309:       chgrp nobody $(DESTDIR)$(LOGDIR)
Makefile.in:1311:       chgrp nobody $(DESTDIR)$(SOCKDIR)

Sobald die Gruppen umbenannt sind, kann mit der Konfiguration der Sourcen fortgesetzt werden:

1
2
3
$ ./configure --enable-static --with-clamav --sysconfdir=/etc/icap
$ make
$ make install

Nach der Installation von c-icap muss dessen Konfiguration folgendermaßen angepasst werden:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
...

Port 1344
User proxy
Group nogroup

...

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

...

## An example of acl lists for default_acl controller.
## acl and icap_access  are aliases for default_acl.acl and default_acl.icap_access
#acl localnet_options src 192.168.1.0/255.255.255.0 type options
#acl localnet_respmod src 192.168.1.0/255.255.255.0 type respmod
#acl localnet src 192.168.1.0/255.255.255.0
##Use the folllowing to demand use of username ......
##acl localnet src 192.168.1.0/255.255.255.0 user *
#acl externalnet src 0.0.0.0/0.0.0.0
#acl barbarian src 192.168.1.5
acl localsquid_respmod src 127.0.0.1 type respmod
acl localsquid src 127.0.0.1
acl externalnet src 0.0.0.0/0.0.0.0

...

#Also you can specify which hosts to log or not.
# Comment out the folowing two lines to log only the external net
#icap_access nolog localnet
#icap_access log externalnet
icap_access allow localsquid_respmod
icap_access allow localsquid
icap_access deny externalnet

...

srv_clamav.ClamAvTmpDir /tmp

...

srv_clamav.VirHTTPServer  "http://localhost/cgi-bin/get_file.pl?usename=%f&remove=1&file="

...

Nun wird das get_file-Perlskript installiert, das sich um das herunterladen von Dateien kümmert. Dazu wird ein funktionsfähiger Webserver mit Perl Unterstützung benötigt.

1
2
3
4
5
6
7
8
9
$ cd /var/spool/squid/
$ mkdir -p clamav/scripts
$ mkdir clamav/downloads
$ chown -R proxy:nogroup clamav
$ cp -p c_icap-060708rc1/contrib/get_file.pl /var/spool/squid/clamav/scripts/
$ vi /var/spool/squid/clamav/scripts/get_file.pl

Zeile 27 ($filename="/srv/www/htdocs/downloads/".$args{"file"};) anpassen:
$filename="/var/spool/squid/clamav/downloads/".$args{"file"};

Anschließend sollte der c-icap Daemon startklar für den ersten Betrieb sein:

1
$ c-icap -d 5 -f /etc/icap/c-icap.conf

Mit

1
$ ps aux | grep icap

kann überprüft werden, ob der Dienst auch läuft. Ist dies der Fall, kann mit dem ersten Test begonnen werden, indem /bin/ls auf Viren geprüft wird:

1
2
3
4
$ icap-client -f /bin/ls -s "srv_clamav?allow204=on&force=on&sizelimit=off&mode=simple"
ICAP server:localhost, ip:127.0.0.1, port:1344

No modification needed (Allow 204 responce)

Interessanter ist allerdings der Test auf einen tatsächlichen Virus. Dazu leistet der Eicar Testvirus gute Dienste. Dieser kann beispielsweise unter http://www.rexswain.com/eicar.html (eicar2.zip) herunter geladen werden.

1
2
3
4
$ cd /tmp
$ wget ...
$ icap-client -f /tmp/eicar.com -s "srv_clamav?allow204=on&force=on&sizelimit=off&mode=simple"
ICAP server:localhost, ip:127.0.0.1, port:1344

Abschließend wird dem c-icap Daemon noch ein Start/Stop Skript verpasst: c-icap Start/Stop Skript

1
2
3
4
5
$ cd /etc/init.d/
$ wget "http://andre.frimberger.de/wp-content/uploads/2009/03/c-icap.txt"
$ mv c-icap.txt c-icap
$ chown root:root c-icap
$ chmod u=rwx,g=rx,o=rx c-icap

Squid Konfiguration

Zu guter letzt wird die Konfiguration von Squid angepasst, indem folgende Zeilen am Ende der squid Konfigurationsdatei angefügt werden:

1
2
3
4
5
6
7
8
9
10
icap_enable on
icap_preview_enable  on
icap_preview_size    128
icap_send_client_ip  on

icap_service         service_avi_req reqmod_precache 0 icap://localhost:1344/srv_clamav
icap_service         service_avi respmod_precache 1 icap://localhost:1344/srv_clamav

icap_class           class_antivirus service_avi service_avi_req
icap_access          class_antivirus allow all