Проверка на вирусы HTTP трафика проходящего через Squid / FreeBSD


Глядя на работающие почти вхолостую машинки раздающие инет возникло естественное желание прикрутить очередную «полезность», например - проверку веб-трафика на вирусы. Темболее сама идея очень нужная и правильная. Несмотря на наличие антивирусов на всех пользовательских компах - для комплексного подхода к антивирусной защите было решено трафик со Squid(все пользователи ходят в инет только через него) отдать на растерзание антивирусу. Этим антивирусом будет ClamAv в силу бесплатности и достаточно частых и оперативных обновлений вирусных баз.

Требования
Одним из главных критериев выбора было наличие всего нужного ПО в портах, т.к. ставить софт руками это себе же сделать хуже. Также хотелось минимально «ламать» существующую конфигурацию ПО. Меньше всего подходили варианты, где предлагалось добавлять чегото в настройки клиентов.

После продолжительного гугляния нарисовалось несколько вариантов: c-icap, всякие редиректоры, и через «иерархии кешей».

Вариант с c-icap отпал сам по себе от дикого количества жалоб типа «не ставится», «не работает», «глючит» в большинстве руководств [2].
Редиректоры сами по себе имеют некоторые недостатки, обойдемся без них. Темболее все что нашел интересное для себя в портах - жаловалось «marked as broken: Doesn't build with clamav-0.93»
А вот третий вариант понравился сходу: HAVP(HTTP AntiVirus proxy) [1] - работает как http прокси, проверяющий файлики используя LibClamav.

Есть разные способы свызывания Squid&Havp, вплоть до [5], я остановился на такой схеме: User->Squid->Havp->WWW. Преимуществом даного метода есть то, что в кеш не попадают вирусы, и файлы которые отдаются пользователям из кеша прокси не сканируются по несколько раз антивирусом.

Теперь касаемо железа: HAVP очень любит RAM, к процессору заметных требований не наблюдалось. Из примеров - на мегабитном канале с месячным трафиком порядка 30гб и 20 пользователями нагрузка на процесор 300Mhz около 10% и порядка 150мб занято ОЗУ. На более нагруженных серверах еще не проверял.

В дальнейшем подразумевается что имеется УЖЕ рабочий настроеный сквид. Рассматривать настройку сквиды нет смысла, об этом не писал только ленивый, и установка простейшей конфигурации на FreeBSD не представляет никаких проблем.

Установка
Обновляем коллекцию портов удобным для Вас способом и после запускаем сборку havp. # cd /usr/ports/www/havp/
/usr/ports/www/havp# make


Опции оставляем «как есть»[X] SSL Enable SSL proxying (not scanned, only forwarded!)
[X] CLAMAV Enable libclamav support


За собой оно потянуло следующее: havp-0.88.tar.gz 113 kB
clamav-0.93.tar.gz 15 MB
gmp-4.2.2.tar.gz 2226 kB
arc-5.21o.tgz 80 kB
arj-3.10.22.tar.gz 421 kB
m4-1.4.9.tar.bz2 595 kB
help2man-1.36.4.tar.gz 83 kB
gettext-1.05.tar.gz 7693 B
lha-114i.tar.gz 63 kB
unzoo_4.4.orig.tar.gz 25 kB


После успешной сборки делаем# make install
# make clean


Настройка

Clamav
Собственно сам Clamav в виде работающего демона не нужен, нужна только библиотека, поэтому большого смысла в его конфиге помоему нет, но на этапе отладки Clamav приходилось дергать, поетому и чегото менял в конфиге. Резервную копию первоначальных конфигов сделали за нас.
Правим /usr/local/etc/clamd.conf
Часть опций менять нет смысла, но я остановился на следующих параметрах: < #LogTime yes
> LogTime yes
< LocalSocket /var/run/clamav/clamd
> #LocalSocket /var/run/clamav/clamd
< FixStaleSocket yes
> #FixStaleSocket yes
< ScanMail yes
> ScanMail no
< #MaxScanSize 150M
> MaxScanSize 15M
< #MaxFileSize 30M
> MaxFileSize 8M
< #MaxRecursion 10
> MaxRecursion 3
< #MaxFiles 15000
> MaxFiles 1500


Правим /usr/local/etc/freshclam.conf < NotifyClamd /usr/local/etc/clamd.conf
> #NotifyClamd /usr/local/etc/clamd.conf


