Проверка на вирусы HTTP трафика проходящего через Squid@FreeBSD [2008]
Глядя на работающие почти вхолостую машинки раздающие инет возникло естественное желание прикрутить очередную «полезность», например - проверку веб-трафика на вирусы. Темболее сама идея очень нужная и правильная. Несмотря на наличие антивирусов на всех пользовательских компах - для комплексного подхода к антивирусной защите было решено трафик со 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
Clamav Собственно сам Clamav в виде работающего демона не нужен, нужна только библиотека, поэтому большого смысла в его конфиге помоему нет, но на этапе отладки Clamav приходилось дергать, поетому и чегото менял в конфиге. Резервную копию первоначальных конфигов сделали за нас. Правим /usr/local/etc/clamd.conf Часть опций менять нет смысла, но я остановился на следующих параметрах:
Хотел бы отметить опцию 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». Вот что и где менялось:
# 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. Преимуществом (или недостатком, кому как) есть то, что в родительский кеш не будут попадать запросы описанные параметром сквида 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-адреса пользователей а не сквида - то в сквиде нужно включить эту опцию(вроде включена по умолчанию).
И как доказательство в логах /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», да и в документации на него говорят что это нужно для работы. Хотя и без него вродь нормально. Из того что не долго разбираясь вычитал - то это уходит корнями в Линуксы, и к Фряхе непонятно каким боком относится. Может когда по свободе разгребу.