Борьба со спамом. SpamAssassin+Sendmail

SpamAssassinSpamAssassin – одна из самых популярных систем антиспама. Работает по оценочному принципу письма – начисляет баллы по различным критериям и если сумма баллов превысила установленный порог, то письмо помечается как спам.
Система баллов выставляется за различные параметры в письме, например в письме много больших заголовков в html коде, часто встречающиеся слова, которые используют спамеры и т.д. Можно задавать свои наборы правил и задавать их вес в баллах. Баллы могут быть как положительные так и отрицательные, а сумма этих баллов и есть оценка письма.
После установки SpamAssassin требует к себе внимания со стороны администратора, а иногда требуется достаточно тонкая его настройка. Все зависит от типа почты, которая преобладает на вашем почтовом сервере. В любом случае SpamAssassin требуется сначала “обучить” на предмет спамных и нормальных (ham) писем. По умолчанию алгоритм bayes, который лежит в основе SpamAssassin, начинает работать когда в базе накопится >200 писем спама и хороших писем.

В статье будет показана базовая настройка SpamAssassin с включением двух дополнительных плагинов к нему Razor и DCC, а также состыковка SpamAssassin с Sendmail сервером.
Ранее была написана статья о настройке sendmail как внешнего почтового шлюза.

Установка и настройка дополнительных плагинов Razor и DCC

Razor и DCC являются дополнительными методами проверки на спам, помимо встроенных алгоритмов SpamAssassin. Т.к. эти два плагина входят в настройку SpamAssassin, то сначала установим и настроим их.

Razor

Razor является сигнатурным анализатором, принцип действия которого заключается в том, что программа рассчитывает сигнатуру письма и сверяет ее с базой сигнатур хранящихся на серверах интернет. Если соответствие находится, то анализируемое письмо считается спамом и этому письму начисляются дополнительные баллы.
Посмотреть дополнительную документацию можно на официальном сайте проекта.
Установка razor проста. Для Ubuntu (Debian)


$sudo aptitude install razor

Для настройки пакета как клиента достаточно создать рабочую домашнюю папку (имейте ввиду, что если вы планируете запускать spamassassin из-под определенного пользователя, то дайте права на чтение этому пользователю в домашнюю папку razer)


$sudo razor-admin -create -home=/path/to/home/.razor

Если вы собираетесь участвовать в передаче сигнатур на сервера razor и помогать в определении спама, то потребуется регистрация


$sudo razor-admin -register -user=user@domain.com -home=/path/to/home/.razor

Команды передачи сигнатур читаем в документации к проекту.
Если у вас настроен брандмауэр, то для работы razor надо открыть два TCP порта:
TCP 2703 – исходящий трафик от почтового агента на razor серверы.
TCP 7 – исходящий ping от почтового агента на razor серверы.

DCC

DCC (Distributed checksum clearing house) так же является сигнатурным анализатором и метод его работы очень напоминает работу razor, но немного отличается логикой работы. Для каждого входящего сообщения определяется контрольная сумма и отправляется на сервер, где сверяется с базой данных. По контрольной сумме оценивается показатель – частота сообщений с этой контрольной суммой у других получателей системы DCC. Сообщения с высоким количеством таких же контрольных сумм будут отнесены к спаму.
Для Ubuntu 10.10 я не нашел в стандартных репозиториях DCC. Хотя в портах FreeBSD этот пакет есть.
Так что у кого нет пакета в репозиториях могут скачать исходники с официального сайта и устанавить из исходников


$./configure
$make
$sudo make install

Для проверки корректности установки нужно запустить команду


$cdcc info

которая выдаст список доступных DCC серверов.
Изменить или добавить сервера можно через файл map.txt, который обычно находится в каталоге /var/dcc. После правки map.txt требуется удалить старый файл /var/dcc/map и сгенерировать новый c помощью команды


$sudo cdcc "load /var/dcc/map.txt"

Так как у нас нет локального сервера я рекомендую сразу удалить из файла map.txt строки “@,-” или другие упоминания localhost.
Для работы DCC в брандмауэре открыть входящие соединения от UDP 6277 порта серверов DCC.
Примечание: Если у вас высоконагруженные почтовые сервера или валится очень много спама, то используйте razor и dcc с предельной осторожностью, т.к. на каждое письмо будет происходить коннект к серверам анализаторам сигнатур. Из-за огромного потока проверок SpamAssassin у меня зависал. Правда это было на версии 2.x. Мой совет – тестируйте, но будьте готовы к неожиданностям 🙂

Настройка SpamAssassin

Установка в Ubuntu (Debian)


$sudo aptitude install spamassassin

