антиспамовый фильтр на Sendmail + DrWeb + SpamAssassin
В нашей конторе стоит почтовый сервер, который работает на порядка 20 пользователей. На некоторых юзеров сыплется почта с большого количества доменов. Последнее время из почтовых ящиков каждое утро стало выгребаться 200-300 спамовых писем, причем это как direct spam по БД, так и тупой спам по ящикам типа info@домен , sales@домен и т.д.
Спам — это плохо, потому что отнимает время, трафик да еще, в добавок, с утра придает отрицательных эмоций... Кстати трафика на спам уходит по несколько сотен МБ каждый день, что за месяц влетает в кругленькую сумму.
Так исторически сложилось, что почтовиком у нас работает sendmail. Стало быть, фильтрацию спама я решил реализовавать именно на нем, и отказываться от него только в случае невозможности решения поставленной задачи.
Итак, изучив основательно методы борьбы со спамом, описаные в Интернете, я нашел несколько решений, которые можно разделить на группы:
1. Службы фильтрации, как правило платные.Вся почта офиса заворачивается на определенный адрес, а на ваш почтовик приходит уже "чистая" почта. Этот метод я отмел как слишком простой и неконтролируемый ;)
2. Входные фильтры, основаные на анализе IP-адреса передающего хоста и использовании общих баз данных IP-адресов спамеров (DNSBL).На мой взгляд это малоэффективный способ борьбы с современными методами спама, поэтому в данный момент эту функцию sendmail я отключил вовсе.
3. Фильтрация на основе постоянного пополнения access-листа адресами спамеров.Использует встречный анализ подозрительности отправляющего хоста (win/linux, есть трояны/нет их , уровень домена, наличие в имени домена подстрок ppp, dialup и т.д.). Пробовал применять. Минусы — требуется постоянный контроль, тонкая правка ручками регулярных выражений и коэффициентов подозрительности. Но самое плохое то, что первое письмо от спамера этот фильтр пропускает по любому (т.к. работает на анализе лога), что делает его работу малоэффективной.
4. Фильтрация по заголовкам писем с использованием очень продвинутого конфига sendmail.Использовал, но получил много нареканий от коллег по сбоям в работе фильтра. Требуется тонкая и вдумчивая подгонка регулярных выражений.
5. И, наконец, то решение на котором я остановиля —применение внешних программ для анализа содержимого письма.Программы проверки (их может быть несколько) сидят обычными демонами и принимают информацию от sendmail по механизму milter, возвращая в почтовик свою оценку и рекомендацию к дальнейшему действию. По такому принципу работает, например, DrWeb Mail filter (его я, кстати, тоже применяю для защиты от вирусов, почтовых бомб и червей.
В качестве программы для защиты от спама я использовал spamassassin. Она имеет развитую систему контекстного лингвистическогоанализа, систему обучения и самообучения.Кроме того, она может работать совместно с другими программами анализа.
А теперь, собственно, инструкция по прикручиванию spamassassin к sendmail.
поддержка milter
Здесь все крайне просто: качаем последний дистрибут с www.sendmail.org, распаковываем его, создаем в дистрибуте файл devtools/Site/site.config.m4 с содержимым:
APPENDDEF(`conf_sendmail_ENVDEF', `-DMILTER')
APPENDDEF(`confENVDEF',`-DMAP_REGEX')
где первая строка включает механизм milter, а вторая позволяет использовать регулярные выражения в конфиге.
Далее компилируем и инсталируем сам sendmail:
./Build && make all && make install
Мой файл конфигурации cf/cf/sendmail.mc (нужно создать) лежит здесь — http://www.3nity.spb.ru/files/antispam/sendmail.mc, объяснять все опции здесь я не буду, скажу лишь, что подходит он для большинства офисных почтовиков и может быть использован вами практически без изменений.
Уникальными и нестандартными в этом конфиге будут лишь расположение файла aliases (он вынесен в /etc/mail/) и измененные названия директорий спулов (QUEUE_DIR и MSP_QUEUE_DIR), если вам не нравится — эти строчки можно просто закоментировать.
После пересборки конфига требуется перезапуск sendmail (проверяйте пути):
cd /usr/src/sendmail-8.12.10/cf/cf
rm -f sendmail.cf
make sendmail.cf
mv ./sendmail.cf /etc/mail/sendmail.cf
/etc/init.d/sendmail restart
настройка DrWeb для работы по механизму milter
Последняя версия DrWeb под linux закачивается с сайта http://drweb.ru/unix/, оттуда же загружается milter для sendmail (пакет drweb-sendmail-4.30-linux.tar.gz).
Сам drweb настраивается стандартным образом, но обращаем внимание на то, чтобы демон висел на 3000 порту:
drweb32.ini:
SocketMode = TCP
DaemonPort = 3000
Далее настраиваем антивирусный milter (drweb_smf). Это демон, который, с одной стороны, проверяет содержимое у drwebd, а с другой стороны — выдает рекомендации почтовику. Я использую такие настройки drweb_smf.conf (я оставил только важные опции, остальные добавите сами):
[DaemonCommunication]
Address = inet:3000@localhost
[Scanning]
SpamFilter = on
[Mailer]
MailSystem = Sendmail
Sendmail = /usr/sbin/sendmail
MilterAddress = inet:3001@localhost
Кстати, опция SpamFilter = on позволяет зарезать почтовых червей по заголовку письма ;) Как видим, сам milter занимает порт 3001 tcp, что и указывается в конфиге sendmail.
Разумным решением является запуск демона drweb и его milter`а (drwebd и drweb-smf) из одного стартового скрита.
установка spamassassin
Поскольку рускоязычных материалов по установке spamassassin я не нашел, считаю нужным полностью описать тут этот процесс:
Итак, закачиваем последний дистрибутив с http://spamassassin.rediris.es/downloads.html и распаковываем архив:
tar -xvzf ./Mail-SpamAssassin-2.60.tar.gz
Добавляем перловый модуль для spamassassin:
perl -MCPAN -e shell [as root]
o conf prerequisites_policy ask
install Mail::SpamAssassin
quit
Первая строка запустит оболочку, последующие дадут команду обновить модуль (онлайн).
Далее пытаемся откомпилировать дистрибутив.
perl Makefile.PL
Скорее всего, получаем кучу ошибок о отсутствующих модулях Perl (Вообще-то все требуемые модули перечислены в INSTALL ;).
Все perl-модули добавляются в систему либо вышеописаным способом, либо качаются с http://search.cpan.org/ (там в поиске вводится название модуля, например HTML::Parser), дале каждый модуль собирается и инсталируется в систему:
perl Makefile.PL && make test && make install
После установки всех модулей и компилируем и инсталируем саму программу spamassassin:
perl Makefile.PL && make all && make install[/color]
установка spamassassin milter
Его дистрибутив я нашел на стороннем сайте http://savannah.nongnu.org/projects/spamass-milt.
Качаем его и устанавливаем.
tar -xvzf ./spamass-milter-0.2.0
cd spamass-milter-0.2.0
./configure ; make ; make install
конфигурация и запуск spamassassin daemon + spammass-milter
Мой файл конфигурации (http://www.3nity.ru/files/antispam/local.cf ), по умолчанию расположен в директории /etc/mail/spamassassin. Документация по нему (англоязычная) есть на http://www.spamassassin.org/doc/Mail_SpamAssassin_Conf.html
Базы данных Баеса (результат обучения системы) я вынес в тот же каталог, по умолчанию они лежат в ~/spamassassin.
Самым сложным было понять, как все это запускается.
Переворошив документацию, я написал стартовый скрипт (http://www.3nity.ru/files/antispam/spam_filter).
Строка запуска милтера (/usr/local/sbin/spamass-milter -f -p
/var/run/spamass-milter -b setar@trinity.spb.ru -r 10) содержит следующие параметры:
-f — запустить в фоне;
-b — мыло, куда пересылаем письма, распознаные как спам. При этом к оригинальному реципиенту письма не доходят. Чтобы они доходили и одновременно дублировались на ответственного, ставится опция –B.
-r 10 — самая интересная опция ;) — уровень баллов для отброса письма. Рекомендую в процессе обучения этот параметр не ставить вовсе.
обучение системы
Вообще-то система начинает действовать сразу (с заранее предустановленными параметрами) и вылавливает спам с вероятностью 60-70%. Для того, чтобы эту вероятность увеличить, необходимо систему обучить: скормить ей более 200 писем с примерами "белых писем" (ham) и более 200 спамовых писем (spam).
Любое письмо после запуска системы получает в заголовок дополнительную информацию по анализу его на предмет спама. Вот пример злобного спама (уровень признания письма как спам — 5.0):
X-Spam-Flag: YES
X-Spam-Status: Yes, hits=22.0 required=5.0 tests=BAYES_99,FORGED_MUA_OUTLOOK,
FORGED_OUTLOOK_HTML,FROM_ILLEGAL_CHARS,HTML_FONTCOLOR_RED,
HTML_FONTCOLOR_UNKNOWN,HTML_FONT_BIG,HTML_MESSAGE,MIME_HTML_ONLY,
SUBJ_HAS_SPACES,SUBJ_ILLEGAL_CHARS autolearn=no version=2.60
X-Spam-Orig-To: <info@trinity.spb.ru>
X-Spam-Report:
* 4.1 SUBJ_HAS_SPACES Subject contains lots of white space
* 0.1 HTML_FONTCOLOR_RED BODY: HTML font color is red
* 5.4 BAYES_99 BODY: Bayesian spam probability is 99 to 100%
* [score: 1.0000]
* 0.1 HTML_FONTCOLOR_UNKNOWN BODY: HTML font color is unknown to us
* 0.3 MIME_HTML_ONLY BODY: Message only has text/html MIME parts
* 0.1 HTML_MESSAGE BODY: HTML included in message
* 0.3 HTML_FONT_BIG BODY: HTML has a big font
* 3.9 SUBJ_ILLEGAL_CHARS Subject contains too many raw illegal characters
* 4.1 FROM_ILLEGAL_CHARS From contains too many raw illegal characters
* 2.6 FORGED_MUA_OUTLOOK Forged mail pretending to be from MS Outlook
* 1.0 FORGED_OUTLOOK_HTML Outlook can't send HTML message only
X-Spam-Level: *********************
X-Spam-Checker-Version: SpamAssassin 2.60 (1.212-2003-09-23-exp) on
gw.trinity.spb.ru
Оценка BAYES появляется после полного обучения системы.
Теперь о том, как учить. В комплекте есть программа sa-learn, и именно ей нужно скормить каталог с письмами ham и spam. Сами письма нужно иметь в немодивицированном виде (без forward`а и прочих почтовых пересылок-перенаправлений). Я их получал прямым экспортом из программы TheBat в формат .MSG. Для удобства завел специальные папочки, в которых скидывал примеры писем, а в конце дня делал экспорт на сервер.
Для процесса обучения не требуется восстанавливать оригинальный заголовок письма, вырезая пометку ****SPAM**** и оценочное содержимое заголовка, система их просто игнорирует.
Для автоматизации процесса обучения я написал маленький скриптик (http://www.3nity.ru/files/antispam/learn), который забирает файлы сообщений с файлового сервера по ftp и скармливает их обучалке.
Обучение до включения в работу системы Баеса у меня заняло 4 дня.
Сергей Тараненко, setar@trinity.spb.ru, компания «Тринити» (Санкт-Петербург).
Спам — это плохо, потому что отнимает время, трафик да еще, в добавок, с утра придает отрицательных эмоций... Кстати трафика на спам уходит по несколько сотен МБ каждый день, что за месяц влетает в кругленькую сумму.
Так исторически сложилось, что почтовиком у нас работает sendmail. Стало быть, фильтрацию спама я решил реализовавать именно на нем, и отказываться от него только в случае невозможности решения поставленной задачи.
Итак, изучив основательно методы борьбы со спамом, описаные в Интернете, я нашел несколько решений, которые можно разделить на группы:
1. Службы фильтрации, как правило платные.Вся почта офиса заворачивается на определенный адрес, а на ваш почтовик приходит уже "чистая" почта. Этот метод я отмел как слишком простой и неконтролируемый ;)
2. Входные фильтры, основаные на анализе IP-адреса передающего хоста и использовании общих баз данных IP-адресов спамеров (DNSBL).На мой взгляд это малоэффективный способ борьбы с современными методами спама, поэтому в данный момент эту функцию sendmail я отключил вовсе.
3. Фильтрация на основе постоянного пополнения access-листа адресами спамеров.Использует встречный анализ подозрительности отправляющего хоста (win/linux, есть трояны/нет их , уровень домена, наличие в имени домена подстрок ppp, dialup и т.д.). Пробовал применять. Минусы — требуется постоянный контроль, тонкая правка ручками регулярных выражений и коэффициентов подозрительности. Но самое плохое то, что первое письмо от спамера этот фильтр пропускает по любому (т.к. работает на анализе лога), что делает его работу малоэффективной.
4. Фильтрация по заголовкам писем с использованием очень продвинутого конфига sendmail.Использовал, но получил много нареканий от коллег по сбоям в работе фильтра. Требуется тонкая и вдумчивая подгонка регулярных выражений.
5. И, наконец, то решение на котором я остановиля —применение внешних программ для анализа содержимого письма.Программы проверки (их может быть несколько) сидят обычными демонами и принимают информацию от sendmail по механизму milter, возвращая в почтовик свою оценку и рекомендацию к дальнейшему действию. По такому принципу работает, например, DrWeb Mail filter (его я, кстати, тоже применяю для защиты от вирусов, почтовых бомб и червей.
В качестве программы для защиты от спама я использовал spamassassin. Она имеет развитую систему контекстного лингвистическогоанализа, систему обучения и самообучения.Кроме того, она может работать совместно с другими программами анализа.
А теперь, собственно, инструкция по прикручиванию spamassassin к sendmail.
поддержка milter
Здесь все крайне просто: качаем последний дистрибут с www.sendmail.org, распаковываем его, создаем в дистрибуте файл devtools/Site/site.config.m4 с содержимым:
APPENDDEF(`conf_sendmail_ENVDEF', `-DMILTER')
APPENDDEF(`confENVDEF',`-DMAP_REGEX')
где первая строка включает механизм milter, а вторая позволяет использовать регулярные выражения в конфиге.
Далее компилируем и инсталируем сам sendmail:
./Build && make all && make install
Мой файл конфигурации cf/cf/sendmail.mc (нужно создать) лежит здесь — http://www.3nity.spb.ru/files/antispam/sendmail.mc, объяснять все опции здесь я не буду, скажу лишь, что подходит он для большинства офисных почтовиков и может быть использован вами практически без изменений.
Уникальными и нестандартными в этом конфиге будут лишь расположение файла aliases (он вынесен в /etc/mail/) и измененные названия директорий спулов (QUEUE_DIR и MSP_QUEUE_DIR), если вам не нравится — эти строчки можно просто закоментировать.
После пересборки конфига требуется перезапуск sendmail (проверяйте пути):
cd /usr/src/sendmail-8.12.10/cf/cf
rm -f sendmail.cf
make sendmail.cf
mv ./sendmail.cf /etc/mail/sendmail.cf
/etc/init.d/sendmail restart
настройка DrWeb для работы по механизму milter
Последняя версия DrWeb под linux закачивается с сайта http://drweb.ru/unix/, оттуда же загружается milter для sendmail (пакет drweb-sendmail-4.30-linux.tar.gz).
Сам drweb настраивается стандартным образом, но обращаем внимание на то, чтобы демон висел на 3000 порту:
drweb32.ini:
SocketMode = TCP
DaemonPort = 3000
Далее настраиваем антивирусный milter (drweb_smf). Это демон, который, с одной стороны, проверяет содержимое у drwebd, а с другой стороны — выдает рекомендации почтовику. Я использую такие настройки drweb_smf.conf (я оставил только важные опции, остальные добавите сами):
[DaemonCommunication]
Address = inet:3000@localhost
[Scanning]
SpamFilter = on
[Mailer]
MailSystem = Sendmail
Sendmail = /usr/sbin/sendmail
MilterAddress = inet:3001@localhost
Кстати, опция SpamFilter = on позволяет зарезать почтовых червей по заголовку письма ;) Как видим, сам milter занимает порт 3001 tcp, что и указывается в конфиге sendmail.
Разумным решением является запуск демона drweb и его milter`а (drwebd и drweb-smf) из одного стартового скрита.
установка spamassassin
Поскольку рускоязычных материалов по установке spamassassin я не нашел, считаю нужным полностью описать тут этот процесс:
Итак, закачиваем последний дистрибутив с http://spamassassin.rediris.es/downloads.html и распаковываем архив:
tar -xvzf ./Mail-SpamAssassin-2.60.tar.gz
Добавляем перловый модуль для spamassassin:
perl -MCPAN -e shell [as root]
o conf prerequisites_policy ask
install Mail::SpamAssassin
quit
Первая строка запустит оболочку, последующие дадут команду обновить модуль (онлайн).
Далее пытаемся откомпилировать дистрибутив.
perl Makefile.PL
Скорее всего, получаем кучу ошибок о отсутствующих модулях Perl (Вообще-то все требуемые модули перечислены в INSTALL ;).
Все perl-модули добавляются в систему либо вышеописаным способом, либо качаются с http://search.cpan.org/ (там в поиске вводится название модуля, например HTML::Parser), дале каждый модуль собирается и инсталируется в систему:
perl Makefile.PL && make test && make install
После установки всех модулей и компилируем и инсталируем саму программу spamassassin:
perl Makefile.PL && make all && make install[/color]
установка spamassassin milter
Его дистрибутив я нашел на стороннем сайте http://savannah.nongnu.org/projects/spamass-milt.
Качаем его и устанавливаем.
tar -xvzf ./spamass-milter-0.2.0
cd spamass-milter-0.2.0
./configure ; make ; make install
конфигурация и запуск spamassassin daemon + spammass-milter
Мой файл конфигурации (http://www.3nity.ru/files/antispam/local.cf ), по умолчанию расположен в директории /etc/mail/spamassassin. Документация по нему (англоязычная) есть на http://www.spamassassin.org/doc/Mail_SpamAssassin_Conf.html
Базы данных Баеса (результат обучения системы) я вынес в тот же каталог, по умолчанию они лежат в ~/spamassassin.
Самым сложным было понять, как все это запускается.
Переворошив документацию, я написал стартовый скрипт (http://www.3nity.ru/files/antispam/spam_filter).
Строка запуска милтера (/usr/local/sbin/spamass-milter -f -p
/var/run/spamass-milter -b setar@trinity.spb.ru -r 10) содержит следующие параметры:
-f — запустить в фоне;
-b — мыло, куда пересылаем письма, распознаные как спам. При этом к оригинальному реципиенту письма не доходят. Чтобы они доходили и одновременно дублировались на ответственного, ставится опция –B.
-r 10 — самая интересная опция ;) — уровень баллов для отброса письма. Рекомендую в процессе обучения этот параметр не ставить вовсе.
обучение системы
Вообще-то система начинает действовать сразу (с заранее предустановленными параметрами) и вылавливает спам с вероятностью 60-70%. Для того, чтобы эту вероятность увеличить, необходимо систему обучить: скормить ей более 200 писем с примерами "белых писем" (ham) и более 200 спамовых писем (spam).
Любое письмо после запуска системы получает в заголовок дополнительную информацию по анализу его на предмет спама. Вот пример злобного спама (уровень признания письма как спам — 5.0):
X-Spam-Flag: YES
X-Spam-Status: Yes, hits=22.0 required=5.0 tests=BAYES_99,FORGED_MUA_OUTLOOK,
FORGED_OUTLOOK_HTML,FROM_ILLEGAL_CHARS,HTML_FONTCOLOR_RED,
HTML_FONTCOLOR_UNKNOWN,HTML_FONT_BIG,HTML_MESSAGE,MIME_HTML_ONLY,
SUBJ_HAS_SPACES,SUBJ_ILLEGAL_CHARS autolearn=no version=2.60
X-Spam-Orig-To: <info@trinity.spb.ru>
X-Spam-Report:
* 4.1 SUBJ_HAS_SPACES Subject contains lots of white space
* 0.1 HTML_FONTCOLOR_RED BODY: HTML font color is red
* 5.4 BAYES_99 BODY: Bayesian spam probability is 99 to 100%
* [score: 1.0000]
* 0.1 HTML_FONTCOLOR_UNKNOWN BODY: HTML font color is unknown to us
* 0.3 MIME_HTML_ONLY BODY: Message only has text/html MIME parts
* 0.1 HTML_MESSAGE BODY: HTML included in message
* 0.3 HTML_FONT_BIG BODY: HTML has a big font
* 3.9 SUBJ_ILLEGAL_CHARS Subject contains too many raw illegal characters
* 4.1 FROM_ILLEGAL_CHARS From contains too many raw illegal characters
* 2.6 FORGED_MUA_OUTLOOK Forged mail pretending to be from MS Outlook
* 1.0 FORGED_OUTLOOK_HTML Outlook can't send HTML message only
X-Spam-Level: *********************
X-Spam-Checker-Version: SpamAssassin 2.60 (1.212-2003-09-23-exp) on
gw.trinity.spb.ru
Оценка BAYES появляется после полного обучения системы.
Теперь о том, как учить. В комплекте есть программа sa-learn, и именно ей нужно скормить каталог с письмами ham и spam. Сами письма нужно иметь в немодивицированном виде (без forward`а и прочих почтовых пересылок-перенаправлений). Я их получал прямым экспортом из программы TheBat в формат .MSG. Для удобства завел специальные папочки, в которых скидывал примеры писем, а в конце дня делал экспорт на сервер.
Для процесса обучения не требуется восстанавливать оригинальный заголовок письма, вырезая пометку ****SPAM**** и оценочное содержимое заголовка, система их просто игнорирует.
Для автоматизации процесса обучения я написал маленький скриптик (http://www.3nity.ru/files/antispam/learn), который забирает файлы сообщений с файлового сервера по ftp и скармливает их обучалке.
Обучение до включения в работу системы Баеса у меня заняло 4 дня.
Сергей Тараненко, setar@trinity.spb.ru, компания «Тринити» (Санкт-Петербург).
Сетевые решения. Статья была опубликована в номере 10 за 2003 год в рубрике sysadmin