Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #114, ИЮНЬ 2008 г.

Вооруженный бронекальмар

Сергей «grinder» Яремчук (grinder@ua.fm, tux.in.ua)

Хакер, номер #114, стр. 118


Squid: нещадно режем баннеры и проверяем на вирусы

Несмотря на то, что кэширующий прокси-сервер Squid прекрасно справляется с задачей ограничения доступа к различным ресурсам, проверять файлы на вирусы и блокировать баннеры штатными средствами крайне проблематично. Здесь на помощь приходят сторонние разработки и дополнения.

Blacklist c adzapper

Squid предоставляет несколько вариантов блокировки ресурсов – по 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/

<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, можно добавить в эту схему 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 будет не лишним.

Тяжелая артиллерия – squidGuard

Без 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 на сайте проекта. Списки, предлагаемые сторонними организациями, гораздо полнее и обновляются чаще, поэтому их и будем использовать. Например:

$ wget –c 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 является SquidClamAv (sf.net/projects/squidclamav). Он поддерживает только ClamAV, чего для большинства ситуаций – вполне достаточно.
  • BannerFilter (phroggy.com/bannerfilter) рассчитан на использование известных адресов баннерных сетей и шаблонов.
  • В Bfilter (bfilter.sf.net) используется эвристический алгоритм собственной разработки, позволяющий обнаруживать большую часть баннеров и блокировать всплывающие окна.

WWW

  • Полный список связанных со Squid проектов ты найдешь на freshmeat.net.
  • Список ресурсов, предоставляющих готовые blacklist для squidGuard и подробную документацию, ты найдешь на сайте проекта www.squidguard.org.
Содержание