В этой небольшой заметке хотелось бы уделить внимание особенностям вызова антиспам системы Spamassassin для обработки входящей корреспонденции и взаимосвязанного с этим процесса обучения bayes-фильтров, которым, на мой взгляд, уделено недостаточное внимание в многочисленных how-to посвещённых этому замечательному программному комплексу.
Начнём, пожалуй с главной особенности процесса использования Spamassassin, а именно возможности учитывать при оценке входящей почты на её принадлежность (или наоборот) к спаму посредством вышеупомянутых статистических bayes-фильтров. Их формирование может происходить как в ручном режиме посредством т.н. "обучения" системы путём передачи на вход письма, которое вами классифицируется как очевидный спам, так и в автоматическом режиме на основании критериев настройки автообучения.
Однако при этом следует учитывать тот важный факт, о котором часто забывают, а именно учёт Spamassassin при обращении и формировании базы bayes-фильтров имени пользователя от которого (и для которого) производятся с ней действия. Важно именно какой пользователь вызывает проверку и от имени какого производится обучение. Для правильно результата, очевидно, необходимо что это должен один и тот же пользователь.
Почтовая система использующая Spamassassin может применять единую базу настроек и базу bayes-фильтров для системы в целом, индивидуальные базы для каждого пользователя, либо оба метода сразу.
В последнем случае данные будут дублированы как в общей базе системы, так и в персональной базе пользователя, на имя которого поступило проверяемое письмо. Помимо этого, следует учитывать, что проверка письма будет произведена столько раз, сколько локальных пользователей в данной системе оно имеет + 1 раз для общей базы системы. Многократный вызов может иметь значение для нагруженных почтовых систем по причинам ресурсоёмкости.
Spamassassin проверяет огромное количество входных данных для принимаемого почтовой системы письма, в том числе и само тело сообщения. Понимая это, очевидно, что запуск проверки на спам возможен, как минимум в тот момент, когда письмо уже поступило к нам посредством команды SMTP DATA. В случае, если вы используете Exim, это раздел acl_smtp_data.
Для вызова Spamassassin в конфигурационном файле Exim предусмотрено специальное правило
spam = username
где username имя системного пользователя от имени которого будет производится запрос к базам и, возможно, автоматическое обучение. Рекомендую использовать в качестве этого имени системного пользователя, под именем которого работают почтовые сервера и сам Spamassassin. В моём случае это пользователь mailnull.
root@beta:/home/xm # ps -aux | grep mailnull
mailnull 35524 0,0 0,3 65168 11128 - Is вс15 0:17,93 /usr/local/sbin/exim -bd -q30m
mailnull 41858 0,0 2,6 202468 108184 - I пт13 0:09,37 spamd child (perl)
mailnull 54652 0,0 0,2 66424 8616 - S 13:58 0:00,36 dovecot/imap
mailnull 54653 0,0 0,2 66416 8976 - S 13:58 0:00,45 dovecot/imap
mailnull 57838 0,0 0,2 66416 8580 - I 19:31 0:00,13 dovecot/imap
mailnull 57842 0,0 0,2 66416 8636 - I 19:31 0:00,16 dovecot/imap
mailnull 57846 0,0 0,2 66424 8612 - I 19:31 0:00,14 dovecot/imap
mailnull 57850 0,0 0,2 66408 8788 - I 19:32 0:00,16 dovecot/imap
mailnull 57854 0,0 0,2 66428 9848 - I 19:32 0:00,21 dovecot/imap
mailnull 58087 0,0 2,3 194276 96208 - I 20:31 0:00,02 spamd child (perl)
root 60769 0,0 2,3 194276 96200 - Ss вт00 2:27,88 /usr/local/bin/spamd -x -q -l -u mailnull -d -r /var/run/spamd/spamd.pid (perl)
root 58454 0,0 0,1 18848 2572 0 S+ 21:58 0:00,00 grep mailnull
Вызов и обработка ответа Spamassassin на стадии проверки DATA в Exim возможен лишь для вышеописанного случая использования единых для всей системы базы данных ввиду того, что на данном этапе недоступны данные по адресатам принимаемого письма.
Очевидно, что для персонального, индивидуального для каждого пользователя, использования баз и процесса их обновления ("обучения") Spamassassin необходимо перенести процесс оценки входящей корреспонденции на уровень роутеров / транспортов Exim. Ввиду того, что процесс роутинга запускается для каждого имеющегося в системе получателя раздельно, именно здесь появляется возможность обращения к персонифицированным базам данных.
Пример такой конфигурации (приведены выдержки касающиеся темы данной статьи):
root@beta:/home/xm # cat /usr/local/etc/exim/configure
# $Cambridge: exim/exim-src/src/configure.default,v 1.14 2009/10/16 07:46:13 tom Exp $
# --- by Max Kostikov (c) 2010...2016 v.20160618
...
spamd_address = 127.0.0.1 783
# -- Spamassassin variables
SA_TIMEOUT = 300s
SA_MAXSIZE = 2097152
...
begin routers
# -- remote delivery
dnslookup:
...
domain_aliases:
...
user_aliases:
...
spamassassin_router:
driver = accept
domains = +local_domains
transport = spamassassin_local
condition = ${if and {{!eq{$received_protocol}{sa-checked}}\
{def:sender_host_address}\
{!match_ip{$sender_host_address}{+relay_from_hosts}}\
{!def:sender_host_authenticated}}{1}{0}}
no_verify
no_expn
...
local_user:
...
begin transports
...
spamassassin_local:
driver = pipe
use_bsmtp = true
command = /usr/local/sbin/exim -bS -oMr sa-checked
transport_filter = /usr/local/bin/spamc -s SA_MAXSIZE -u $local_part@$domain
home_directory = /tmp
current_directory = /tmp
log_output = true
return_fail_output = true
return_path_add = false
timeout = SA_TIMEOUT
timeout_defer = true
...
Обратите внимание на место роутера spamassassin_router в общем списке - он вызывается после внешних доставок и обработки псевдонимов для локальных доменов и пользователей. Т.е. проверки будут выполняться всегда для реально существующих в системе почтовых ящиков. Порядок транспортов в соответствующей секции такого значения не имеет.
Вкратце, данный механизм отправляет на оценку демону Spamassassin данное письмо от пользователя с именем в формате полного почтового адреса через транспорт spamassassin_local который возвращает его на доставку в секцию роутеров с пометкой как принятой через псевдопротокол sa-checked, который роутер Spamassassin повторно уже не обрабатывает и производится уже локальная доставка через роутер local_user.
В любом случае - использования ли единой системной базы или персональных данных для каждого пользователя, для выбора корректной базы данных следует использовать ключ -u с указанием имени в клиентских утилитах sa-learn или spamc посредством которых производится обращение к основному демону Spamassassin.
Немного о процессе настройки механизма обучения я уже писал ранее в статье "Отложенное пакетное обучение антиспам-фильтра используя Dovecot" - рекомендую к прочтению.
Статья была полезной? Тогда прошу не стесняться и поддерживать деньгами через PayPal или Яндекс.Деньги.