Это чтобы freshclam не ругался на незапущенный clamd: WARNING: Clamd was NOT notified:

HAVP
Опять же, о дефолтовых конфигах позаботились за нас,
Правим: /usr/local/etc/havp/havp.config < REMOVETHISLINE deleteme
> #REMOVETHISLINE deleteme
< # LOG_OKS true
> LOG_OKS false
< # FORWARDED_IP false
> FORWARDED_IP true
< # PORT 8080
> PORT 3127
< # BIND_ADDRESS 127.0.0.1
> BIND_ADDRESS 127.0.0.1
< # TEMPLATEPATH /usr/local/etc/havp/templates/en
> TEMPLATEPATH /usr/local/etc/havp/templates/ru
< # FAILSCANERROR true
> FAILSCANERROR false
< # SCANNERTIMEOUT 10
> SCANNERTIMEOUT 5
< # RANGE false
> RANGE true
< ENABLECLAMLIB false
> ENABLECLAMLIB true
< # CLAMDBDIR /path/to/directory
> CLAMDBDIR /var/db/clamav
< # CLAMMAXFILESIZE 100
> CLAMMAXFILESIZE 25
< # CLAMMAXRECURSION 8
> CLAMMAXRECURSION 3


Хотел бы отметить опцию LOG_OKS - играясь ею можем логировать как все запросы поступающие на HAVP так и только запросы с заразой. Фича очень полезная на этапе отладки в состоянии «true», после настройки имеет смысл выключить.
По умолчанию HAVP в логах пишет источником всех запросов адрес дочернего прокси (127.0.0.1 в даном случае), опция FORWARDED_IP позволяет отображать в логах HAVP IP-адрес пользователя, который может передавать Squid при включеном «forwarded_for on» (который при обычном раскладе целесообразно отключать). Сам HAVP по умолчанию не передает IP-адрес пользователя дальше на веб сервера, что есть хорошо.

Теперь нужно переместить шаблоны сообщений HAVP (русские, английские или все что есть).
/usr/local/share/examples/havp/ папка templates. Ее нужно положить в /usr/local/etc/havp/

