Анализ Спама Ваших Аккаунтов В Exim

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

Начав анализировать эту ситуацию, мы столкнулись с тем, что не можем толком сказать, кто «гадит» в нашем почтовом трафике, потому что адреса задаются динамически.

spamassassin тоже не очень помогает (пока), так как рейтинг исходящего спама почти в 2 раза ниже, чем входящего.

И для начала было решено провести небольшое исследование, о котором написано ниже под катом.



Исходные данные

В качестве исходных данных мы будем иметь:
  • биллинговая система.

    В нашем случае: Абилс .

    Но этот пример можно адаптировать под любой биллинг

  • Exim настроен с использованием практически любого из конфигов, найденных в Интернете, с использованием mysql.
  • Собственно СУБД MySQL. в нашем случае это были 2 отдельных сервера.

    Один для биллинга, второй для сервера статистики, который мы будем собирать



Что мы хотим

Основная задача, естественно, выяснить, какой пользователь спамит через нас.

Для этого

  1. Узнать IP-адрес, с которого отправляется почта
  2. По IP-адресу находим пользователя, который в данный момент использует этот адрес
  3. Записываем необходимую для последующего анализа информацию в таблицу (логин, ip, email_from, email_to, email_time, spam_score)
Итак по пунктам:
  1. IP-адрес узнаем через переменную Exim — $sender_host_address
  2. Так как таблица dv_calls в abills содержит текущие онлайн-сессии, то по запросу находим пользователя, занявшего этот адрес:
       

    SELECT concat("login=",user_name) FROM dv_calls WHERE INET_NTOA(framed_ip_address)='${quote_mysql:$sender_host_address}';

    Обратите внимание на результат, возвращаемый в виде пары параметр = значение .

    В конфиге Exim это выглядит так:

    GET_LOGIN = SELECT concat("login=",user_name) FROM dv_calls WHERE INET_NTOA(framed_ip_address)='${quote_mysql:$sender_host_address}';

    — это макрос, который мы будем запускать при проверке письма антиспамом.

  3. ну, собственно вставка данных через Insert также будет выполняться во время антиспам-проверки

    ADD_STATISTICS = INSERT INTO statistics VALUES ('$acl_m1','${quote_mysql:$sender_host_address}',\ '${quote_mysql:$sender_address}','${quote_mysql:$acl_m4}',NOW(),$spam_score_int);



Эксим

Давайте бегло взглянем на конфигурацию Exim:
  1. Определение 2-х макросов:

    ADD_STATISTICS = INSERT INTO statistics VALUES ('$acl_m1','${quote_mysql:$sender_host_address}',\ '${quote_mysql:$sender_address}','${quote_mysql:$acl_m4}',NOW(),$spam_score_int); GET_LOGIN = SELECT concat("login=",user_name) FROM dv_calls WHERE INET_NTOA(framed_ip_address)='${quote_mysql:$sender_host_address}';

  2. В acl_smtp_rcpt добавляем самый первый элемент:

    warn hosts = LOCAL_NETS set acl_m4 = $local_part@$domain

    — это какой-то хак, потому что мы будем записывать в таблицу и адрес отправителя, и адрес получателя.

    Но в том месте, где мы это будем делать, есть переменные $local_part И $домен уже будет неопределенным (не знаю, у меня так или в Эксиме вообще, поэтому жду ваших комментариев по этому поводу).

  3. В acl_smtp_data в самом начале добавляем следующее:

    warn hosts = LOCAL_NETS set acl_m0 = ${lookup mysql{GET_LOGIN}{$value}{login=unknown}} set acl_m1 = ${extract{login}{$acl_m0}{$value}{unknown}} warn hosts = LOCAL_NETS spam = nobody:true set acl_m2 = ${lookup mysql{servers=localhost; ADD_STATISTICS}{$value}{0}}

    здесь в 1-й половине кода — определяем логин по адресу отправителя и записываем его в переменную acl_m1. При этом если мы не можем однозначно определить логин клиента, то пишем неизвестно (в нашем случае это будут служебные сообщения от серверов и мониторинга).

    Во 2-й половине проверяем почту антиспамом для всех НАШИХ клиентов.

    И обратите внимание на запись серверы = локальный хост; ДОБАВИТЬ_СТАТИСТИКУ здесь мы явно указываем, что запрос должен выполняться на локальном сервере, а не на биллинговом сервере; эта запись exim позволяет использовать произвольное количество различных подключений к СУБД.

Перезапускаем Exim и получаем результат.

Предварительные выводы

За 24 часа работы этого алгоритма мы обнаружили 2 пользователей, которые были рассадниками спама.

Было отправлено 181 электронное письмо с поддельных адресов со средним спам-баллом 24 (согласно нашей шкале защиты от спама).

А поскольку наш антиспам был настроен совсем на другой порядок оценок (50 — предупреждение) (70 — вырезание), то он их, естественно, пропустил.

В конце концов.

Сделаны организационные заключения, список виновных передан в соответствующие органы для дальнейшего уточнения (штрафование, блокировка, массовое убийство и т.д. и т.п.

) P.S. Почти всю информацию мы получаем от Характеристики Это дало мне представление о работе с СУБД.

эта заметка — правда, речь идет о грейлистинге, который мы планируем реализовать позже Теги: #Администрирование сервера #MySQL #антиспам #спам #exim

Вместе с данным постом часто просматривают: