| Squid: нещадно режем баннеры и проверяем на вирусы |
(Перепечатано из журнала "Хакер")Несмотря на то, что кэширующий прокси-сервер Squid прекрасно справляется с задачей ограничения доступа к различным ресурсам, проверять файлы на вирусы и блокировать баннеры штатными средствами крайне проблематично. Здесь на помощь приходят сторонние разработки и дополнения. Blacklist c adzapperSquid предоставляет несколько вариантов блокировки ресурсов – по IP-адресу, URL или ключевому слову. Первые два метода достаточно просто реализовать за счет парочки acl и http_access. Но тогда администратору придется обновлять список сайтов и адресов вручную. Проблему можно переложить на плечи проектов – от использования белых и черных списков с возможностью автоматического обновления, до фильтрации по ключевым словам и применения эвристического анализа. Есть и комбинированные решения. Например, BannerFilter (phroggy.com/bannerfilter) рассчитан на использование известных адресов баннерных сетей и шаблонов, однако последняя версия датирована 2004 годом, поэтому об автоматизации процедуры обновления blacklist и думать не стоит. Хотя имеющиеся шаблоны вполне можно использовать для блокировки баннеров и всплывающих окон. Аналогично работает ufdbGuard (www.urlfilterdb.com), предлагающий бесплатное обновление баз в течение 60 дней. Есть и другие решения, но, к сожалению, большинство проектов давно не обновлялись. Поэтому выберем то, что поддерживается и доступно в репозитарии Ubuntu. Редиректор adzapper (adzapper.sf.net) также использует списки URL, есть возможность автоматического обновления. Установить и настроить его весьма просто: $ apt-get install adzapper Собственно, все. Пакеты с подобными редиректорами обычно не превышают 100 Кб, поэтому установка проходит быстро. Чтобы прикрутить его к Squid, достаточно добавить в squid.conf всего одну строку. Правда, в зависимости от версии Squid, строка будет отличаться. Например, в Squid 2.5, который лежит в репозитарии Ubuntu 6.06, и в новой 3.0 следует использовать параметр redirect_program: redirect_program /usr/bin/adzapper.wrapper В версии Squid 2.6 используется url_rewrite_program: url_rewrite_program /usr/bin/adzapper.wrapper Вот и все настройки, но этого вполне хватит, чтобы после перезапуска Squid «sudo /etc/init.d/squid restart» часть баннеров была заменена надписью «This is ad zapped». Будут блокированы также всплывающие окна и флэш-анимация. Для ежедневного обновления blacklist (фактически самого скрипта adzapper) достаточно добавить новое задание crontab: $ sudo crontab -e 0 0 * * * root /usr/share/doc/adzapper/examples/update-zapper Работа скрипта обновления проста. С адреса adzapper.sf.net/scrips/squid_redirect скачивается скрипт, который затем копируется на место /usr/bin/adzapper. В самом конце adzapper, в области DATA, находится список шаблонов URL. Хотя опыт показывает, что его обновляют не очень часто. У конфигурационного файла /etc/adzapper.conf настроек немного. Если установить значение: ZAP_MODE="CLEAR" То будет использоваться «тихая» блокировка, без вывода указанной выше надписи. При желании текст легко подменить своим. Адрес, откуда загружаются картинки, указывается в двух переменных: ZAP_BASE=http://adzapper.sourceforge.net/zaps ZAP_BASE_SSL=https://adzapper.sourceforge.net/zaps Никто не мешает здесь указать свой URL, разработчики даже рекомендуют такой вариант. Для этого, естественно, необходим рабочий веб-сервер, например, Apache. После установки adzapper в каталоге /usr/share/doc/adzapper/examples/zaps находятся все нужные шаблоны. Теперь достаточно в конфигурационном файле апача /etc/apache2/apache2.conf указать алиас на этот каталог: $ sudo mcedit /etc/apache2/apache2.conf Alias /zaps /usr/share/doc/adzapper/examples/zaps/ Options FollowSymLinks Indexes AllowOverride Limit Order Allow,Deny Allow from all
И поправить значение ZAP_BASE: ZAP_BASE=http://localhost/zaps Не забывай перезапустить Apache и Squid. Если есть желание, можно изменить файлы, находящиеся внутри каталога zaps, на свои. Увы, часть рекламы все же прорывается сквозь такой заслон. Чтобы не возиться с acl, можно добавить в эту схему Bfilter (bfilter.sf.net), где используется эвристический алгоритм собственной разработки, позволяющий обнаруживать большую часть баннеров и блокировать всплывающие окна. Или добавить squidGuard (www.squidguard.org), речь о котором пойдет ниже. Борьба с вирусамиБаннеры – не самая неприятная вещь, которую можно встретить на сайтах. Большая часть вирусов загружается с различных ресурсов самими пользователями. Задача любого админа – не допустить подобного. Можно просто блокировать файлы с определенным расширением или типом. Но это не всегда применимо. Поэтому давай разбираться, как добавить в нашу схему проверку трафика антивирусом. Для нашей цели подходят, как минимум, два проекта. Решение SquidClamAv (sf.net/projects/squidclamav) является редиректором, работающим с антивирусом ClamAV. Оно позволяет выборочно проверять файлы, основываясь на расширении или контексте. Несколько более продвинутый вариант – HAVP (HTTP Anti Virus Proxy, www.server-side.de) – умеет проверять трафик на лету при помощи нескольких антивирусов (ClamAV, F-Prot, Kaspersky, NOD32, Sophos, AVG, Dr.Web и некоторых других). HAVP – не редиректор и может работать как в связке со Squid, так и в одиночку, обеспечивая прозрачное проксирование. Оба решения достаточно просты, гибки в настройках и работают стабильно. Использовав связку Squid+HAVP, можно реализовать несколько схем работы: squid -> havp, havp -> squid, squid -> havp -> squid. Сюда можно легко добавить adzapper и bfilter. Кроме того, HAVP есть в репозитариях большинства дистрибутивов, что заметно упрощает процедуру установки, так как не нужно производить ряд операций вручную. Поэтому познакомимся именно с ним. Ставим: $ sudo apt-get install havp clamav В процессе инсталляции будет добавлен системный пользователь и группа havp. Также будет установлен пакет clamav-freshclam, который необходим для автоматического обновления антивирусных баз. В настройках по умолчанию HAVP проверяет файлы на наличие вирусов при помощи libclamav. При больших нагрузках необходимо дополнительно инсталлировать пакет clamav-daemon и затем изменить настройки в конфиге HAVP. Если в процессе установки вылезет ошибка вроде «cl_loaddbdir(): Can't get status of /var/lib/clamav/ One or more scanners failed to initialize!», это означает, что libclamav на момент запуска HAVP не установлен. Просто введи «sudo apt-get –f install». Сейчас HAVP и Squid работают каждый сам по себе. Запустив «netstat», ты увидишь, что стал прослушиваться порт 8080 (напомню, что squid по умолчанию работает на 3128). Для проверки работоспособности HAVP настраиваем веб-браузер на работу через server:8080, заходим на страницу www.eicar.org/anti_virus_test_file.htm и пробуем скачать тестовый вирус. Если в ответ получаем сообщение, что файл заблокирован, идем дальше. Сначала рассмотрим, как подключить HAVP в качестве Parent proxy для Squid. То есть – клиент подключается к Squid, а Squid через HAVP уже выходит в интернет. Это весьма простой в реализации и к тому же более рациональный вариант, так как весь входящий трафик проверяется антивирусом, а страницы из кэша Squid выдаются без проверки. Открываем squid.conf и пишем: $ sudo mcedit /etc/squid/squid.conf cache_peer 127.0.0.1 parent 8080 0 no-query no-digest no-netdb-exchange default cache_peer_access 127.0.0.1 allow all # Будем проверять только HTTP acl Scan_HTTP proto HTTP never_direct allow Scan_HTTP Подключаемся к сайту Eicar и проверяем, как работает указанная схема. Добавляем в crontab строчку для автоматического обновления антивирусных баз: 0 * * * * /usr/bin/freshclam -quiet В итоге мы получили полнофункциональную систему, кэширующую трафик, блокирующую вирусы и рекламу. Конфигурационный файл HAVPКак видишь, в предыдущем примере мы даже не заглянули в конфиг HAVP. Все должно работать и без нашего вмешательства, с параметрами по умолчанию. Если понадобится реализовать обратную схему (когда в качестве Parent выступает Squid), тогда, наоборот, все настройки производятся в конфигурационном файле HAVP – /etc/havp/havp.config: $ sudo mcedit /etc/havp/havp.config # Порт и адрес, на котором принимает соединения HAVP PORT 8080 BIND_ADDRESS 127.0.0.1 # Можно дополнительно указать IP-адрес интерфейса для исходящих пакетов #SOURCE_ADDRESS 1.2.3.4 # Указываем Squid в качестве Parent прокси PARENTPROXY 127.0.0.1 PARENTPORT 3128 Теперь подключаемся веб-браузером к порту 8080 и при подключении к серверу проходим цепочку HAVP -> Squid -> Веб-сервер. Есть несколько моментов в конфигурационном файле, на которые хотелось бы обратить внимание. Например, пользователь и группа, от имени которых работает HAVP, указаны в параметрах: USER havp GROUP havp Havp должен иметь право чтения и записи во все рабочие каталоги. Кроме того, при работе с антивирусом часто появляется ошибка «Permissions denied». Чтобы в дальнейшем не было проблем с доступом, я добавляю пользователя havp в группу clamav. Количество процессов, запускаемых демоном HAVP, определяется двумя параметрами: SERVERNUMBER 8 MAXSERVERS 100 Значения по умолчанию подходят для домашнего использования или для небольшой организации. SERVERNUMBER устанавливается в зависимости от количества клиентов. Вот еще два не менее ценных параметра: SCANTEMPFILE /var/spool/havp/havp-XXXXXX TEMPDIR /var/tmp Здесь указывается размещение временных файлов HAVP и каталог для временных файлов антивируса. В руководствах, доступных в Сети, и документации HAVP сказано, что SCANTEMPFILE должен находиться в разделе, смонтированном с использованием параметра mand. Майнтейнер пакета упростил нам задачу, и в стартовом скрипте /etc/init.d/havp есть все, что нужно. В этом можно убедиться, введя команду «mount» после загрузки HAVP: $ mount /var/lib/havp/havp.loop on /var/spool/havp type ext3 (rw,mand,loop=/dev/loop/0) Хотя при больших нагрузках на сервер лучше вынести этот каталог в ОЗУ: $ sudo mount -t tmpfs -o size=100M,mand tmpfs /var/spool/havp В комплекте HAVP есть несколько шаблонов веб-страниц, которые выводятся юзеру при обнаружении вируса и возникновении других проблем. Подключаем русские шаблоны: TEMPLATEPATH /etc/havp/templates/ru Кстати, можно подправить html-файлы внутри этого каталога по своему вкусу. В HAVP также поддерживаются белый и черный списки. Вся информация из первого проходит без проверки на вирусы, а URL, занесенные во второй список, блокируются: WHITELISTFIRST true WHITELIST /etc/havp/whitelist BLACKLIST /etc/havp/blacklist Внутри этих файлов содержатся шаблоны URL. Например, если занести в whitelist строку: */*.gif – тогда все GIF файлы будут проходить без проверки. Некоторые типы архивов ClamAV проверять не умеет. Чтобы пользователь не получал сообщение об ошибке, разрешим пропускать такие файлы, а заодно отключим сканирование изображений, ограничим размер проверяемых объектов и произведем небольшую оптимизацию: FAILSCANERROR false SCANIMAGES false MAXSCANSIZE 5000000 STREAMUSERAGENT Player Winamp iTunes QuickTime Audio RMA/ MAD/ Foobar2000 XMMS Теперь разберем, как подключается к HAVP антивирус ClamAV. По умолчанию проверка производится при помощи libclamav: ENABLECLAMLIB true CLAMDBDIR /var/lib/clamav Причем, нужно проследить, чтобы параметр CLAMDBDIR указывал на тот же каталог, что и параметр DatabaseDirectory в файле /etc/clamav/clamd.conf. Впрочем, если в журнале HAVP /var/log/havp/access.log видим запись вроде: --- Initializing ClamAV Library Scanner ClamAV: Using database directory: /var/lib/clamav/ ClamAV: Loaded 244019 signatures (engine 0.92) ClamAV Library Scanner passed EICAR virus test (Eicar-Test-Signature) --- All scanners initialized Process ID: 8406 – значит, все путем, и ничего трогать не нужно. Далее в havp.config идут параметры, определяющие поведение ClamAV при сканировании зашифрованных архивов, максимальный размер проверяемого файла и др. Чтобы вместо libclamav использовался демон clamd, комментируем предыдущие строки и пишем: ENABLECLAMD true CLAMDSOCKET /var/run/clamav/clamd.ctl Значение второго параметра берем из переменной LocalSocket файла clamd.conf. Это как раз тот случай, когда включение havp в группу clamav будет не лишним. |
Squid: нещадно режем баннеры и проверяем на вирусы