Использование Squid+ClamAV+c-icap для проверки web-трафика на вирусы
Администрирование
Статья была опубликована 1 февраля 2010 года в 00:00, а последний раз правилась 1 февраля 2010 года в 10:46.
Постоянная ссылка: http://www.nixp.ru/articles/33.html
Я принимал участие в бета-тестировании icap-демона от Dr.Web, остался им доволен (несмотря на некоторые проблемы, не решенные на этот момент), но финансовая сторона вопроса меня сильно ограничивает, поэтому в очередной раз мой выбор пал на ClamAV.
Использование Squid с помощью ClamAV и c-icap для проверки web-трафика на вирусы
Предыстория
В предыдущей статье («Использование ClamAV для проверки ресурсов Samba 3.0.x в Linux») я описал настройку совместной работы ClamAV и Samba для прозрачной проверки загружаемых файлов. Но Samba — не единственный источник потенциальной вирусной угрозы: обычный web-серфинг представляет собой намного бОльшую угрозу, поскольку является внешним источником опасности (Samba же — внутренний источник). В антивирусной защите следует прежде всего контролировать (проверять) всю поступающую извне информацию, один из источников которой — интернет.
Актуальность защиты Samba-ресурсов (те, кто знаком с Win32.Parite.2, меня прекрасно поймут) также достаточно высока. В этой статье я обратил внимание на проверку web-трафика, проходящего через Squid на вирусы, используя ClamAV и c-icap (с протоколом ICAP можно более подробно ознакомиться на сайте www.i-cap.org). Это наиболее верный способ антивирусной проверки web-трафика. Редиректоры в Squid тоже можно использовать, но при больших нагрузках редиректоры сильно ограничены и не позволяют распределить нагрузку. Кроме того, редиректоры крайне ограничены и в возможности обратного взаимодействия с пользователем.
Я принимал участие в бета-тестировании icap-демона от Dr.Web, остался им доволен (несмотря на некоторые проблемы, не решенные на этот момент), но финансовая сторона вопроса меня сильно ограничивает, поэтому в очередной раз мой выбор пал на ClamAV.
Получение необходимых файлов
Для дальнейших действий понадобится:
- Исходные коды Squid Proxy Server с поддержкой ICAP. Одну из возможных вариаций можно получить со страницы c-icap — http://sourceforge.net/projects/c-icap, последней на этот момент из этого источника оказалась версия 2.5.STABLE11-20050927 (я использовал версию именно от разработчиков c-icap). Также можно получить Squid с поддержкой ICAP от DrюWeb на download.drweb.com. Первый источник отличен от второго тем, что в первом не исправлена проблема с обрывом закачки клиентом (т.е. прокси-сервер в любом случае скачивает файл до конца, что ведет к расходу трафика).
- c-icap — демон ICAP — http://sourceforge.net/projects/c-icap, последняя версия на данный момент — c-icap-220505.
- Последняя версия ClamAV, которую нам предоставляют разработчики этого свободного (GNU GPL) антивируса — www.clamav.net.
Установка и настройка ClamAV
О процессе установки и настройки ClamAV можно более подробно узнать из предыдущей статьи — «Использование ClamAV для проверки ресурсов Samba 3.0.x в Linux (на примере Slackware Linux 10.1)».
Для работы не понадобится работающий демон clamd, так что можете смело пропустить его конфигурирование (clamd.conf), если он не используется или не будет использоваться.
c-icap работает со своим антивирусным модулем, основанным на ClamAV, поэтому нам понадобится наличие в системе libclamav (достаточно установленного обычным способом ClamAV). В случае отсутствия в системе libclamav c-icap просто не соберется.
Установка и настройки c-icap с поддержкой ClamAV
Распакуем архив c_icap-220505.tar.gz в /usr/src (или туда, где у вас лежат исходные коды). Скрипт configure в каталоге с исходниками c-icap следует запускать со следующими параметрами:
$ ./configure --enable-static --with-clamav --prefix=/usr/local/c_icap
Или, например, так, если --prefix=/opt/clamav для configure от ClamAV:
$ ./configure --enable-static --with-clamav=/opt/clamav --prefix=/usr/local/c_icap
Демон c_icap собирается статически. --prefix также можно указать по вкусу. Можно собирать и сам демон:
$ make
Необходимо проверить, все ли верно собралось:
$ make check
И непосредственно установить c-icap в систему (в тот каталог, который был указан через --prefix):
# make install
Теперь необходимо исправить некоторые настройки в c-icap.conf. В случае нашего --prefix=/usr/local/c_icap не трудно догадаться, что конфиги лежат в /usr/local/c_icap/etc.
Рекомендую обратить внимание на следующие параметры:
- User лучше поставить nobody, поскольку wwwrun, указанный по умолчанию, скорее всего отсутствует в системе.
- TmpDir /tmp — ваш каталог временных файлов.
- Далее необходимо настроить ACL — Access Control Lists — список IP-адресов, которые могут использовать данный ICAP-демон:
acl localsquid_respmod src 127.0.0.1 type respmod acl localsquid src 127.0.0.1 acl externalnet src 0.0.0.0/0.0.0.0 icap_access allow localsquid_respmod icap_access allow localsquid icap_access deny externalnet
Так можно определить, откуда разрешен доступ к нашему сервису icap, а откуда — нет. Заметьте, что в данных ACL определяется не список непосредственных клиентов прокси-сервера, а именно список клиентов демона ICAP, т.е. список прокси-серверов (их IP-адреса).
Я составил ACL для случая работы демона ICAP и Squid на одном хосте.
- srv_clamav.ClamAvTmpDir /tmp — временный каталог для модуля ClamAV.
- srv_clamav.VirSaveDir /var/infected/ — каталог карантина. Другие аналогичные лучше закомментировать!
- srv_clamav.VirHTTPServer «DUMMY».
Можно попробовать и так:
srv_clamav.VirHTTPServer "http://proxy.your_srv_name.ru/cgi-bin/get_file.pl?usename=%f&remove=1&file="
— URL скрипта на локальном web-сервере, ссылка на который будет сообщена пользователю в уведомлении о попытке доступа к инфицированному объекту.
Необходимо некоторое пояснение: опция srv_clamav.VirSaveDir может быть задана несколько раз — таким образом, что инфицированные файлы будут сохраняться в множестве мест. Если задать одним из карантинных каталогов корень web-сервера, то можно дать пользователям возможность осознанно скачать инфицированный файл. Остается только воспользоваться файлом contrib/get_file.pl в исходных кодах c-icap.
У меня необходимости в этом не было.
Создайте каталог /var/infected и сделайте его владельцем пользователя nobody (chown nobody /var/infected).
Осуществим пробный запуск c-icap:
# cd /usr/local/c_icap/bin # ./c-icap
Если сообщений об ошибках нет, то стоит убедиться и в том, что c-icap прослушивает нужный сокет:
# netstat -apn | grep 1344
Если видим нечто похожее на следующую строку, все в порядке:
tcp 0 0 *:1344 *:* LISTEN 24302/c-icap
Оставим демона c-icap работать и перейдем к дальнейшим настройкам.
Установка и настройка прокси-сервера Squid
Распакуем в /usr/src полученный ранее Squid:
# tar zxvf squid-icap-2.5.STABLE11-20050927.tgz
Перейдем в каталог с исходниками Squid и запустим configure так:
$ ./configure --enable-icap-support
До запуска configure в Squid от Dr.Web необходимо запустить bootstrap.sh, находящийся в корневом каталоге исходных кодов Squid. Если вы используете Squid от Dr.Web, то обязательно прочитайте документацию из пакета drweb-icapd!
Собираем Squid:
$ make
Устанавливаем:
# make install
Имеем установленный Squid в /usr/local/squid. Теперь изменим настройки в squid.conf.
Необходимо найти пару строк:
#acl our_networks src 192.168.1.0/24 192.168.2.0/24 #http_access allow our_networks
Раскомментировать их и установить собственное значение, вместо 192.168.1.0/24 192.168.2.0/24 (в моем случае пользователи прокси-серверs находились в сети 172.16.194.0/24):
acl our_networks src 172.16.194.0/24 http_access allow our_networks
Перейдите в /usr/local/squid/var, создайте каталог cache. Теперь там же выполните команду:
# chown nobody cache/ logs/
Сменить владельца необходимо по той причине, что демон прокси-сервера будет запущен от пользователя nobody и не сможет писать логи и использовать кэш.
Осталось создать структуру каталогов для кэширования. Перейдите в /usr/local/squid/sbin и выполните:
# ./squid -z
По умолчанию параметр cache_dir в squid.conf задан так:
cache_dir ufs /usr/local/squid/var/cache 100 16 256
Вы можете изменить путь к кэшу (например, если он расположен у вас на другом разделе или жестком диске), и тогда необходимо проверить права на указанный вами каталог.
На данном этапе мы имеем рабочий Squid, но без поддержки ICAP, т.е. обычной кэширующий прокси-сервер.
Более подробно о настройке Squid можно узнать на squid.opennet.ru.
Добавим поддержку ICAP…
Добавление поддержки ICAP в squid.conf
Найдите по слову icap_enable и выставите значение icap_enable on. Найдите по слову icap_preview_enable и выставите значение icap_preview_enable on. Найдите по слову icap_preview_size и выставите значение icap_preview_size 128. Найдите по слову icap_send_client_ip и выставите значение icap_send_client_ip on. Найдите по слову icap_service и добавьте пару таких icap-сервисов:
icap_service service_avi_req reqmod_precache 0 icap://localhost:1344/srv_clamav icap_service service_avi respmod_precache 1 icap://localhost:1344/srv_clamav
Найдите по слову icap_class и добавьте такой icap-класс:
icap_class class_antivirus service_avi service_avi_req
Найдите по слову icap_access и добавьте следующие права доступа:
icap_access class_antivirus allow all
Суммарно для поддержки ICAP в squid.conf должны быть добавлены следующие строки:
icap_enable on icap_preview_enable on icap_preview_size 128 icap_send_client_ip on
icap_service service_avi_req reqmod_precache 0 icap://localhost:1344/srv_clamav icap_service service_avi respmod_precache 1 icap://localhost:1344/srv_clamav
icap_class class_antivirus service_avi service_avi_req icap_access class_antivirus allow all
На этом минимальное конфигурирование прокси-сервера закончено.
Запустим его:
# cd /usr/local/squid/sbin # ./squid
Если все верно, то сообщений в консоли быть не должно.
Проверка работоспособности
Добавьте прокси-сервер в вашем браузере (если проксирование не прозрачное) и откройте страницу http://www.eicar.com/anti_virus_test_file.htm.
Попытайтесь скачать файл eicar.com. Если вы видите подобное сообщение: «A VIRUS FOUND …» — значит все верно работает.
Обратите внимание, что кэш прокси-сервера не должен содержать инфицированных объектов! Поэтому перед началом использования Squid совместно с c-icap кэш лучше очистить. Так же учтите, что браузер имеет свой кэш.
Обновление антивирусных баз ClamAV
Добавьте freshclam в crontab. Реинициализация баз c-icap производится каждые srv_clamav.VirUpdateTime минут — этот параметр можно указать в c-icap.conf (по умолчанию, 15 минут).
Файл c-icap.magic и типы проверяемых объектов
Данный файл может быть найден в том же каталоге, что и c-icap.conf. Он представляет собой описание форматов различных групп типов файлов (TEXT, DATA, EXECUTABLE, ARCHIVE, GRAPHICS, STREAM, DOCUMENT — определенные группы в c-icap.magic по умолчанию). Антивирусная проверка строится по типам файлов, проходящих через проски-сервер. Некоторые типы, например, можно исключить или добавить свои типы.
Формат записи строки, для определения файла по его magic-числу (последовательности):
offset:Magic:Type:Group:Desc
Offset — смещение, с которого начинается Magic-последовательность. Type и Group — тип и группа, к которой следует относить файл с данной magic-последовательностью. Desc — краткое описание, технической нагрузки не несет.
Для примера загляните в c-icap.magic.
Обратите также внимание, что в c-icap.conf параметр srv_clamav.ScanFileTypes определяет группы и типы файлов (можно прописывать и группы, и типы), которые следует проверять. Что определяет srv_clamav.VirScanFileTypes, я окончательно не понял, но подозреваю, что принудительно проверяемые группы файлов (EXECUTABLE и ARCHIVE по умолчанию).
В моем конфиге c-icap вышеописанные параметры выглядят так:
srv_clamav.ScanFileTypes TEXT DATA EXECUTABLE ARCHIVE GRAPHICS STREAM DOCUMENT srv_clamav.VirScanFileTypes EXECUTABLE ARCHIVE
Возможные проблемы
- Squid выдает сообщение ICAP protocol error, страницы не открываются. Проверьте, верно ли вы указали ACL в c-icap.conf, в данном ACL должен быть разрешен доступ не для пользователей, а для прокси-сервера.
Попробуйте завершить процессы Squid и c-icap, а затем запустить их в следующем порядке: сначала c-icap, а затем Squid.
Также такая ошибка может возникать, если демону с-icap не хватает прав на запись в карантинный каталог или в лог-файлы.
Если проблема так и не решилась, то попробуйте запустить Squid с параметрами -d 10 -N -X:
# ./squid -d 10 -N -X
И c-icap c параметрами -N -d 10 -D:# ./c-icap -N -d 10 -D
Увидите подробную информацию, по которой можно разобраться, что и где не так. - Squid выдает сообщение ICAP protocol error только на некоторых страницах (на одних и тех же).
Проверьте, есть ли у c-icap права на запись в карантинный каталог (а еще лучше сделать владельцем всех карантинных каталогов пользователя под которым запущен c-icap).
Попробуйте запустить c-icap и Squid в режиме отладки (как это сделать, сказано выше).
Также неплохо посмотреть логи c-icap.
Попробуйте снова загрузить объект, на котором возникает ошибка. Возможно вы узнаете намного больше о проблеме и сможете ее решить.
Итоги
Теперь и web-серфинг защищен от вирусов и прочих вредоносных кодов (в том числе и некоторые эксплоиты для MS IE). Как корпоративное решение для сервера с большой нагрузкой этот метод не опробован, но, думаю, может быть реализован (хотя бы потому, что нагрузку можно распределить на несколько ICAP-серверов). Как решение для небольшой организации — вполне актуально.
И помните, что разработчики пишут на своем сайте:
- >The Antivirus ClamAV service
- >This service is under development.
О некоторых принципах работы протокола ICAP на русском можно узнать из руководства DrWeb-ICAP — одна из успешных коммерческих реализаций протокола ICAP. Можно прочесть и RFC 3507.
Комфортной и безопасной работы!
Спасибо за внимание.
-
Популярные в этом разделе:
- «Настройка сервера SSH (теория и практика)»,
- «Реализация отправки и приёма SMS с помощью Gnokii»,
- «Настройка сервера OpenLDAP».
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Долго же по вашему руководству бодались, но все-таки победили. Спасибо.
В чем могли дополнили и несколько подводных камней нашли: www.ca22.ru/blog/?p=336