Еще о шаблонах: Дефолтовые шаблоны русских сообщений содержат мелкий недочет - сообщения выводятся в красной рамочке красными буквами.
З.Ы. знакомый отписал что "трабл с цветами пофиксили в портах" - сам еще не проверял. Так что юзайте нижеописаное при необходимости.
Я решил вопрос кардинально - везде где надо было поставил «color: black». Вот что и где менялось: diff -Bb /usr/local/share/examples/havp/templates/ru/blacklist.html /usr/local/etc/havp/templates/ru/blacklist.html
< td.havp_scheme.msg_area p.warn {color: #FF6600}
> td.havp_scheme.msg_area p.warn {color: black}
diff -Bb /usr/local/share/examples/havp/templates/ru/dns.html /usr/local/etc/havp/templates/ru/dns.html
< td.havp_scheme.msg_area p.warn {color: #FF6600}
> td.havp_scheme.msg_area p.warn {color: black}
diff -Bb /usr/local/share/examples/havp/templates/ru/down.html /usr/local/etc/havp/templates/ru/down.html
< td.havp_scheme.msg_area p.standart {color: #00AE22}
> td.havp_scheme.msg_area p.standart {color: black}
diff -Bb /usr/local/share/examples/havp/templates/ru/error.html /usr/local/etc/havp/templates/ru/error.html
< td.havp_scheme.msg_area p.warn {color: #FF6600}
> td.havp_scheme.msg_area p.warn {color: black}
diff -Bb /usr/local/share/examples/havp/templates/ru/invalid.html /usr/local/etc/havp/templates/ru/invalid.html
< td.havp_scheme.msg_area p.warn {color: #FF6600}
> td.havp_scheme.msg_area p.warn {color: black}
diff -Bb /usr/local/share/examples/havp/templates/ru/request.html /usr/local/etc/havp/templates/ru/request.html
< td.havp_scheme.msg_area p.standart {color: #00AE22}
> td.havp_scheme.msg_area p.standart {color: black}
diff -Bb /usr/local/share/examples/havp/templates/ru/scanner.html /usr/local/etc/havp/templates/ru/scanner.html
< td.havp_scheme.msg_area p.danger {border-width: 1.5mm; margin-right: 20%; margin-left: 20%; width: 60%;
border-style: ridge; border-color: red; color: #D80028}
> td.havp_scheme.msg_area p.danger {border-width: 1.5mm; margin-right: 20%; margin-left: 20%; width: 60%;
border-style: ridge; border-color: red; color: black}
diff -Bb /usr/local/share/examples/havp/templates/ru/virus.html /usr/local/etc/havp/templates/ru/virus.html
< td.havp_scheme.msg_area p.danger {border-width: 1.5mm; margin-right: 20%; margin-left: 20%; width: 60%;
border-style: ridge; border-color: red; color: #D80028}
> td.havp_scheme.msg_area p.danger {border-width: 1.5mm; margin-right: 20%; margin-left: 20%; width: 60%;
border-style: ridge; border-color: red; color: black}


Также надо создать файлы чернобелых списков для havp:# touch /usr/local/etc/havp/whitelist /usr/local/etc/havp/blacklist


Оформляем автозапуск
/etc/rc.conf### Antivirus for HTTP
#clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
havp_enable="YES"


Предварительный запуск
Запускаем обновление антивирусных баз:# /usr/local/etc/rc.d/clamav-freshclam start
Starting clamav_freshclam.


Смотрим чего получилось:# tail -f /var/log/clamav/freshclam.log
freshclam daemon 0.93 (OS: freebsd6.1, ARCH: i386, CPU: i386)
ClamAV update process started at Thu May 8 17:00:01 2008
main.cvd is up to date (version: 46, sigs: 231834, f-level: 26, builder: sven)
WARNING: getfile: daily-6689.cdiff not found on remote server (IP: 62.236.254.228)
WARNING: getpatch: Can't download daily-6689.cdiff from database.clamav.net
WARNING: getfile: daily-6689.cdiff not found on remote server (IP: 217.19.16.188)
WARNING: getpatch: Can't download daily-6689.cdiff from database.clamav.net
WARNING: getfile: daily-6689.cdiff not found on remote server (IP: 213.73.255.243)
WARNING: getpatch: Can't download daily-6689.cdiff from database.clamav.net
WARNING: Incremental update failed, trying to download daily.cvd
Downloading daily.cvd [100%]
daily.cvd updated (version: 7064, sigs: 49400, f-level: 26, builder: ccordes)
Database updated (281234 signatures) from database.clamav.net (IP: 212.1.60.18)
--------------------------------------


Пробуем стартовать havp: # /usr/local/etc/rc.d/havp start
Starting havp.
Starting HAVP Version: 0.88
Mandatory locking disabled! KEEPBACK settings not used!

# netstat -an |grep 3127
tcp4 0 0 127.0.0.1.3127 *.* LISTEN


Скорее всего полет нормальный, порт слушается, havp запустился.

в логах:# tail -f /var/log/havp/error.log
08/05/2008 17:12:51 === Starting HAVP Version: 0.88
08/05/2008 17:12:51 === Mandatory locking disabled! KEEPBACK settings not used!
08/05/2008 17:12:51 Running as user: havp, group: havp
08/05/2008 17:12:51 --- Initializing ClamAV Library Scanner
08/05/2008 17:12:51 ClamAV: Using database directory: /var/db/clamav
08/05/2008 17:12:58 ClamAV: Loaded 277836 signatures (engine 0.93)
08/05/2008 17:12:58 ClamAV Library Scanner passed EICAR virus test (Eicar-Test-Signature)
08/05/2008 17:12:58 --- All scanners initialized
08/05/2008 17:12:58 Process ID: 85924


SQUID
Предполагая что сквид уже настроен и работает - проводим следующий финт - в конфиг /usr/local/etc/squid/squid.conf лепим:cache_peer 127.0.0.1 parent 3127 0 default no-query
acl FTP proto FTP
always_direct allow FTP
always_direct allow SSL_Ports
#acl no_avir urlpath_regex -i .avi$ .jpg$ .gif$ .mp3$
#always_direct allow no_avir
#never_direct allow all


Теперь подробнее о содеянном: первой строчкой заворачиваем все потенциально кешируемые запросы которых нет «у себя» на родительский прокси которым выступает HAVP. Преимуществом (или недостатком, кому как) есть то, что в родительский кеш не будут попадать запросы описанные параметром сквида hierarchy_stoplist, а это запросы содержащие {'cgi-bin'|'?'} - т.е. запросы к веб скриптам. Вероятность что скрипты будут возвращать вирусы есть, но при определенных условиях эту вероятность можно игнорировать. Таким образом проверятся будут только файлы на которые можно попасть прямой ссылкой (без «cgi-bin» и »?» в адресе). Позитивным моментом есть тот факт, что когда родительский кеш «упал» - то для пользователей это никак не проявляется, сквид работает как обычно.
Если такое поведение не устраивает - то можно запретить сквиду ходить «напрямую», и все запросы переадресовывать на родительский прокси. Для этого включаем опцию «never_direct allow all».
В одном мз двух запусков этой мегасистемы были замечены проблемы с работой аськи через HTTPS (проблем с другим ПО работающим через сквид по HTTPS вродь не замечалось). Для лечения есть смысл исключить HTTPS трафик от отправки на HAVP, всеравно он HTTPS не раскрывает, а по документации только умеет форвардить через себя напрямую (видать не очень хорошо умеет). Собственно для этого пользуем «always_direct allow SSL_Ports». Еще вылезла "фича" - HAVP сам не умеет ходить на FTP, только умеет пересылать такие запросы на вышестоящий прокси. Строить такую связку нет не смысла не желания, поетому выпускаем FTP в мир прямо со squid'а «always_direct allow FTP».
Кстати, таким же образом можно исключить определенные типы файлов из проверки. Достаточно написать нужный ACL.
В конфиге сквиды есть еще другие опции касающиеся работы иерархии кешей, но я с ними пока не разбирался.

Если сквид сконфигурирован с delay pools - то перезапускаем его, иначе можно просто передернуть:# squid -k parse
# squid -k reconfigure


Еще раз о «forwarded_for on» - если хотим видеть на HAVP IP-адреса пользователей а не сквида - то в сквиде нужно включить эту опцию(вроде включена по умолчанию).

Итого
Для проверки заходим на http://www.lissyara.su/scripts/redirect_link.php?link=http://www.eicar.org/anti_virus_test_file.htm и пытаемся качать:
http://www.lissyara.su/scripts/redirect_link.php?link=http://www.eicar.org/download/eicar.com.txt
http://www.lissyara.su/scripts/redirect_link.php?link=http://www.eicar.org/download/eicar_com.zip
http://www.lissyara.su/scripts/redirect_link.php?link=http://www.eicar.org/download/eicarcom2.zip
Если все сделали правильно - должны увидеть в браузере красивое уведомление.

И как доказательство в логах /var/log/havp/access.log 08/05/2008 18:18:12 127.0.0.1 GET 200 http://www.eicar.org/download/eicar.com.txt 356+68 VIRUS ClamAV: Eicar-Test-Signature
08/05/2008 18:19:50 127.0.0.1 GET 200 http://www.eicar.org/download/eicarcom2.zip 363+308 VIRUS ClamAV: Eicar-Test-Signature


Недостатки решения
Пока вроде полет нормальный. Единственное что HAVP при запуске ругается на «Mandatory locking», да и в документации на него говорят что это нужно для работы. Хотя и без него вродь нормально.
Из того что не долго разбираясь вычитал - то это уходит корнями в Линуксы, и к Фряхе непонятно каким боком относится. Может когда по свободе разгребу.

Сцылки
1. http://www.lissyara.su/scripts/redirect_link.php?link=http://www.server-side.de/index.htm - HAVP Домашняя страница
2. http://www.lissyara.su/scripts/redirect_link.php?link=http://www.lissyara.su/?id=1128 - SQUID & ICAP & ClamAV «это почти ни у кого не работает»
3. http://www.lissyara.su/scripts/redirect_link.php?link=http://www.markelov.net/articles.php?lng=ru&pg=186 - Проверяем HTTP-трафик на лету (Старое, ориентированное на линукс)
4. http://www.lissyara.su/scripts/redirect_link.php?link=http://linuxforum.ru/index.php?showtopic=56867 - Squid + HAVP помогите с настройкой
5. http://www.lissyara.su/scripts/redirect_link.php?link=http://havp.hege.li/forum/viewtopic.php?t=179 - Squid Sandwich and SSL/FTP

Обновлено: 13.03.2015