2 Июль 2016

Особенности вызова и обучения Spamassassin

Spamassassin call and learining niceties

В этой небольшой заметке хотелось бы уделить внимание особенностям вызова антиспам системы Spamassassin для обработки входящей корреспонденции и взаимосвязанного с этим процесса обучения bayes-фильтров, которым, на мой взгляд, уделено недостаточное внимание в многочисленных how-to посвещённых этому замечательному программному комплексу.

Начнём, пожалуй с главной особенности процесса использования Spamassassin, а именно возможности учитывать при оценке входящей почты на её принадлежность (или наоборот) к спаму посредством вышеупомянутых статистических bayes-фильтров. Их формирование может происходить как в ручном режиме посредством т.н. "обучения" системы путём передачи на вход письма, которое вами классифицируется как очевидный спам, так и в автоматическом режиме на основании критериев настройки автообучения.

1. Учитывайте имя пользователя

Однако при этом следует учитывать тот важный факт, о котором часто забывают, а именно учёт Spamassassin при обращении и формировании базы bayes-фильтров имени пользователя от которого (и для которого) производятся с ней действия. Важно именно какой пользователь вызывает проверку и от имени какого производится обучение. Для правильно результата, очевидно, необходимо что это должен один и тот же пользователь.

Почтовая система использующая Spamassassin может применять единую базу настроек и базу bayes-фильтров для системы в целом, индивидуальные базы для каждого пользователя, либо оба метода сразу.

В последнем случае данные будут дублированы как в общей базе системы, так и в персональной базе пользователя, на имя которого поступило проверяемое письмо. Помимо этого, следует учитывать, что проверка письма будет произведена столько раз, сколько локальных пользователей в данной системе оно имеет + 1 раз для общей базы системы. Многократный вызов может иметь значение для нагруженных почтовых систем по причинам ресурсоёмкости.

2. Момент вызова проверки при приёме письма

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.

3. Процесс обучения

В любом случае - использования ли единой системной базы или персональных данных для каждого пользователя, для выбора корректной базы данных следует использовать ключ -u с указанием имени в клиентских утилитах sa-learn или spamc посредством которых производится обращение к основному демону Spamassassin.

Немного о процессе настройки механизма обучения я уже писал ранее в статье "Отложенное пакетное обучение антиспам-фильтра используя Dovecot" - рекомендую к прочтению.

4. PROFIT!

Статья была полезной? Тогда прошу не стесняться и поддерживать деньгами через PayPal или Яндекс.Деньги.