Так исторически сложилось, что мы уделяем больше внимания фильтрации спама во входящей почте, почти полностью забывая об исходящей почте.
Начав анализировать эту ситуацию, мы столкнулись с тем, что не можем толком сказать, кто «гадит» в нашем почтовом трафике, потому что адреса задаются динамически.
spamassassin тоже не очень помогает (пока), так как рейтинг исходящего спама почти в 2 раза ниже, чем входящего.
И для начала было решено провести небольшое исследование, о котором написано ниже под катом.
Исходные данные
В качестве исходных данных мы будем иметь:- биллинговая система.
В нашем случае: Абилс .
Но этот пример можно адаптировать под любой биллинг
- Exim настроен с использованием практически любого из конфигов, найденных в Интернете, с использованием mysql.
- Собственно СУБД MySQL. в нашем случае это были 2 отдельных сервера.
Один для биллинга, второй для сервера статистики, который мы будем собирать
Что мы хотим
Основная задача, естественно, выяснить, какой пользователь спамит через нас.Для этого
- Узнать IP-адрес, с которого отправляется почта
- По IP-адресу находим пользователя, который в данный момент использует этот адрес
- Записываем необходимую для последующего анализа информацию в таблицу (логин, ip, email_from, email_to, email_time, spam_score)
- IP-адрес узнаем через переменную Exim — $sender_host_address
- Так как таблица 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}';
— это макрос, который мы будем запускать при проверке письма антиспамом. - ну, собственно вставка данных через 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:- Определение 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}';
- В acl_smtp_rcpt добавляем самый первый элемент:
warn hosts = LOCAL_NETS set acl_m4 = $local_part@$domain
— это какой-то хак, потому что мы будем записывать в таблицу и адрес отправителя, и адрес получателя.Но в том месте, где мы это будем делать, есть переменные $local_part И $домен уже будет неопределенным (не знаю, у меня так или в Эксиме вообще, поэтому жду ваших комментариев по этому поводу).
- В 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 позволяет использовать произвольное количество различных подключений к СУБД.
Предварительные выводы
За 24 часа работы этого алгоритма мы обнаружили 2 пользователей, которые были рассадниками спама.Было отправлено 181 электронное письмо с поддельных адресов со средним спам-баллом 24 (согласно нашей шкале защиты от спама).
А поскольку наш антиспам был настроен совсем на другой порядок оценок (50 — предупреждение) (70 — вырезание), то он их, естественно, пропустил.
В конце концов.
Сделаны организационные заключения, список виновных передан в соответствующие органы для дальнейшего уточнения (штрафование, блокировка, массовое убийство и т.д. и т.п.
) P.S. Почти всю информацию мы получаем от Характеристики Это дало мне представление о работе с СУБД.
эта заметка — правда, речь идет о грейлистинге, который мы планируем реализовать позже Теги: #Администрирование сервера #MySQL #антиспам #спам #exim
-
Кавказские Языки
19 Oct, 24 -
Цифровая Модель Коммунизма
19 Oct, 24 -
Где 4.3.4
19 Oct, 24 -
Какие Фильтры Есть У Яндекса?
19 Oct, 24 -
Как Писать Отличные Запросы На Включение
19 Oct, 24