Про sendmail,milter api и спам.

Нравится ли вам получать спам? Вопрос, думаю, риторический. Конечно же нет. Бессильны ли мы перед спамом? Посмотрим.....

[Евгений Кропоткин (E.Kropotkin@gmail.com)]

Для начала, давайте посмотрим на ситуацию, итак вот что мы имеем: доля спама в общем объеме почты в Рунете в 1-м полугодии 2007г. составляла 70-80%: такие данные приводятся в аналитическом исследовании разработчика антивирусных программ для компьютеров "Лаборатория Касперского". Минимальное значение доли спама - 62,9% - было зафиксировано 27 апреля, максимальное - 86% - 11 февраля и 28 мая.

Что это означает? Для корпоративного пользователя это потерянные деньги на трафик (в основном, в России, пока не так широко распространены корпоративные безлимитные тарифы), это потеря времени сотрудников на разбор почты в поисках важных писем (по опыту скажу, спам ещё и раздражает), это излишняя нагрузка на серверное оборудование организации (оборудование всё же желательно использовать в достижении своих бизнес-целей).

Рассмотрим, какие есть варианты решения этой проблемы у нас есть (и недостатки):

  • мы можем отключиться от сети - неприемлемо
  • можно перенести нагрузку на gmail - но далеко не все хотят хранить свою корпоративную почту "незнамо где"
  • можно установить интеллектуальный фильтр - требуется настройка и периодическое внимание для устранения потерь ошибочно блокированных писем (сложно, но для крупной организации как раз лучший вариант)
  • фильтрация пришедших сообщений в клиенте по записной книге - но спам получен и найти новых собеседников в спаме сложно
  • белые/чёрные списки - чёрные списки при наличии спам-бот сети неэффективны для компании, белые списки затрудняют отправку почты новым клиентам

Из того программного обеспечения, которое доступно бесплатно, думаю что наиболее доступен spamassassin - именно его я и рекоммендую использовать. Но есть одно "НО" - программа эта сложная, и было бы идеально её разгрузить от очевидных мусорных писем - писем, котрые рассылаются зомбированными компьютерами. А если ещё у Вас почту проверяет и антивирус, например clamav, то устранение перегрузки на почтовую систему крайне желательно.

Итак, что мы можем сделать? Мы можем проанализировать служебную информацию, выдающую компьютер-зомби: обычно это домашняя машина, поэтому её "здоровьем" может и не заниматься профессионал-компьютерщик.... Итак, чем они отличаются? Ну например наверняка у них нету доменного имени, или оно как-либо выделяется - например: pool-71-125-118-199.lsanca.dsl-w.verizon.net или dsl.static859617928.ttnet.net.tr (примеры из лога, первые попавшиеся на момент написания этой статьи).Что мы видим? В имени хоста очень много цифр, точек и тире, возможно есть сочетание букв pool, dsl, ppp....

Чем отличаются нормальные mail-host? Давайте рассмотрим сообщение от google.mail : el-out-1112.google.com - намного меньше цифр и точек. Аналогичная ситуация с другими нормальными хостерами.

Теперь надо придумать - как довести наши пожелания до почтовой системы? Рассмотрим что у нас есть: чаще всего почтой заведует Unix-система, популярны sendmail, exim и postfix. Современная почтовая система (а их намного больше, чем я перечислил) обычно поддерживает API фильтрации и модификации сообщений (https://www.milter.org/developers/api/)

Взяв пример с указанного выше адреса, внесём в него полученные анализом знания (а этот анализ почтового потока можно сделать модифицировав исходник для вывода интересной информации). Пример программы прилагается. Я не буду чрезмерно надоедать теорией, тем более что она вся доступна, давайте лучше попробуем - так как практика часто интереснее теории:

Собираем исходник фильтра: gcc mil.c -o mil -lmilter -pthread

Для чистоты эксперимента гасим clamav и spamassassin, чтобы увидеть именно работу нашего фильтра.

Как взаимодействует фильтр и почтовая программа? Посмотрим в sendmail.cf:

#
######################################################################
######################################################################
#####
#####                   MAIL FILTER DEFINITIONS
#####
######################################################################
######################################################################

Xclamav, S=local:/var/run/clamav/clamav.sock, F=, T=S:4m;R:4m
Xspamassassin, S=local:/var/run/spamass-milter.sock, F=, T=C:15m;S:4m;R:4m;E:10m
#

Так как эти фильтры временно отключены, для тестирования можно воспользоваться настройками одного из них, или создать свою запись (но пока мы не вносим никаких изменений в конфигурационные файлы).

Теперь для отладки можно создать пользователя, например postbox, он будет получать копию всей почты домена.

Остановим sendmail, например /etc/init.d/sendmail stop

Теперь запустим в другой консоли наш фильтр (предполагается, что мы в каталоге с исходниками фильтра):

rm -f /var/run/clamav/clamav.sock
./mil -p /var/run/clamav/clamav.sock -a postbox@вашдомен.ru

Возвращаемся в первую консоль и теперь запускаем sendmail: /etc/init.d/sendmail start

Он должен ругнуться на недоступность одного из фильтров

WARNING: Xspamassassin: local socket name /var/run/spamass-milter.sock missing

Переходим в консоль фильтра и смотрим на активность:

dbg.helo: len=39 <ppp-124.120.79.218.revip2.asianet.co.th> 6 - FAIL Points.H1

dbg.helo: len=28 <217-15-142-3.ip.yaroslavl.ru> 6 - FAIL Points.H1
dbg.envrcpt helo=[p5B29548A.dip.t-dialin.net, No TLS] \
	connect=[p5B29548A.dip.t-dialin.net [91.41.84.138]] () \
	---- mailaddr=[lachlan@nokia.com]   mailhost=[nokia.com.] \
	mailer=[esmtp]  hslen=10   ::: pass=0  \
	local=0  digs=6  points=4  result = !!! FAIL PLD

Примерно так выглядит отчёт фильтра о работе, в данном случае видно два сообщения, заблокированное фильтром .

Какой итог я могу подвести? Фильтр работает и фильтрует около 85% нежелательных сообщений, за двое суток наблюдений отброса ненужных сообщений замечено не было (в общем то фильтр создавался под мою ситуацию со спамом), но если Вы решите его ставить, то необходимо адаптировать его под Ваши особенности, потому как приемлемых универсальных решений нет. Но перед зомби-сетями, как Вы видите, мы не беззащитны.

Disclaimer: без обязательств, обещаний и гарантий.

Исходники к статье: здесь.

[ опубликовано 28/11/2007 ]

Евгений Кропоткин (E.Kropotkin@gmail.com) - Про sendmail,milter api и спам.   Версия для печати