взаимодействие MTA exim и clamAV

Данная статьюшечка кратко описывает взаимодействие MTA exim-4.30 и clamAV-0.65.

кратко о программах

Exim - это MTA, который имеет широкие возможности фильтрации, он как раз и был написан с основным направлением на фильтрацию почты. Отличается от других МТА исчерпывающей документацией (книга на сотни страниц, точное число зависит от версии) и тем, что нет большого изобилия разного рода HOWTO (я сильно не искал, но ни разу мне не попадались такие). Это говорит о том, что exim является настоящим конструктором, надо только научиться читать и понимать его документацию :-).

Еще нам потребуется патч для exim, который расширяет и без того богатые возможности фильтрации этого MTA, патч берется на
http://duncanthrax.net/exiscan-acl/.

Патч нужен для более простой интеграции МТА с различными сканерами вирусов и спама (по крайней мере со всеми популярными АВ-сканерами, а так же spamassassin). Главное, патч позволяет отфильтровать почту на более ранней стадии, чем родной фильтр МТА. Мы сможем проверять почту любыми фичами патча (АВ-сканер, spam detection) и выдать ответ до завершения команды DATA. К сожалению, полностью завернуть (не скачивая) зараженные письма патч не позволяет, видимо, нельзя рвать сессию во время команды DATA по RFC. Зато после DATA можно сказать код какой-нибудь ошибки :-), тогда отсылающий МТА или клиент сразу узнает, что данное письмо не будет доставлено, при этом наш МТА не будет посылать никакого уведомления о вирусе или о спаме. Круто, не правда ли?

ClamAV... как я уже говорил, с патчем exim имеет родную поддержку интерфейса к большинству АВ-демонов, просто clamAV - самый бесплатный из них :- ). Кроме того, он регулярно обновляется. Если я не ошибаюсь, clamAV стал ловить MyDoom раньше, чем DrWeb. К сожалению, clamAV не умеет лечить зараженные файлы, но что вы хотели от бесплатного антивируса? Самый большой недостаток, ИМХО - это то, что clamAV умеет RAR 2.0 и не выше :-(, остальные архиваторы он умеет, но тоже не все. За RAR просто обидно.

установка

Если вы решили ставить все с нуля, нам потребуются последние версии исходных кодов программ, которые можно найти на домашних сайтах. О том, как конфигурировать exim вообще, я рассказывать не буду :-), читайте его документацию.

Порядок сборки вобщем-то значения не имеет. Берем исходники exim, распаковываем, копируем в корень исходников патч и патчим:

patch -p1< exiscan-acl-4.ХХ-ХХ.patch

Потом собираем exim, как написано в его доке: Edit the file called src/EDITME and put the result in a new file called Local/Makefile. Там много комментариев, но если вы чего-то не знаете (пока), то оставьте как есть, потом в доке найдете :-). Юзера и группу, под которыми обычно будет работать exim, ИМХО лучше выбрать mail и mail, так как они есть в большинстве систем, но можно и завести отдельно для exim'а.

Выходим в корень исходников и делаем make. После этого make install или checkinstall, кому что больше нравится :-) (checkinstall - это пакет программ, который надо запускать вместо make install чтобы инсталлировать программу и одновременно создать ее RPM, pkg (.tgz) или deb, чтобы потом проще было удалять). Если в вашей системе можно поставить готовый пакет от производителя дистрибутива (exim + exiscan), то наверное лучше так и сделать, просто не всегда есть такие дистрибутивы.

Дальше ставим или компилим clamAV. Можно выбрать другой префикс и т.д, но я предпочел ограничится указанием местоположения конфига:

./configure --sysconfig-dir=/etc/clamav/

Запустите

./configure –help

дабы узнать полный и точный список возможных опций :-). Потом, как всегда,

make && make install

или

make && checkinstall

Запускаем clamd. Оба-на, надо пойти и поправить его конфиг :-). Там много коментариев, так что рассказывать подробно смысла нету. По-моему, по умолчанию там почти все правильно, надо лишь закомментировать слово Example в начале и указать TCP-порт вместо юниксового сокета. TCP лучше тем, что при крахе питания, например, не остается файла сокета :-), clamd не запустится если видит созданный ранее юниксовый сокет. К тому же файловый дескриптор сокета может стереть кто угодно, а кокнуть TCP порт посложнее будет :-).

Если демон запустился, можно посмотреть его лог, местоположение которого вы должны знать (вы же полностью прочитали конфиг? ;-) Потом можно потестить: возьмите какой-нибудь вирус и натравите на него clamdscan. "Легко сказать" - возразите вы :-), - "где ж брать вирусы-то, когда все от них пытаются избавиться?" В исходниках clamav есть тестовый каталог (test), вот и тренируйтесь на нем, там не вирусы, а просто засигнатуренные файлики, некоторые заархивированы различными архиваторами. Допустим, у вас пока все получилось. Теперь конфигурим exim чтобы он сам, то есть без костылей, мог обращаться к демону АВ и просить его посканить временный файлик.

Для начала немножко теории. Пропатченный эксим имеет новую опцию в главной секции конфига: av_scanner. С помощью нее можно указать MTA любой сканер АВ командной строки или (что гораздо более интересно) тип демона и порт (или домен и сокет). Разумеется, только из списка демонов, которые поддерживает патч; благо, что их там много :-). Мы напишем ему про clamd:

av_scanner = clamd:127.0.0.1 3310

Так по-умолчанию запускается clamd. Далее мы собрались проверять тело письма, а для этого у exim'а есть специальный acl - acl_smtp_data, который в умолчальном конфиге не используется (читаем доку про этот acl, если интересно :-). А мы будем его использовать так:

# в главной секции укажем имя acl, а потом опишем его (см. ниже)

acl_smtp_data = acl_check_virus
# в секции описания acl
acl_check_virus:
deny message = Message rejected: virus found. I don't need virus :-).
hosts = *
malware = *
accept

Тут мы не пускаем сообщение, если оно содержит malware (злобное программное обеспечение). Это очень простой пример. Рекомендуется так же распаковывать MIME-содержимое, это делается добавлением demime = * перед malware = *. А вообще, советую посмотреть acl в дефолтном конфиге пропатченного exim-4.30, acl имеет имя acl_check_content и по умолчанию не выполняется.

Проверить все целиком можно так: послать с другого хоста тестовые файлики на хост с установленным exim+exiscan+clamd. Если вы тут же получите отлуп, то все замечательно, если письмо пройдет, то надо читать логи МТА и clamd, думать головой и разбираться... Я тестировал вирусом MyDoom, у меня срабатывал отлуп без demime. Наверное, clamd продвинулся? :-).

Будет полезным настроить демон обновления баз для clamd, точнее запускать программу freshclam в режиме демона при старет системы. Я не мудрствовал и сделал у себя так:

# кусочек моего rc.local, я юзаю Слакварь.
if [ -x /usr/local/bin/freshclam ]; then
/usr/local/bin/freshclam --http-proxy=proxy.tomsk.net \
--proxy-user=warm:passwd \
-l /var/log/freshclam.log \
-d \
-c 4
echo "Starting freshclam AV update ..."
fi

Это запускает freshclam, если он есть, и говорит ему использовать прокси, имя юзера и пароль, писать свои действия в указанный лог, демонизироваться и проверять новые базы 4 раза в сутки. Подробнее читайте в документации.

В результате вышеизложенных действий можно получить МТА, который не возьмет почту, содержащую malware, имеющую неправильные MIME-типы данных (например, 8-битные символы в поле Subject не допустимы по RFC и должны кодироваться 7-битными). Разумеется, что это можно сделать с любым современным МТА, главная же фишка состоит в том, что сообщение об отлупе письма дается так скоро, как это только возможно, а это умеют делать далеко не все МТА. В основном встречаются варинаты, когда МТА принимает сообщение и говорит "ОК", потом начинает его рассматривать, проверять на вирусы, пропускать или посылать обратное сообщение и/или сообщение администратору об ошибке и вирусах, занимать дисковое пространство под карантин :-).

Зачем это надо? Когда можно сначала все проверить, а потом окончательно принять сообщение для дальнейшей передачи или просто дать отлуп и ничего не посылать.



Антон Жаровцев, "Slackware Linux в Томске".


Сетевые решения. Статья была опубликована в номере 04 за 2006 год в рубрике sysadmin

©1999-2024 Сетевые решения