Squid: нещадно режем баннеры и скрупулезно проверяем на вирусы
Сергей «grinder» Яремчук (grinder@ua.fm, )
Несмотря на то, что кэширующий прокси-сервер Squid прекрасно справляется с задачей ограничения доступа к различным ресурсам, проверять файлы на вирусы и блокировать баннеры его штатными средствами крайне проблематично. Здесь на помощь приходят сторонние разработки и дополнения.
Содержание:
- Blacklist c adzapper
- Борьба с вирусами
- Конфигурационный файл HAVP
- Тяжелая артиллерия squidGuard
- Создаем правила
- Заключение
- Боковые выносы
Squid предоставляет несколько вариантов блокировки ресурсов – по IP-адресу, URL или ключевому слову. Первые два метода достаточно просто реализовать за счет парочки acl и http_access. Но тогда администратору придется обновлять список сайтов и адресов вручную. Эту проблему может взять на себя целый ряд проектов, подходящих к выполнению задачи каждый по-своему – от использования белых и черных списков с возможностью их автоматического обновления, до фильтрации по ключевым словам и применению эвристического анализа. Есть и комбинированные решения. Например, рассчитан на использование известных адресов баннерных сетей и шаблонов, однако последняя версия датирована 2004 годом, поэтому об автоматизации процедуры обновления blacklist и думать не стоит. Хотя имеющиеся шаблоны вполне можно использовать для блокировки баннеров и всплывающих окон. Аналогично работает , предлагающий бесплатное обновление баз в течение 60 дней. Есть и другие решения, к сожалению, большинство проектов давно не обновлялись. Поэтому выберем то, что поддерживается и доступно в репозитарии Ubuntu.
Редиректор также использует списки 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
Работа скрипта обновления проста, c адреса скачивается скрипт, который затем копируется на место /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/ <Directory /usr/share/doc/adzapper/examples/zaps/> Options FollowSymLinks Indexes AllowOverride Limit Order Allow,Deny Allow from all </Directory>
И поправить значение ZAP_BASE:
ZAP_BASE=http://localhost/zaps
Не забываем перезапустить Apache и Squid. Если есть желание, можно изменить файлы, находящиеся внутри каталога zaps, на свои. Часть рекламы все же прорывается сквозь такой заслон. Чтобы не возиться с acl, можно добавить в эту схему , где используется эвристический алгоритм собственной разработки, позволяющий обнаруживать большую часть баннеров и блокировать всплывающие окна, или , речь о котором пойдет чуть ниже.
Баннеры – не самая неприятная вещь, которую можно встретить на сайтах. Большая часть вирусов загружается с различных ресурсов самими пользователями. Задача любого админа – не допустить этого. Можно просто блокировать файлы с определенным расширением или типом, но это не всегда применимо. Поэтому давай разбираться, как добавить в нашу схему проверку трафика антивирусом.
Для этой цели подходят как минимум два проекта. Решение является редиректором, работающим с антивирусом ClamAV, позволяет выборочно проверять файлы, основываясь на расширении или контексте. Несколько более продвинутый вариант – (HTTP Anti Virus Proxy) – умеет проверять трафик на лету при помощи нескольких антивирусов (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, заходим на страницу и пробуем скачать тестовый вирус. Если в ответ получаем сообщение, что файл заблокирован, идем дальше.
Сначала рассмотрим, как подключить 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. Все должно работать и без нашего вмешательства, с параметрами по умолчанию. Если понадобится реализовать обратную схему, то есть когда в качестве 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 будет не лишним.
Без squidGuard описание полезных дополнений к Squid было бы не полным. Возможностей у него предостаточно, часто админы не используют и половину из них. С помощью squidGuard можно отфильтровывать и переадресовывать запросы по адресам, именам и регулярным выражениям, распределять пользователей по группам с заданием собственных настроек и указанием временного промежутка. Например, разрешить группе посещать только ресурсы из белого списка. Для ускорения обработки больших списков они хранятся в BerkeleyDB. Установка в Ubuntu сложностей не вызывает:
$ sudo apt-get install squidguard
Подключается squidGuard к Squid так же, как и остальные редиректоры, просто добавляем в squid.conf строку для запуска:
redirect_program /usr/bin/squidGuard redirect_children 5 redirector_bypass on
Все настройки squidGuard производятся в конфигурационном файле /etc/squid/squidguard.conf. Но вначале нужно пояснить структуру БД. Переменная dbhome указывает на каталог, в котором хранятся описания ресурсов. В Ubuntu и некоторых других дистрибутивах – это /var/lib/squidguard/db. При установке с помощью пакетов этот каталог пуст, поэтому придется самому позаботиться о его наполнении. Список blacklist можно взять как из архива исходных текстов программы, так и выбрать любой по ссылке Blacklists на сайте проекта. Списки, предлагаемые сторонними организациями, гораздо полнее и обновляются чаще, поэтому их и будем использовать. Например:
$ ftp www.shallalist.de/Downloads/shallalist.tar.gz $ sudo tar xzvf shallalist.tar.gz –C /var/lib/squidguard/db
В результате внутри обнаружишь целую структуру каталогов с названиями вроде ads, warez и прочее. Порядок следования очень важен, ведь в правилах указывается путь относительно dbhome. Внутри каждого каталога могут находиться следующие файлы:
- domains – список доменных имен и адресов сайтов (ad.count.com);
- urls – список конкретных ссылок на ресурс (site.com/banners);
- expressions – список регулярных выражений, ожидаемых в URL (adult|girls|avi|mp3 и т.д.).
Списков expressions в большинстве blacklist мало, и злоупотреблять ими не стоит, так как их использование сильно нагружает систему.
Еще один момент, связанный с обновлением списка. Например, может возникнуть ситуация, когда требуется добавить или убрать ресурс из blacklist, если это сделать в одном из указанных выше файлов, то при обновлении все изменения будут потеряны. Чтобы избежать этого, сохраняй изменения в нужном подкаталоге в файлах с расширением diff. Например, рядом с оригинальным domains пишем domains.diff. Формат его прост:
+ads.domain.com -domain.com
Первый ресурс будет добавлен в базу, второй убран. При обновлении списка ситуация не изменится.
Если в Squid ресурсы блокируются при помощи связки acl+http_access, то в squidGuard таких параметров намного больше. Например, чтобы описать и затем блокировать ресурсы, содержащие рекламу, добавляем следующее правило:
$ sudo mcedit /etc/squid/squidguard.conf
dest adv {
domainlist adv/domains
urllist adv/urls
expressionslist adv/expression
redirect http://localhost/block.html
}
dest warez {
domainlist warez/domains
urllist warez/urls
}
# И теперь создаем ACL
acl {
default {
pass !adv !warez all
}
}
В примере была создана категория adv, где при помощи трех параметров domainlist, urllist и expressionslist подключаются файлы, находящиеся в каталоге /var/lib/squidguard/db/adv. Описания для остальных ресурсов создаются также. Названия можно брать любые, обычно их выбирают по названию каталога или по назначению, чтобы потом легче было ориентироваться. В документации приведен список зарезервированных слов, советую с ним познакомиться. Список ACL с действием default является правилом по умолчанию.
Параметр dest аналогичен acl в squid.conf, то есть описывает внешний ресурс. Чтобы указать клиентские подключения, применяется src, в качестве значения ему можно передать: отдельный IP-адрес, адрес сети, домен или список пользователей.
src clients {
ip 192.168.1.2-192.168.1.50
}
src admins {
ip 192.168.1.55, 192.168.1.150
}
Временной диапазон задается просто:
time workhours {
weekly mtwhf 09:00-18:00
date *.04.01
}
Под описание work-time попадают дни от понедельника по пятницу (используются первые буквы английских слов) и время с 9 до 18. Плюс сюда же входит первое апреля каждого года.
Время можно использовать прямо в описании клиентов:
src managers {
ip 192.168.0.0/24
within workhours
}
Или непосредственно в acl.
Настраиваем списки контроля доступом:
$ sudo mcedit /etc/squid/squidguard.conf
acl {
# Этой группе режем все, и будем пускать менеджеров только в workhours
managers {
pass !warez !chat !porno !agressive !drugs !ads all
}
# В рабочее время режем все
clients within workhours {
pass !warez !chat !porno !agressive !drugs !ads all
} else {
# После работы только рекламу :)
pass !ads all
}
...
}
Для упрощения я не добавлял описания ресурсов chat, porno и других. Когда правила записаны, создаем базу и устанавливаем права:
$ sudo squidGuard -d -C all $ sudo chown -R squid /var/lib/squidguard/db/*
Хотя это необязательный шаг, при первой загрузке базы будут созданы автоматически, но так можно убедиться в отсутствии ошибок. Для обновления конкретного списка вместо all указываем на конкретный файл. Если обновление производится из diff файла, то используем параметр ‘–u’:
$ sudo squidGuard -u /var/lib/squidguard/db/ads/domains.diff
После чего перезапускаем Squid и проверяем работу.
Как видишь, использование дополнительных решений позволяет превратить Squid в настоящую боевую машину, которая будет блокировать все, что не разрешено администратором. При этом обилие функций никак не усложняет дальнейшее сопровождение системы. Достаточно лишь настроить автоматическое обновление блэклистов и антивирусных баз, а затем добавлять или удалять пользователей.
INFO
-
Хорошей альтернативой HAVP является , он поддерживает только ClamAV, чего вполне достаточно для большинства ситуаций.
-
рассчитан на использование известных адресов баннерных сетей и шаблонов.
-
В используется эвристический алгоритм собственной разработки, позволяющий обнаруживать большую часть баннеров и блокировать всплывающие окна.
WWW
-
Полный список связанных со Squid проектов ты найдешь на .
-
Список ресурсов, предоставляющих готовые blacklist для squidGuard и подробную документацию, ты найдешь на сайте проекта .
Статья опубликована в июньском номере журнала «Xakep» за 2008 год.






«новое задание crontab: $ sudo crontab -e
0 0 * * * root /usr/share/doc/adzapper/examples/update-zapper
Работа скрипта обновления проста, c адреса adzapper.sf.net/scrips/squid_redirect скачивается скрипт, который затем копируется на место /usr/bin/adzapper. »
8]]]] Хлопцы,ну Вы блин даёте…
А в чем собственно проблема? Ты во внутрь update-zapper заглядывал?