среда, 8 апреля 2015 г.

Squid 3: Антивирусное сканирование "на лету" с помощью ClamAV+squidclamav

Вообще, на Squid Wiki все четко и внятно описано. Для понимающих английский. ;)

Для тех, кто не понимает (что вы делаете в IT,  в таком случае?), придется, пожалуй, пересказать на родном языке.

Введение

Итак, нафига это надо.

Я заранее хочу послать в пешее эротическое путешествие всех, кто трындит, что-де, ClamAV недостаточно хорош, что он-де не ловит абсолютно все вирусы и малварь, не только существующую на момент "здесь и сейчас", но и еще не существующую - и что-де эвристика у него плоха и вообще "как страшно жить". Он уменьшает количество малвари, проникающее в локальные сети, снижая вероятность поражения клиентов - и это самое главное

Любителей противоестественного секса с пингвинами я тоже хочу послать в означенном направлении. Катитесь в жопу, вьюноши-бледные-с-красными-глазами. Мир не ограничивается и не заканчивается на вашем самодельном дерьме, в нем есть и другие системы - хотите вы этого или не хотите. И так будет и впредь. Не вы ли кричите за свободу выбора и разнообразие? Ну так начните с себя, мать вашу.

Наша цель - коммунизм Наша цель - обеспечить возможно более полную проверку на вирусы/малварь по-возможности бОльшего количества трафика, вливающегося в нашу локальную сеть/сети. Нет, я пока не касаюсь SSL Bump - хотя  это, само собой, подразумевается (Да, теперь это возможно. Да, это возможно уже довольно давно. Нет, никто не виноват, что вы ленивые и вонючие тормоза, которым лень не то, что жопу оторвать, а кликнуть пару раз мышью или загуглить. Да, для полноценного SSL Bump вам надо быть не поганым линуксоёбом, ничего не умеющим, кроме как apt get и копипастить чужие конфиги, а также стонать на форумах красноглазых идиотов в поисках помощи от таких же ленивых недоумков, а некисло поработать напильником и понимать, наконец, как это, мать его, работает. Короче, вы, придурки, просто готовить его не умеете. Хотя я надеюсь, что вы не из таких и это не про вас писано, верно?).

Цензура все почикала. :)


Компиляция и конфигурирование C-ICAP

Итак, сперва вам нужно, разумеется, скомпилировать Squid с поддержкой C-ICAP (для версий 3.4.x, версии старше 3.5.x включают данную опцию по умолчанию):

./configure '--enable-icap-client'

Затем вам нужно скачать и скомпилировать собственно C-ICAP сервер:

# 32 bit
./configure 'CXXFLAGS=-O2 -m32 -pipe' 'CFLAGS=-O2 -m32-pipe' --enable-large-files --without-bdb --prefix=/usr/local


# 64 bit
./configure 'CXXFLAGS=-O2 -m64 -pipe' 'CFLAGS=-O2 -m64 -pipe' --enable-large-files --without-bdb --prefix=/usr/local


make/gmake


make/gmake install-strip


Само собой, надо позаботиться об автоматическом запуске сервиса C-ICAP в вашей операционке, так же, как и о запуске Squid (но не прямо сейчас!).

Прежде, чем запускать C-ICAP, надо позаботиться о редактировании его конфигурации (любители тупо копипастить конфиги сейчас подорвутся на мине :)):

PidFile /var/run/c-icap/c-icap.pid
CommandsSocket /var/run/c-icap/c-icap.ctl
StartServers 1
MaxServers 20
MaxRequestsPerChild 100
Port 1344
User squid
Group squid
ServerAdmin yourname@yourdomain
TmpDir /tmp
MaxMemObject 131072
DebugLevel 0
ModulesDir /usr/local/lib/c_icap
ServicesDir /usr/local/lib/c_icap
LoadMagicFile /usr/local/etc/c-icap.magic
ServerLog /var/log/i-cap_server.log
AccessLog /var/log/i-cap_access.log
Service echo srv_echo.so


Теперь его можно запустить и убедиться, что он работает.

Компиляция, конфигурирование и запуск ClamAV

ClamAV есть в большинстве репозиториев и может быть получен оттуда. Хотя его можно скомпилировать и из исходников (а, в ряде случаев, вам и придется его компилировать самим, например, если нужна 64-битная версия. При настройке clamd следует быть очень консервативным с опциями. Я не рекомендую использовать SafeBrowsing из-за проблем с производительностью и памятью, а также включать PUA из-за ложных срабатываний. Также позаботьтесь об обновлениях антивирусных баз - это надо делать часто. Я обычно обновляю их 24 раза в сутки. Замечание: ClamAV-демон (clamd) требует довольно много оперативной памяти, он использует около 200-300 мегабайт в минимальной конфигурации, это число может быть значительно выше во время глубокого сканирования больших архивов. Если необходимо,  вы можете поставить его на отдельном хосте с быстрым сетевым соединением до вашего прокси-сервера (эта опция действительна только при использовании squidclamav).

Позаботьтесь об автоматическом запуске clamd и freshclam (честно вам скажу, джентльмены - использовать cron можно, но как-то неаккуратненько).

Компиляция и конфигурирование squidclamav


# 32 bit
./configure 'CXXFLAGS=-O2 -m32 -pipe' 'CFLAGS=-O2 -m32 -pipe' --with-c-icap=/usr/local

# 64 bit
./configure 'CXXFLAGS=-O2 -m64 -pipe' 'CFLAGS=-O2 -m64 -pipe' --with-c-icap=/usr/local

make/gmake

make/gmake install-strip

Разумеется, разрядность вы выбираете в зависимости от разрядности C-ICAP, не забыли?

Теперь нужно подкорректировать конфигурацию самого squidclamav:

maxsize 5000000

# When a virus is found then redirect the user to this URL. Specify proxy web port
# which listen all redirects.
redirect http://your_proxy_fqdn:8080/cgi-bin/clwarn.cgi.en_EN

#squidguard /usr/local/bin/squidGuard

# Path to the clamd socket, use clamd_local if you use Unix socket or if clamd
# is listening on an Inet socket, comment clamd_local and set the clamd_ip and
# clamd_port to the corresponding value.
clamd_local /tmp/clamd.socket
#clamd_ip 192.168.1.5,127.0.0.1
#clamd_port 3310

# Set the timeout for clamd connection. Default is 1 second, this is a good
# value but if you have slow service you can increase up to 3.
timeout 1
logredir 1
dnslookup 0
safebrowsing 0

# Do not scan images
abort ^.*\.(jp(e?g|e|2)|gif|png|tiff?|bmp|ico)(\?.*|$)
abortcontent ^image\/.*$

# Do not scan text files
abort ^.*\.((m?|x?|s?)htm(l?)|css|js|xml|php|json)(\?.*|$)
abortcontent ^text\/.*$
abortcontent ^application\/x-javascript$

# Do not scan streamed videos
abortcontent ^video\/x-flv$
abortcontent ^video\/mp4$

# Do not scan flash files
abort ^.*\.swf$
abortcontent ^application\/x-shockwave-flash$

# Do not scan sequence of framed Microsoft Media Server (MMS) data packets
abortcontent ^.*application\/x-mms-framed.*$

# White list some sites
whitelist .*\.clamav.net
whitelist .*\.avast.com
whitelist .*\.symantec.com
whitelist .*\.symantecliveupdate.com
whitelist .*\.kaspersky.*
whitelist .*\.drweb.com
whitelist .*\.mcafee.com
whitelist .*\.estnod32.ru
whitelist .*\.fsecure.com
whitelist .*\.sophos.com
whitelist .*\.avg.com

whitelist .*\.download.windowsupdate.com
whitelist .*\.download.microsoft.com
whitelist .*\.update.microsoft.com

whitelist .*\.cdn.mozilla.net
whitelist .*\.googlevideo.com
whitelist .*\.youtube.com

Обратите внимание на следующее. Некоторые типы контента нет смысла проверять и впустую грузить сервер, так же, как и некоторые сайты. Это сильно ускоряет работу вашего антивируса, и, как следствие, работу прокси в целом. Дополните списки по необходимости.

Добавьте следующую строчку в c-icap.conf файл:

Service squidclamav squidclamav.so


Теперь можете перезапустить c-icap сервис. Да, и не забудьте создать символическую ссылку на соответствующий вашему языку clwarn.cgi.xx_XX файл (где xx/XX - код вашего языка) в директории cgi-bin вашего веб-сервера прокси (либо просто скопируйте туда соответствующий файл - хотя это не по-админски ;)).


Конфигурирование Squid

Осталось немного. :)

Добавьте в конфигурацию вашего Squid (подразумевается версия не ниже 3.4.10) следующую секцию:

# -------------------------------------
# Adaptation parameters
# -------------------------------------
icap_enable on
icap_send_client_ip on
icap_send_client_username on
icap_client_username_encode off
icap_client_username_header X-Authenticated-User
icap_preview_enable on
icap_preview_size 1024
icap_service service_avi_req reqmod_precache icap://localhost:1344/squidclamav bypass=off
adaptation_access service_avi_req allow all
icap_service service_avi_resp respmod_precache icap://localhost:1344/squidclamav bypass=on
adaptation_access service_avi_resp allow all


Теперь можно запустить Squid и проверить cache.log на предмет ошибок.

Тестирование 

Подключитесь к вашей сети как клиент, использующий прокси, и зайдите на EICAR. Тестовые файлы должны вызывать четкое срабатывание антивируса и редирект на страницу-заглушку squidclamav.

Производительность (заключение)

Опыт использования данной конфигурации показал достаточно высокую скорость проверок. В сравнении с другими конфигурациями, данная конфигурация самая быстрая (исключая лишь аналогичную комбинацию с eCAP). Все же следует избегать слишком перегрузочных конфигураций clamd, высокозагруженные прокси должны использовать clamd, размещенный на отдельных хостах. Так же не следует злоупотреблять тотальными проверками и стараться не проверять возможно бОльшее число доверенных сайтов. Разумеется, вы будете постоянно искать компромисс между безопасностью и скоростью.

В некоторых случаях узким местом может стать сервер C-ICAP, в такой ситуации вам, возможно, придется скорректировать процессные параметры сервиса. Также учтите тот факт, что сервис C-ICAP загружает CPU значительно сильнее, чем собственно Squid, поэтому вам необходимо помнить о том, что проверки должны начинаться и завершаться как можно быстрее.

Из этих соображений минимизируйте контент, который следует проверять. И, разумеется, никогда не следует проверять аудио- или видео-потоки. :)