Spamassassin: подключаем к Exim на CentOS

Автор: | 15/07/2014

spamassassin_logoУстанавливаем пакет:

# yum -y install spamassassin

ВАЖНО: требуется подключенный репозиторий rpmforge-extras. При установке возможны проблемы типа Error: Package: perl-IO-Compress-2.052-1.el6.rfx.noarch.

После установки рабочий каталог Spamassassin выглядит так:

# ls -l /etc/mail/spamassassin/
total 44
drwxr-xr-x 2 root root 4096 Jul 13 12:20 channel.d
-rw-r--r-- 1 root root 1299 Dec 5 2013 init.pre
-rw-r--r-- 1 root root 276 Dec 5 2013 local.cf
drwx------ 2 root root 4096 Dec 5 2013 sa-update-keys
-rw-r--r-- 1 root root 62 Dec 5 2013 spamassassin-default.rc
-rwxr-xr-x 1 root root 35 Dec 5 2013 spamassassin-helper.sh
-rw-r--r-- 1 root root 55 Dec 5 2013 spamassassin-spamc.rc
-rw-r--r-- 1 root root 2524 Dec 5 2013 v310.pre
-rw-r--r-- 1 root root 1194 Dec 5 2013 v312.pre
-rw-r--r-- 1 root root 2416 Dec 5 2013 v320.pre
-rw-r--r-- 1 root root 1237 Dec 5 2013 v330.pre

Тут рассматриваются примеры на:

# exim -bV
Exim version 4.72 #1 built 13-Jun-2014 12:17:50
# spamd -V
SpamAssassin Server version 3.3.1
running on Perl 5.10.1
# cat /etc/redhat-release
CentOS release 6.5 (Final)

Настройка Exim описана в статье CentOS: установка и настройка Dovecot 2 + Exim + ClamAV + Postfixadmin.

По-умолчанию Spamassassin создаёт каталог для базы Bayes в домашней директории пользователя, который его запускает:

# ls -l /root/.spamassassin
total 284
-rw------- 1 root root 12288 Jul 14 08:06 bayes_seen
-rw------- 1 root root 331776 Jul 14 08:06 bayes_toks

Т.к. нам это нежелательно и проще хранить всё в одном месте – то есть два варианта.

Более простой – хранить базы в заданной в конфигурации директории. Второй – в базе MySQL.

Пока выберем первый.

Создаём файлы для Bayes базы:

# mkdir /etc/mail/spamassassin/bayes/
# touch /etc/mail/spamassassin/bayes/bayes_

Дописываем в основной конфиг-файл /etc/mail/spamassassin/local.cf:

# количество "очков спама", что бы письмо было помечено как спам
required_hits 5

# что следует делать с оригинальным сообщением, если оно будет признано спамом
# оставить как есть - 0
# прикрепить к отчету как вложение - 1
# добавить к отчету как текст - 2
report_safe 0

# Добавлять метку *****SPAM***** к спам сообщениям
rewrite_header Subject *****SPAM*****

# Указываем локальную сеть как доверенную, т.е.
# исходящие письма не проверяем
# в данном случае не доверяем никому
# trusted_networks

# Указываем кол-во баллов, при котором сообщение считается спамом
# (по умолчанию: 5.0)
required_score 5.0

# Использовать фильтр Bayesian (по умолчанию: 1)
use_bayes 1

# Когда производится обучение по bayes, эта информация падает в
# журнал
bayes_learn_to_journal 1

# путь к префиксу файлов bayes-базы - НЕ директории
bayes_path /etc/mail/spamassassin/bayes/bayes
# Указываем сколько чистых писем и писем со спамом должно
# накопится в Bayesian базе прежде чем демон будет пользоваться
# этой базой (по умолчания - 200 не спама и спама)
bayes_min_ham_num 1
bayes_min_spam_num 1

# Bayesian авто обучение (default: 1)
# письма распознанные как 100% спам или 100% не спам
# добавляются в базу
bayes_auto_learn 1

# не анализировать письма, содержащие указанный тэг в заголовке
bayes-ignore-header <тэг_заголовка>

# не подвергать анализу письма от указанного адресата
bayes_ignore_from <адрес>

# не анализировать сообщения, предназначенные указанному пользователю
bayes_ignore_to <адрес>

# Не использовать сетевые проверки (т.к. делаем это в MTA)
skip_rbl_checks 0

# Использовать Razor
use_razor2 0

# Не использовать Pyzor
use_pyzor 0

# Указываем допустимые языки и локали сообщений
ok_locales en ru

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

# не проверять почту от указанных адресов;
# можно указать шаблон - символ «*» обозначает любое количество символов,
# «?» – любой один символ
# whitelist_from <адрес_или_шаблон>

# аналогично «белому» списку, но теперь отправитель априори рассматривается
# как спамер, и все письма от него помечаются как спам без дальнейшего анализа
# blacklist_from <адрес_или_шаблон>

# все сообщения на указанный адрес будут передаваться без фильтрации;
# можно использовать, если владелец адреса желает получать всю почту, адресованную ему;
# также рекомендуется устанавливать этот параметр для адреса abuse,
# чтобы даже в случае неправильной настройки фильтра с вами можно было связаться.
# whitelist_to <адрес_или_шаблон>

# все сообщения на указанный адрес будут рассматриваться как спам;
# например, таким образом можно организовать «прививки» для статистического анализатора,
# создав специальный адрес для спама и максимально «засветив» в интернете
# (при этом должно быть включено автообучение)
# blacklist_to <адрес_или_шаблон>

Проверяем синтаксис файла:

# spamassassin --lint

Запускаем обновление баз для Spamassassin:

# sa-update -v
Update available for channel updates.spamassassin.org
Update was available, and was downloaded and installed successfully

Запускаем и добавляем в автозапуск:

# service spamassassin start
Starting spamd: [ OK ]
# chkconfig spamassassin on

Проверяем порт:

# netstat -anp | grep spam
tcp 0 0 127.0.0.1:783 0.0.0.0:* LISTEN 23011/spamd.pid

Переходим к Exim.

В файле /etc/exim/exim.conf добавляем:

spamd_address = 127.0.0.1 783

Дальше, в блок acl_check_data: добавляем:

# указываем адрес на который пересылать сообщения
# определенные как спам, на случай если это ошибка.
warn message = X-Redirect-To: [email protected]
 hosts = !+relay_from_hosts
 spam = nobody

# пишем в заголовки баллы за спам
warn spam = nobody:true
hosts = !+relay_from_hosts
message = X-Spam-Level: $spam_bar

# пишем в заголовки отчет spamassassin'a
warn spam = nobody:true
 hosts = !+relay_from_hosts
 condition = ${if >{$spam_score_int}{29}{1}{0}}
 message = X-Spam-Status: $spam_report

# если письмо набрало больше 10 баллов, то
# не принимаем его -устанавливаем deny
# что бы переслать на ящик [email protected] - ставим accept
accept message = Message scored $spam_score spam points
 spam = nobody:true
 condition = ${if >{$spam_score_int}{100}{yes}{no}}
 # и записываем сообщение в лог
 logwrite = Email from $sender_address with $spam_score spam points redirected to [email protected] by SpamAssassin

В блок begin routers добавляем пересылку писем:

begin routers

# роутер пересылающий спам в ящик [email protected]
scan_redirect:
 driver = redirect
 condition = ${if def:h_X-Redirect-To: {1}{0}}
 headers_add = X-Original-Recipient: $local_part@$domain
 data = $h_X-Redirect-To:
 headers_remove = X-Redirect-To

Проверяем конфиг:

# exim -bV

Перезапускаем Exim:

# service exim restart
Shutting down exim: [ OK ]
Starting exim: [ OK ]

Пробуем отправить письмо с текстом:

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X#sthash.oh8083pv.dpuf

На любой ящик сервера, и смотрим лог /var/log/exim/main.log:

2014-07-14 22:06:44 1X6laG-0008Nh-Ff Email from [email protected] with 1001.8 spam points redirected to [email protected] by SpamAssassin

Spamassasin работает.

Когда накопится какое-то количество спама в определённой папке (например – Thunderbird имеет собственный антиспам, и складывает спам в отдельную папку + можно самому помечать письма как спам) – можно запустить утилиту sa-learn для обучения:

# sa-learn --spam /var/vmail/domain.kiev.ua/[email protected]/.Junk/
Learned tokens from 66 message(s) (67 message(s) examined)

И для обучения “хорошим” письмам:

# sa-learn --ham /var/vmail/domain.kiev.ua/[email protected]/cur/

Можно добавить вызов в cron:

# crontab -e
# crontab -l
00 */12 * * * /usr/bin/sa-learn --spam /var/vmail/domain.kiev.ua/[email protected]/.Junk/

Проверку “хорошей” почте в cron пока не добавляем, т.к. ещё много спама будет попадать в новую почту.

И проверим базу bayes:

# sa-learls -l bayes/
total 284
-rw-r--r-- 1 root root 0 Jul 14 08:21 bayes_
-rw------- 1 root root 12288 Jul 14 08:24 bayes__seen
-rw------- 1 root root 331776 Jul 14 08:24 bayes__toks

ToDo: подключить Pyzor, Razor2 и DCC; перенести базу Bayes в MySQL.

Ссылки по теме

http://extmemory.blogspot.com

http://samag.ru

http://www.maretmanu.org

http://wiki.apisnetworks.com

https://github.com

http://www.exim.org

Примеры написания собственных правил

http://intuitive.com