Конфигурационные файлы SpamAssassin обычно лежат в каталогах /etc/spamassassin или в /usr/local/etc/mail/spamassassin. В системе Ubuntu был сделан симлинк на папку spamassassin в каталоге /etc/mail, так что я буду исходить от этого пути.
Редактируем главный конфигурационный файл SpamAssassin – local.cf.
Ниже я привел наиболее оптимальную на мой взгляд конфигурацию SpamAssassin с возможными дополнениями и комментариями


#Доверенные сети или отдельные машины
trusted_networks 192.168.0.1

#белые списки доменов или адресов. Если письмо пришло с этого адреса,
#то ему начисляется -100 балов за белый список, помимо остальных проверок.
#Таким образом письмо гарантированно не попадет в спам.
whitelist_from *@*.subscribe.ru
whitelist_from *@subscribe.ru
whitelist_from user@domen.com

#Если письмо определилось как спам, то к теме письма добавляем
#метку спама и оценку письма в баллах. По этой метке можно в
#дальнейшем отсеивать письма в почтовой программе как нежелательные
rewrite_header subject ****[SPAM(_SCORE_)]****

#Указываем количество баллов, при котором сообщение считается спамом
#По умолчанию 5, у меня на сервере 7.9
required_score           5
#Используем алгоритм bayes
use_bayes 1
#Путь к базе bayes и права на файл
bayes_path /etc/mail/spamassassin/bayes
bayes_file_mode 0666
#Заносим в журнал обучение bayes.  (По умолчанию отключено)
bayes_learn_to_journal 1
#Минимальное количество писем для обучения, после которого алгоритм bayes
#начнет работать. Если у кого-то нет много писем на обучение, то можно
#снизить пороги "белых" и "спам" писем
#bayes_min_ham_num 200
#bayes_min_spam_num 200
#Следующая опция закомментирована и нужна только для
#высоконагруженных систем спама. Этим самым мы отключаем
#фиксированный размер базы bayes, а потом чтобы база не пухла
#раз в сутки рекомендуется проводить сжатие базы.
#bayes_auto_expire 0

#Включаем самообучение алгоритма bayes при определении им
#тех или иных типов писем
bayes_auto_learn 1
#Немного подкорректируем самообучение bayes
#Самобучение на спам будет проводится в том случае, если письмо
#получило 12 баллов и выше (хотя порог у нас 5)
bayes_auto_learn_threshold_spam         12.0
#А письмо на "не спам" будет обучаться если общая
#оценка письма составит 0.1 балл и ниже
bayes_auto_learn_threshold_nonspam      0.1

#Используем плагины razor и dcc
use_razor2 1
use_dcc 1

#Сколько начисляем баллов к письму, если письмо есть в
#базе данных razor или dcc
score RAZOR2_CHECK 1.000
score DCC_CHECK 1.000

#Какие языки и кодировки обычно используется в письмах
#Если письмо не принадлежит этим языкам и кодировкам, то
#ему начислится более высокий балл
ok_languages ru en
ok_locales ru en

#Я не использую белые списки, но если это вам нужно,
#расскоментируйте посследующие строки
#use_auto_whitelist      0
#auto_whitelist_path        /etc/mail/spamassassin/auto-whitelist
#auto_whitelist_file_mode   0666

#Черные списки, +100баллов к письму, если письмо пришло
#с этих доменов или адресов
blacklist_from sales-eemea@flukenetworks.com
blacklist_from *@888.com
blacklist_from *@msn.com
blacklist_from *@cat.es
blacklist_from *@pmail.gen.nz
blacklist_from *@femenino.com
blacklist_from *@infonium.com
blacklist_from *@outblaze.com

Теперь проверяем загрузку плагинов razor и DCC в файле /etc/mail/spamassassin/v310.pre
Надо чтобы следующие строки были раскомментированы


loadplugin Mail::SpamAssassin::Plugin::DCC
loadplugin Mail::SpamAssassin::Plugin::Razor2

После редактирования файлов конфигураций обязательно запускаем проверку правильности конфига и смотрим чтобы не было ошибок.


$spamassassin --lint

На этом настройку SpamAssassin можно и закончить, но хочу показать несколько тонких настроек отсеивания спама для файла local.cf


#Ищем в теле письма например слово "Worldwide" параметр "i"
#означает регистронезависимое совпадение слова
body PRIVET_MV3 /Worldwide/i
#описание правила
describe PRIVET_MV  Mnogo spama s etim slovov vnutri texta pisma
#выставляем этот балл если находим совпадение
score PRIVET_MV3 5.0

#тут мы ищем слово SPAM в заголовке письма и именно
#в определенном header-е "x-spamtest-status"
header SPAM_TEST  x-spamtest-status =~ /SPAM/i
describe SPAM_TEST KAV x-spamtest-status: SPAM
#оцениваем совпадение в баллах
score SPAM_TEST 10.0

