2006 г.
Взаимодействие MTA exim и clamAV
Антон Жаровцев, "Slackware Linux в Томске"
Данная статьюшечка кратенько описывает взаимодействие MTA exim-4.30 и clamAV-0.65. Домашние страницы пакетов программ: http://www.exim.org/ и http://www.clamav.net/. Ещё нам потребуется патч для exim, который расширяет и без того богатые возможности фильтрации этого MTA, патч берётся на http://duncanthrax.net/exiscan-acl/.
Кратко о программах
Exim - это MTA, который имеет широкие возможности фильтрации, он как раз и был написан с основным направлением на фильтрацию почты. Отличается от других МТА исчерпывающей документацией (книга на сотни страниц, точное число зависит от версии) и тем, что нет большого изобилия разного рода ХАУТУ (я сильно не искал, но ни разу мне не попадались такие). Это говорит о том, что exim является настоящим конструктором, надо только читать и понимать его документацию :-).
Патч нужен для более простой интеграции МТА с различными сканнерами вирусов и спама (наверное все популярные АВ сканнеры и даже более, а так же spamassassin, но это темы других статей). Главное, патч позволяет оттесить почту на более ранней стадии, чем родной фильтр МТА. Мы сможем проверять почту любыми фичами патча (АВ сканнер, spam detection) и выдать ответ до завершения команды DATA. К сожалению, полностью не брать заражённые письма патч не позволяет, видимо, нельзя рвать сессию во время команды DATA по RFC. Зато после DATA можно сказать код какой-нибудь ошибки :-), тогда предыдущий МТА или клиент сразу узнает, что данное письмо не будет доставлено, при этом наш МТА не будет посылать никакого уведомления о вирусе или о спаме. Круто, не правда ли?
ClamAV... как я уже говорил, с патчем exim имеет родную поддержку интерфейса к большинству АВ демонов, просто clamAV самый бесплатный из них :-). Кроме того, он регулярно обновляется. Если я не ошибаюсь, то clamAV стал ловить MyDoom раньше чем DrWeb. К сожалению, clamAV не умеет лечить заражённые файлы, но что вы хотели от бесплатного антивируса? Самый большой недостаток ИМХО - это то, что clamAV умеет RAR2.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 раза в сутки. Подробнее читайте в документации (man freshclam?).
В результате выше изложенных действий можно получить МТА, который не возьмёт почту, содержащую malware, имеющую неправильные MIME типы данных (например, 8-и битные символы в поле Subject не допустимы по RFC и должны кодироваться 7-и битными), так же прикрутить spamasassin. Разумеется, что это можно сделать с любым современным МТА, главная же фишка состоит в том, что сообщение об отлупе письма даётся так скоро как это только возможно, а это умеют делать далеко не все МТА. В основном встречаются варинаты, когда МТА принимает сообщение и говорит "ОК", потом начинает его рассматривать, проверять на вирусы, пропускать или посылать обратное сообщение и(или) сообщение администратору об ошибке и вирусах, занимать дисковое пространство под карантин :-).
Зачем это надо? Когда можно сначала всё проверить, а потом окончательно принять сообщение для дальнейшей передачи или просто дать отлуп и ничего не посылать.
Вот и всё, что я хотел рассказать. В следующий раз, может быть, расскажу о своих наработках "как связать MySQL, exim и cyrus-imapd"...