5 Июнь 2016

Отправляем отчёты о спаме во внешние сервисы через Spamassassin

Sending spam reports to external services using Spamassassin

Не секрет, что борьба со спамом является довольно нетривиальной задачей требующей комплексного подхода. Это обусловливает использование широкого набора средств анализа, контроля и оценки на всех уровнях приёма нового сообщения передаваемого по каналам электронной почты.

Одним из наиболее популярных и мощных инструментов реализующих данный комплексный подход является пакет Spamassassin. Однако, Spamassassin обладает не только возможностями по борьбе со спамом внутри системы, но и реализует некоторые возможности по отправке отчётов о вновь обнаруженном спаме на обслуживаемой им системе во внешние антиспам-службы на базе техник учёта контрольных сумм (checksum-based filtering) и чёрных листов хостов (DNSBL). Это позволяет иметь более точные данные по распространению того или иного вида спам-сообщений и более адекватно представлять данные по ним всем подписчикам по всему миру.

Рассмотрим настройку работы данного механизма в рамках имеющейся системы на базе FreeBSD.

root@beta:~ # uname -v
FreeBSD 10.3-RELEASE-p4 #0: Sat May 28 12:23:44 UTC 2016     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC
root@beta:~ # spamassassin -V
SpamAssassin version 3.4.1
  running on Perl version 5.20.3

1. Подключение checksum-based служб

К числу служб на базе учёта контрольных сумм поддерживаемых Spamassassin относятся три наиболее известных — Rhyolite DCC, Vipul's Razor и Pyzor.

Не рассматривая отдельно настройку и установку Spamassassin, которые достаточно подробно освещены в его документации и множестве статей в интернет, обратим лишь внимание на необходимость наличия включённых в него соответствующих модулей при компиляции.

root@beta:~ # cd /usr/ports/mail/spamassassin/
root@beta:/usr/ports/mail/spamassassin # make showconfig
===> The following configuration options are available for spamassassin-3.4.1_6:
     AS_ROOT=on: Run spamd as root (recommended)
     SSL=on: Build spamd/spamc with SSL support
     UPDATE_AND_COMPILE=on: Download and compile rulesets (recommended)
====> Optional user-config/bayes database backends
     MYSQL=on: MySQL database support
     PGSQL=off: PostgreSQL database support
====> Optional SpamAssassin plugins
     DCC=on: DCC digest list support (mail/dcc-dccd)
     DKIM=on: Verify DKIM records (mail/p5-Mail-DKIM)
     PYZOR=on: Pyzor digest list support (mail/pyzor)
     RAZOR=on: Vipul's Razor digest list support (mail/razor-agents)
     RELAY_COUNTRY=off: Location-based scoring (net/p5-Geo-IP)
     SPF_QUERY=on: Verify SPF records (mail/p5-Mail-SPF)
====> GnuPG (for sa-update, optional): you have to select exactly one of them
     GNUPG_NONE=off: Do not use GnuPG
     GNUPG=off: GnuPG 1 (security/gnupg1)
     GNUPG2=on: GnuPG 2 (security/gnupg)
===> Use 'make config' to modify these settings

Благодаря этому необходимые пакеты служб checksum-based filtering будут автоматически установлены в систему.

root@beta:/usr/ports/mail/spamassassin # pkg info | egrep "(pyzor|dcc|razor)"
dcc-dccd-1.3.158_1             Distributed Checksum Clearinghouse bulk email detector
py27-pyzor-1.0.0               Collaborative, networked system to detect and block spam
razor-agents-2.84_1            Distributed, collaborative, spam detection and filtering network

Также следует проконтролировать, чтобы для этих служб были открыты порты для обмена с серверами:

  • для DCC - UDP 6277;
  • для Razor - TCP 2307;
  • для Pyzor - UDP 24441.

Кроме того, демону Spamassassin необходимо разрешить отправку отчётов во внешние системы ключом -l или --allow-tell.

root@beta:~ # cat /etc/rc.conf | grep spamd
spamd_enable="YES"
spamd_flags="-x -q -l -u mailnull"

1.1. Настройка DCC

Ввиду того, что в данной системе данные из службы DCC используются также и SMTP сервером Exim, был выбран вариант его использования в демонизированном виде через модуль интерфейса dccifd.

Его настройка сводится к указанию по запуску службы в файле rc.conf.

root@beta:~ # cat /etc/rc.conf | grep dcc
dccifd_enable="YES"

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

root@beta:~ # cd /usr/local/dcc/
root@beta:/usr/local/dcc # cp dcc_conf.sample dcc_conf
...
root@beta:/usr/local/dcc # diff -u dcc_conf.sample dcc_conf | grep -v "#"
--- dcc_conf.sample     2016-02-26 23:47:26.386821000 +0200
+++ dcc_conf    2014-11-25 21:19:26.000000000 +0200
@@ -7,7 +7,7 @@

 DCC_CONF_VERSION=4

@@ -89,14 +89,14 @@
 DCCM_LOG_AT=5
-DCCM_REJECT_AT=
+DCCM_REJECT_AT=MANY
 DCCM_CKSUMS=
 DCCM_XTRA_CKSUMS=

-DCCIFD_ENABLE=off
+DCCIFD_ENABLE=on

Параметр DCCIFD_ENABLE сигнализирует о использовании службы в режиме демона, а DCCM_REJECT_AT устанавливает уровень, при котором демон DCC будет выдавать позитивную оценку на спам.

И запустим его и проверим корректность функционирования.

root@beta:/usr/local/dcc # service dccifd start
Starting dccifd.
root@beta:/usr/local/dcc # cdcc info
# 06/05/16 16:48:39 EET  /usr/local/dcc/map
# Re-resolve names after 17:36:17  Check RTTs after 16:52:30
# 1334.06 ms threshold, 1289.40 ms average    12 total, 9 working servers
IPv6 off   version=3

dcc1.dcc-servers.net,-      RTT+1000 ms  anon
#  209.169.14.27,-                                     x.dcc-servers ID 104
#     100% of 32 requests ok  292.13+1000 ms RTT       100 ms queue wait
#  209.169.14.29,-                                     x.dcc-servers ID 104
#     100% of 32 requests ok  289.19+1000 ms RTT       100 ms queue wait
#  209.169.14.30,-                                     x.dcc-servers ID 104
#     100% of 32 requests ok  269.15+1000 ms RTT       100 ms queue wait

dcc2.dcc-servers.net,-      RTT+1000 ms  anon
#  67.66.138.141,-
#      not answering
#  69.12.208.70,-                                          sonic.net ID 1156
#     100% of 32 requests ok  300.66+1000 ms RTT       100 ms queue wait
# *192.84.137.21,-                                           INFN-TO ID 1233
#     100% of 32 requests ok  147.94+1000 ms RTT       100 ms queue wait

dcc3.dcc-servers.net,-      RTT+1000 ms  anon
#  38.124.232.176,-                                                  ID 1102
#     100% of 32 requests ok  234.06+1000 ms RTT       100 ms queue wait
#  74.92.232.243,-                                          Etherboy ID 1002
#     100% of 32 requests ok  247.10+1000 ms RTT       100 ms queue wait

dcc4.dcc-servers.net,-      RTT+1000 ms  anon
#  69.12.221.230,-                                         sonic.net ID 1117
#     100% of 32 requests ok  296.51+1000 ms RTT       100 ms queue wait

dcc5.dcc-servers.net,-      RTT+1000 ms  anon
#  209.169.14.26,-
#      not answering
#  216.240.102.30,-                                          dmv.com ID 1181
#     100% of 32 requests ok  247.40+1000 ms RTT       100 ms queue wait

@,-                         RTT-1000 ms  32768 secret13192363914y2710
#  127.0.0.1,-
#      not answering

################
# 06/05/16 16:48:39 EET  greylist /usr/local/dcc/map
# Re-resolve names after 18:43:05
# 1 total, 0 working servers
# continue not asking greylist server 256 seconds after 4 failures

@,-                         Greylist 32768 secret13192363914y2710
# *127.0.0.1,6276
#      not answering

Кроме того, ввиду того, что DCC ведёт локальный лог в специфическом формате (см. каталог /usr/local/dcc/log), следует позаботиться о её своевременной очистке используя специальный скрипт через службу CRON.

root@beta:/usr/local/dcc # cat /etc/crontab | grep dcc
15      0       *       *       *       dcc     /usr/local/dcc/libexec/cron-dccd

1.2. Настройка Vipul's Razor

Служба Vipul's Razor использует индивидуальные для каждого системного пользователя настройки. В этой связи принимая во внимание, что Spamassassin, как все остальные почтовые сервисы в этой системе, работает от имени пользователя mailnull.

Рабочий каталог этой учётной записи расположен по пути /var/spool/mqueue.

root@beta:/usr/local/dcc # cat /etc/passwd | grep mailnull
mailnull:*:26:26:Sendmail Default User:/var/spool/mqueue:/usr/sbin/nologin

Произведём стартовую настройку посредством утилиты razor-admin и проверим результат.

root@beta:/usr/local/dcc # chown mailnull /var/spool/mqueue
root@beta:/usr/local/dcc # cd /var/spool/mqueue
root@beta:/var/spool/mqueue # sudo -u mailnull razor-admin -discover
root@beta:/var/spool/mqueue # sudo -u mailnull razor-admin -create
root@beta:/var/spool/mqueue # sudo -u mailnull razor-admin -register
Register successful.  Identity stored in /var/spool/mqueue/.razor/identity-rusaQdc5__
root@beta:/var/spool/mqueue # ll .razor/
total 16
lrwxr-xr-x  1 mailnull  daemon    19  5 июн 18:13 identity@ -> identity-rusaQdc5__
-rw-------  1 mailnull  daemon    90  5 июн 18:13 identity-rusaQdc5__
-rw-r--r--  1 mailnull  daemon   706  5 июн 18:13 razor-agent.conf
-rw-r--r--  1 mailnull  daemon  1095  5 июн 18:15 razor-agent.log
-rw-r--r--  1 mailnull  daemon   995  5 июн 18:15 server.c303.cloudmark.com.conf
-rw-r--r--  1 mailnull  daemon   839  5 июн 18:13 server.n002.cloudmark.com.conf
-rw-r--r--  1 mailnull  daemon    57  5 июн 18:15 servers.catalogue.lst
-rw-r--r--  1 mailnull  daemon    30  5 июн 18:13 servers.discovery.lst
-rw-r--r--  1 mailnull  daemon    76  5 июн 18:15 servers.nomination.lst

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

root@beta:/var/spool/mqueue # locate sample-spam.txt
/root/.cpan/build/Mail-SpamAssassin-3.4.1-4hz5PT/sample-spam.txt
root@beta:/var/spool/mqueue # sudo -u mailnull razor-check -d /root/.cpan/build/Mail-SpamAssassin-3.4.1-4hz5PT/sample-spam.txt
 Razor-Log: Computed razorhome from env: /var/spool/mqueue/.razor
 Razor-Log: Found razorhome: /var/spool/mqueue/.razor
 Razor-Log: read_file: 15 items read from /var/spool/mqueue/.razor/razor-agent.conf
июн 05 17:31:40.426582 check[4873]: [ 2] [bootup] Logging initiated LogDebugLevel=9 to stdout
июн 05 17:31:40.427894 check[4873]: [ 5] computed razorhome=/var/spool/mqueue/.razor, conf=/var/spool/mqueue/.razor/razor-agent.conf, ident=/var/spool/mqueue/.razor/identity-rusaQdc5__
июн 05 17:31:40.428105 check[4873]: [ 2]  Razor-Agents v2.84 starting razor-check -d /root/.cpan/build/Mail-SpamAssassin-3.4.1-4hz5PT/sample-spam.txt
...
июн 05 17:31:40.782315 check[4873]: [ 8] razor-check finished successfully.

1.3. Настройка Pyzor

Служба Pyzor не требует постинсталляционных настроек для успешного функционирования. В этом можно удостоверится специальной тестовой командой.

root@beta:/var/spool/mqueue # sudo -u mailnull pyzor ping
public.pyzor.org:24441  (200, 'OK')

1.4. Настройка DNSBL

По умолчанию проверка на вхождение в различные DNSBL включена в Spamassassin по умолчанию и не требует никаких дополнительных действий. При этом отправка отчётов об обнаруженном спаме доступна для листа SpamCop.

2. Дополнительная настройка Spamassassin

Теперь следует произвести дополнительную настройку вышеописанных служб в файле конфигурации Spamassassin.

root@beta:/var/spool/mqueue # cd /usr/local/etc/mail/spamassassin/
root@beta:/usr/local/etc/mail/spamassassin # cat local.cf
...
# DCC
dcc_home                        /usr/local/dcc
dcc_dccifd_path                 /var/db/dcc/dccifd
dcc_timeout                     10

# Razor
use_razor2 1

# Pyzor
use_pyzor 1
pyzor_path /usr/local/bin/pyzor
pyzor_options --homedir /var/spool/mqueue/

# SpamCop
spamcop_from_address noreply@my.server
...

В секции настроек DCC сообщаем о работе через путь к сокет-файлу указанному в dcc_dccifd_path и устанавливаем таймаут ожидания ответа от него, а в секции Pyzor указываем путь к исполняемому модулю и рабочему каталогу для хранения временных данных для проверки в данной службе. Кроме того командами use_razor2 и use_pyzor эти модули включаются в алгоритим проверки Spamassassin. При этом DCC в последних версиях включён по-умолчанию и не требует отдельной активации.

Для DNSBL SpamCop сообщаем от имени какого пользователя будет оправляться отчёт о спаме. В противном случае будут использованы данные ident что в ряде случаев может привести к некорректному формированию адреса отправителя и ошибке отправки отчёта.

Итак, все настройки завершены и можно перезапустить демон Spamassassin.

root@beta:/usr/local/etc/mail/spamassassin # service sa-spamd restart
Stopping spamd.
Waiting for PIDS: 1486.
Starting spamd.

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

root@beta:/usr/local/etc/mail/spamassassin # spamassassin -D < /root/.cpan/build/Mail-SpamAssassin-3.4.1-4hz5PT/sample-spam.txt
...

3. Отправка отчётов о спаме

Отправка отчётов о спаме производится в процессе стандартного обучения Spamassassin. При этом обратите внимание, что по-обыкновению используемая для этих целей локальная утилита sa-learn, во-первых, работает только локально, а, во-вторых, и это главное, затрагивает только Bayes-фильтры данной системы и не имеет функционала отправки отчётов во внешние службы.

Однако искомым функционалом обладает сетевой клиент spamc. При его вызове с ключом -C type или --reporttype=type, где type принимает значения report для спама и revoke для ошибочно принятого за спам сообщения.

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

Результаты отправки отчётов о спаме будут кратко отображаться в стандартном лог-файле Spamassassin.

root@beta:~ # cat /var/log/maillog
...
Jun 05 16:00:00 beta spamd[53319]: spamd: connection from localhost [::1]:54015 to port 783, fd 5
Jun 05 16:00:05 beta spamd[53319]: reporter: spam reported to DCC
Jun 05 16:00:06 beta spamd[53319]: reporter: spam reported to Pyzor
Jun 05 16:00:09 beta spamd[53319]: reporter: spam reported to Razor
Jun 05 16:00:11 beta spamd[53319]: reporter: spam reported to SpamCop
Jun 05 16:00:11 beta spamd[53319]: spamd: Tell: Setting local,remote for box@my.server:26 in 11.6 seconds, 32981 bytes
Jun 05 16:00:11 beta spamd[34712]: prefork: child states: II
...

При отправке же отчётов об ошибочно отнесённой к спаму корреспонденции Spamassassin поддерживает лишь Vipul's Razor.

4. PROFIT!

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