#этот пользователь не хочет, чтобы SpamAssassin как-то помечал
#заголовки его писем, даже если это спам
#если встретим в любом из header совпадение по email пользователя,
#то выставим -100
#Это не очень хорошее правило, т.к. если будет перечень в поле To
#нескольким адресатам и это явный спам, то всем адресатам письмо
#дойдет с непомеченным заголовком
header FOR_USER ALL =~ /user\@domen.ru/i
score FOR_USER -100.0

#иногда некоторые письма рассылки помечаются как спам
#поэтому создадим такое правило
header FFOM_SUBSCRIBE ALL =~ /comp.soft.linux.discuss-list/i
score FFOM_SUBSCRIBE -100.0

Про остальные тонкости читайте на официальном сайте SpamAssassin.
Можно запускать SpamAssassin и через команду ps убедиться, что демон spamd запустился.


$sudo /etc/init.d/spamassassin start

И самое последнее – это “скармливаем” SpamAssassin-у письма “спама” и “не спама” . Это рекомендуется делать периодически, чтобы в системе антиспама было как можно меньше ошибок. Но все равно будьте готовы к тому что система не идеальна и ошибки в определении “спам-не-спам” возможны.
Для обучения спам писем, которые находятся в формате mbox используйте команду


$sudo sa-learn --spam --mbox /path/to/spam/mbox_format

Для “хороших” писем


$sudo sa-learn --ham --mbox /path/to/ham/mbox_format

Если у вас каждое письмо по отдельности, то не указывайте параметр –mbox, а путь указывайте до каталога с файлами писем.

Связываем SpamAssassin и Sendmail

Для связки я использую milter smf-spamd. Наскольку я знаю есть еще проект spamass-milter, но как я понял он иногда приводил к зависанию системы антиспама, поэтому я его не использовал. Насчет smf-spamd могу сказать, что он ни разу меня не подвел 🙂
Пакета установки я не видел, поэтому ставил из исходников с сайта
Перед конфигурирование требуется исправить файл smf-config.h.
У меня он получился почти стандартным, я только добавил ip машины которой доверяю отправку почты через себя. Обратите внимание на синтаксис и экранирование символов адресов доверенных сетей.
Мой smf-config.h показать


После редактирования smf-config.h выполняем


$make
$sudo make install

Заносим информацию о милтере в конфиг sendmail.mc


INPUT_MAIL_FILTER(`smf-spamd', `S=unix:/var/spool/smf/smf-spamd.sock, T=S:1m;R:1m')
define(`confMILTER_LOG_LEVEL',`1')

и пересобираем sendmail.cf.
У кого нет .mc файла могут сразу занести следующие строки в sendmail.cf


O InputMailFilters=smf-spamd
O Milter.LogLevel=1
################################################
#####                   MAIL FILTER DEFINITIONS
################################################
Xsmf-spamd, S=unix:/var/spool/smf/smf-spamd.sock, T=S:1m;R:1m

После редактирования sendmail.cf обязательно перезапускаем sendmail.
Можно смотреть логи как обрабатываются письма на spam..
В /var/log/messages при появлении spam письма должны быть примерно такие строки


Nov 29 00:34:03 ns smf-spamd[52983]: SPAM (10.9/7.9), scanned for 12.658s, \
host('mail'), sender('<bounce@subscribe.newsland.ru>'), recipient('<user@domen.ru>')

а в /var/log/maillog будут помечаться результаты проверок на спам


Nov 29 00:34:03 ns spamd[86635]: spamd: identified spam (10.9/7.9) \
 for (unknown):58 in 12.9 seconds, 36304 bytes.
Nov 29 00:34:03 ns spamd[86635]: spamd: result: Y 10 - BAYES_99,\
DNS_FROM_OPENWHOIS,FH_DATE_PAST_20XX,HS_INDEX_PARAM, \
HTML_FONT_SIZE_LARGE,HTML_MESSAGE,MPART_ALT_DIFF_COUNT,\
RCVD_IN_BL_SPAMCOP_NET scantime=12.9,size=36304, \
user=(unknown),uid=58,required_score=7.9,rhost=localhost.domen.ru, \
raddr=127.0.0.1,rport=63109,mid=, \
bayes=1.000000,autolearn=no

И наконец, не забываем включить SpamAssassin в автозагрузку при старте ОС. В Ubuntu (Debian) это делается в файле /etc/default/spamassassin.

PS: На всякий случай привожу пример скрипта запуска/остановки/перезагрузки демона spamd.
Скрипт запускает spamassassin от пользователя spamd, так что будьте внимательны возможно недостаточно прав на запись файлам bayes и различным файлам плагинам таким как razor и dcc!
показать

Запись опубликована в рубрике AntiSpam, Сервера с метками , , , . Добавьте в закладки постоянную ссылку.

2 комментариев Борьба со спамом. SpamAssassin+Sendmail

  1. Серж говорит:

    Можно ли в блеклист добавить строчку вида:
    *@*.it
    ?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *