среда, 13 января 2010 г.

Настройка SpamAssassin

SpamAssassin это почтовый спам-фильтр, действие которого основывается на теореме Байеса. Поскольку он написан на Perl, применять его на высоко нагруженных серверах не рекомендуется, в связи с не очень большим быстродействием. Однако, он достаточно прост в установке и настройке и при этом показывает неплохие результаты по отсеканию спама, поэтому часто используется в небольших компаниях.



Установка
В качестве платформы для построения почтового сервера используем Gentoo, MTA - exim.
Для начала обновляем дерево портеджей, чтобы установить spamassassin последней stable версии:
# emerge --sync
 Затем устанавливаем непосредственно spamassassin:
# USE="tools" emerge -avD spamassassin
 Переменная USE команды emerge позволяет включать/выключать поддержку различных функций в устанавливаемых пакетах. Ключ -а указывает на необходимость выдачи запроса на подтверждение перед началом установки, -v включает вывод подробной информации в процессе установки, -D включает установку всех необходимых зависимостей для устанавливаемого пакета. Для spamassassin переменная USE может иметь следующие значения:
  • berkdb - поддержка sys-libs/db (berkeleyDB для MySQL)
  • doc - расширенная документация (API, Javadoc и т.д.)
  • ipv6 - поддержка протокола IP версии 6
  • ldap - поддержка LDAP
  • mysql - поддержка MySQL
  • postgres - поддержка Postgresql
  • qmail - поддержка функций для работы с QMail, документация
  • sqlite - поддержка sqlite
  • ssl - поддержка SSL
  • tools - инструменты spamassassin (salern и т.д.)
Для просмотра возможных значений переменной USE для любого пакета в системе удобно пользоваться утилитой equery, она входит в состав пакета gentoolkit. Например для exim:
# equery uses exim
[ Searching for packages matching exim... ]
[ Colour Code : set unset ]
[ Legend : Left column  (U) - USE flags from make.conf ]
[ : Right column (I) - USE flags packages was installed with ]
[ Found these USE variables for mail-mta/exim-4.69-r3 ]
 U I
 - - X            : Adds support for X11
 - + dnsdb        : Adds support for a DNS search for a record whose domain name is the supplied query
 - - domainkeys   : Adds support for Yahoo!'s DomainKey sender verification system
 - - dovecot-sasl : Adds support for Dovecot's authentication
 - + exiscan      : Patch providing support for content scanning backward-compatibility
 - + exiscan-acl  : Patch providing support for content scanning
 - - gnutls       : Adds support for net-libs/gnutls (TLS 1.0 and SSL 3.0 support)
 + - ipv6         : Adds support for IP version 6
 + + ldap         : Adds LDAP support (Lightweight Directory Access Protocol)
 - - lmtp         : Adds support for lmtp
 - - maildir      : Adds support for maildir (~/.maildir) style mail spools
 - - mbx          : Adds support for UW's mbx format
 + + mysql        : Adds mySQL Database support
 - - nis          : Support for NIS/YP services
 + + pam          : Adds support PAM (Pluggable Authentication Modules) - DANGEROUS to arbitrarily flip
 + + perl         : Adds support/bindings for the Perl language
 - - postgres     : Adds support for the postgresql database
 - - radius       : Adds support for RADIUS authentication
 - - sasl         : Adds support for the Simple Authentication and Security Layer
 - - spf          : Adds support for Sender Policy Framework
 - - sqlite       : Adds support for sqlite - embedded sql database
 - - srs          : Adds support for Sender Rewriting Scheme
 + + ssl          : Adds support for Secure Socket Layer connections
 - + syslog       : Enables support for syslog
 + + tcpd         : Adds support for TCP wrappers
Для защиты от спама будем использовать два дополнительных пакета DCC и Razor. Устанавливаем:
# emerge razor dcc
Razor является сигнатурным анализатором, принцип действия которого заключается в следующем. Чтобы определить, является ли сообщение спамом, система рассчитывает его сигнатуру (чтобы не реагировать на незначительные модификации, применяются различные алгоритмы получения нечетких сигнатур) и сверяет ее с базой спама, собираемого по всему миру. Если соответствие находится, то анализируемое письмо считается спамом и обрабатывается согласно дальнейшим настройкам. Если же совпадение не обнаружено, сообщение доставляется получателю как обычно.
Для работы Razor надо открыть два порта:
TCP 2703 — Исходящий трафик от MTA на Razor серверы
TCP 7 — Исходящий ping от MTA на Razor серверы

DCC (DISTRIBUTED CHECKSUM CLEARING HOUSE) так же является сигнатурным анализатором, принцип работы которого заключается в том, что для каждого входящего сообщения определяется специальная контрольная сумма. Это число отправляется на специальный сервер, где сверяется с базой данных. По проверочной сумме сервер оценивает, как часто сообщение уже регистрировалось у других получателей и параллельно фиксирует увеличение количества таких сообщений. Сообщения с высокой регистрационной суммой DCC могут быть отнесены к категории спама. Регистрационные суммы DCC направляются в виде пакета UDP на сервер DCC, и точно так же происходит получение ответа. В каждом случае пересылается только контрольная сумма, а не само сообщение.
Для работы DCC нужно открыть порт UDP 6277

Настройка


Spamassassin
Для передачи сообщений на проверку, нужно открыть 783 порт.

/etc/mail/spamassassin/local.cf
# This is the right place to customize your installation of SpamAssassin.
#
# See 'perldoc Mail::SpamAssassin::Conf' for details of what can be
# tweaked.
#
# Only a small subset of options are listed below
#
##################################################
#   Добавлять метку *****SPAM***** к спам сообщениям
#
rewrite_header Subject *****SPAM*****

#   Сохранять спам как MIME вложения (message/rfc822)
#   вместо изменения исходного сообщения (0: выкл, 2: использовать text/plain)
#
report_safe 2

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

#   Метод блокировки файлов
#
lock_method flock

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

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

#   Путь к базе bayes
#
bayes_path /none/.spamassassin/bayes

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

#   Указываем сколько чистых писем и писем со спамом должно
#   накопится в Bayesian базе прежде чем демон будет пользоваться
#   этой базой (по умолчания - 200 не спама и спама)
#
bayes_min_ham_num 1
bayes_min_spam_num 1

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

# Не использовать сетевые проверки (т.к. делаем это в MTA)
skip_rbl_checks         0
#   Использовать Razor
use_razor2                1
#   Использовать DCC
use_dcc                    1
#   Не использовать Pyzor
use_pyzor                 0

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

ok_languages en ru
ok_locales en ru

#   Автоматический белый список выключаем, поскольку в него
#   зачастую попадают спамеры.
#use_auto_whitelist 0
#auto_whitelist_path        /etc/mail/spamassassin/auto-whitelist
#auto_whitelist_file_mode   0666
/etc/mail/spamassassin/v310.pre
Разкоментируем две строчки:
loadplugin Mail::SpamAssassin::Plugin::DCC
loadplugin Mail::SpamAssassin::Plugin::Razor2
Razor
Создаем конфигурационный файл:
# razor-admin -create -home=/none/.razor
 Регистрируемся в сети:
# razor-admin -register -user=user@domain.ru -home=/none/.razor
Регистрация требуется только в том случае, если Вы хотите активно участвовать в системе Razor, отсылая в нее сообщения определенные Вами как спам, но пропущенные системой.

DCC
Поскольку предполагается что у нас не большой поток сообщений (меньше 100,000 писем в сутки), то самый простой для нас вариант — это когда мы выступаем как DCC-клиент и используем публичные DCC-серверы. Для такой работы уже почти всё готово сразу после установки. Нужно только немного изменить конфигурацию и проверить, что открыт сетевой доступ к публичным DCC серверам. Включаем в конфигурационном файле /etc/dcc/dcc_conf нужный DCC-клиент (DCCM_ENABLE=on для sendmail, или DCCIFD_ENABLE=on для остальных программ)
Для управления и настройки работы DCC-клиента используется cdcc.

Файл map.txt содержит начальный список публичных DCC-серверов, который инициализируется при установке DCC. Этот список можно поменять через cdcc или изменить map.txt и загрузить его:
# cdcc "load /etc/dcc/map.txt

В нашем случае, поскольку мы не собираемся поднимать свой сервер DCC, нужно закоментировать строки:
# local DCC server
#127.0.0.1   RTT-1000 ms    32768 2924965012y603

# local greylist server
#127.0.0.1   GREYLIST   32768 2924965012y603
Либо удалить с помощью cdcc:
# cdcc "delete 127.0.0.1 Greylist"
# cdcc "delete 127.0.0.1"
Получить информацию о доступных сейчас DCC-серверах:
# cdcc "info"

# 01/13/10 16:03:00 MSK /var/dcc/map
# Re-resolve names after 17:45:03
# 1306.63 ms threshold, 1290.82 ms average 12 total, 12 working servers
IPv6 off

dcc1.dcc-servers.net,- RTT+1000 ms anon
# 152.20.253.5,- dcc.uncw.edu ID 1201
#      100% of 14 requests ok 286.33+1000 ms RTT      100 ms queue wait
# *194.228.41.73,- CTc-dcc1 ID 1030
#      100% of 32 requests ok 195.46+1000 ms RTT      100 ms queue wait
# 207.195.195.223,- SIHOPE-DCC-3 ID 1085
#      88% of 17 requests ok 323.60+1000 ms RTT        100 ms queue wait

Посмотреть статистику работы DCC-серверов:
# cdcc «status all»

dcc1.dcc-servers.net 194.228.41.73,6277
        server-ID 1030  map  16:05:23
    version 1.3.87  tracing ANON CLNT
39481336 hash entries 28077642 used 1592202624 DB bytes
  100 ms delay  449225 NOPs  86 ADMN  46999 query  >50000 clients since 01:02:35
3086861 reports   14266>10   13918>100   13918>1000   13918 many
        answers 1938133>10 1804340>100 1610794>1000 1448427 many
    0 bad IDs    4 passwds   0 error responses 20139 retransmitted
    0 answers rate-limited   0 anonymous           0 rejected reports
    flood on   3 streams   2 out active 2 in 5598956 total flooded in
3581212 accepted 2349 stale 2015195 dup      0 white    0 delete
6761968 reports added between Jan 13 01:02:35.143922 CET and Jan 13 14:05:25
Exim 
Редактируем /etc/exim/exim.conf
Включаем поддержку spamassassin:
spamd_address = 127.0.0.1 783
В секции acl_check_content модифицируем заголовки сообщения, по результатам проверки:
#Указываем адрес на который пересылать сообщения
#определенные как спам, на случай если это ошибка.
  warn  message = X-Redirect-To: spam@domain.ru
    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

#Если письмо набрало больше 18 баллов, то не принимаем его
  deny  message    = Message scored $spam_score spam points
#    condition    = ${if <{$message_size}{100k}{yes}{no}}
    spam        = nobody:true
    condition    = ${if >{$spam_score_int}{180}{yes}{no}}
В секции routers создаем маршрутизатор для перенаправления  сообщений помеченных как спам:
#Роутер пересылающий спам в ящик spam@domain.ru
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
    redirect_router = localserver
Готово! Добавляем spamassassin в автозапуск и стартуем его:
# rc-update -a spamd default
# /etc/int.d/spamd start
И на сладкое несколько правил проверки сообщений для exim, здорово прорежающих поток спама(спасибо большое Lissyara). Прописываем в секции acl_check_rcpt:
#Отрубаем если запрещенные символы в адресе
  deny    message    = "Incorrect symbols in address"
      domains       = !+local_domains
          local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./

  accept  local_parts   = postmaster
          domains       = +local_domains

  require verify        = sender

#Отрубаем если нет  HELO
  deny    message       = HELO/EHLO required by SMTP RFC
          condition     = ${if eq{$sender_helo_name}{}{yes}{no}}
      delay        = 30s

#Отрубаем хосты у которых в EHLO стоит IP
  deny    message    = We don't allow domain literals. Too much spam...
      domains        = !+local_domains
      condition    = ${if isip{$sender_helo_name}{yes}{no}}
      delay     = 30s

#Отрубаем хосты у которых в EHLO наш адрес.
  deny      message    = Message was delivered by ratware - own
      condition    = ${if match_domain{sender_helo_name}\
                {$primary_hostname:+local_domains:+relay_to_domains}\
                {true}{false}}
      log_message    = remote host used our name in EHLO/HELO.
      delay        = 30s

#Отрубаем хосты с динамическими адресами
  deny    message       = Go Away! You are spammer.
          condition     = ${if match{$sender_host_name} \
                          {bezeqint\\.net|net\\.il|dialup|dsl|pool|peer|dhcp} \
                          {yes}{no}}

#Отрубаем хосты из черных списков
  deny    message       = message from \
  $sender_host_address rejected - see http://njabl.org/
          log_message   = found in $dnslist_domain
          dnslists      = dnsbl.njabl.org

  deny    message       = Spam blocked see: \
  http://www.spamcop.net/w3m?action=checkblock&ip=$sender_host_address
          log_message   = found in $dnslist_domain
          dnslists      = bl.spamcop.net

  deny    message       = Spam blocked see: \
  http://www.spamhaus.org
          log_message   = found in $dnslist_domain
          dnslists      = zen.spamhaus.org

На этом все, в следующий раз, как руки дойдут, напишу про обучение spamassassin.

2 комментария:

  1. > redirect_router = localserver // что-то тут не так... откуда роутер localserver? или что это?

    ОтветитьУдалить
    Ответы
    1. Здесь подразумевается роутер, обрабатывающий входящие сообщения. У меня это передача сообщений на внутренний сервер. Выглядит так:
      #Роутер передающий почту на внутренний сервер
      localserver:
      driver = "manualroute"
      domains = +local_domains
      transport = remote_smtp
      ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
      route_list=* 192.168.0.XXX
      no_more

      Удалить