Фильтрация почты

Одной из больших проблем с электронной почтой является проблема массовой незатребованной почты (Unsolicited Bulk Email - UBE). Такие сообщения, более известные как СПАМ, могут к тому же содержать вирусы и другие виды вредоносных программ. В соответствии с некоторыми отчетами эти сообщения составляют подавляющую часть от всего трафика почтовых сообщений в интернете.

В этом разделе рассматривается интеграция Amavisd-new, Spamassassin и ClamAV с транспортным почтовым агентом (MTA) Postfix. Postfix может также проверять легальность почты с помощью передачи ее внешним фильтрам содержания. Эти фильтры могут иногда определить что сообщение является спамом без необходимости передачи его более ресурсоемким приложениям. Пара таких фильтров - это opendkim и python-policyd-spf.

  1. Amavisd-new - это программная оболочка, которая может вызывать любое количество фильтрующих программ по обнаружению спама, антивирусов и т.п.

  2. Spamassassin использует множество механизмов фильтрования почты на основе содержимого сообщений.

  3. ClamAV - антивирусное приложение с открытым кодом.

  4. opendkim является почтовым фильтром Sendmail для стандарта DKIM (почты, заверенной доменными ключами).

  5. python-policyd-spf обеспечивает проверку SPF (структуры политики отправителя) с Postfix.

А здесь то, как эти части работают вместе:

  1. Почтовое сообщение принимается Postfix.

  2. Это сообщение проходит через некоторые внешние фильтры, в том числе opendkim и python-policyd-spf.

  3. Затем сообщение обрабатывается Amavisd-new.

  4. ClamAV используется для проверки сообщения. Если сообщение содержит вирус, Postfix сбросит сообщение.

  5. Чистые сообщения затем будут проверены Spamassassin на принадлежность к спаму. Spamassassin затем добавит строки X-Header, позволяющие в дальнейшем Amavisd-new управлять сообщением.

Например, если сообщение содержит уровень спама более пятидесяти, оно будет автоматически выброшено из очереди чтобы не беспокоить получателя. В качестве альтернативы помеченное сообщение доставляется до почтового агента пользователя (MUA) чтобы пользователь сам определил насколько оно легальное.

Установка

Смотрите раздел Postfix для установки и настройки Postfix.

Чтобы установить основные приложения введите следующее в терминале:

sudo apt-get install amavisd-new spamassassin clamav-daemon
sudo apt-get install opendkim postfix-policyd-spf-python

Существуют некоторые общие пакеты, подключаемые к Spamassassin для лучшего определения спама:

sudo apt-get install pyzor razor

Поскольку основным фильтрующим приложениям требуются утилиты архивации для обработки прикрепленных файлов:

sudo apt-get install arj cabextract cpio lha nomarch pax rar unrar unzip zip
Если какие-то пакеты не были найдены, проверьте что хранилище multiverse разрешено в /etc/apt/sources.list.

Если вы внесли изменения в этот файл, убедитесь, что выполнили

sudo apt-get update

перед повторной попыткой установки.

Настройка

Теперь настроим чтобы все работало и фильтровало почту.

ClamAV

Стандартное поведение ClamAV вполне подходит для наших нужд. Для дополнительных опций настройки смотрите конфигурационные файлы в /etc/clamav.

Добавьте пользователя clamav в группу amavis, чтобы Amavisd-new имел соответствующие права доступа для сканирования файлов:

sudo adduser clamav amavis
sudo adduser amavis clamav

Spamassassin

Spamassassin автоматически определяет общие компоненты и использует их, если они присутствуют. Это означает, что нет необходимости настраивать pyzor и razor.

Отредактируйте /etc/default/spamassassin для активации сервиса Spamassassin. Измените

ENABLED=0

на

ENABLED=1

Теперь запустим сервис:

sudo /etc/init.d/spamassassin start

Amavisd-new

Сначала активируем проверку на спам и вирусы в Amavisd-new, отредактировав /etc/amavis/conf.d/15-content_filter_mode:

use strict;

# You can modify this file to re-enable SPAM checking through spamassassin
# and to re-enable antivirus checking.

#
# Default antivirus checking mode
# Uncomment the two lines below to enable it
#

@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);


#
# Default SPAM checking mode
# Uncomment the two lines below to enable it
#

@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

1;  # insure a defined return

Возврат спама может быть плохой идеей, поскольку обратный адрес часто неверный. Подумайте над тем, чтобы изменить в /etc/amavis/conf.d/20-debian_defaults установку $final_spam_destiny на D_DISCARD вместо D_BOUNCE, как показано ниже:

$final_spam_destiny       = D_DISCARD;

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

$sa_tag_level_deflt = -999; # add spam info headers if at, or above that level
$sa_tag2_level_deflt = 6.0; # add 'spam detected' headers at that level
$sa_kill_level_deflt = 21.0; # triggers spam evasive actions
$sa_dsn_cutoff_level = 4; # spam level beyond which a DSN is not sent

Если сетевое имя сервера отличается от MX записи домена, вам может потребоваться установить вручную опцию $myhostname. Также, если сервер принимает почту для нескольких доменов, опцию @local_domains_acl потребуется изменить. Отредактируйте файл /etc/amavis/conf.d/50-user:

$myhostname = 'mail.example.com';
@local_domains_acl = ( "example.com", "example.org" );

Если вы хотите покрывать несколько доменов, вы можете использовать следующее в файле /etc/amavis/conf.d/50-user:

@local_domains_acl = qw(.);

После настройки Amavisd-new требуется перезапустить:

sudo /etc/init.d/amavis restart
Белые списки DKIM

Amavisd-new может быть настроен на автоматическое занесение адресов в белый список из доменов с действительными доменными ключами. Есть несколько предварительно настроенных доменов в /etc/amavis/conf.d/40-policy_banks.

Существует несколько вариантов настройки белого списка для домена:

  1. 'example.com' => 'WHITELIST',: будет помещен в белый список любой адрес домена "example.com".

  2. '.example.com' => 'WHITELIST',: будет помещен в белый список любой адрес любого поддомена, который имеет действительную подпись.

  3. '.example.com/@example.com' => 'WHITELIST',: будут помещены в белый список поддомены "example.com", которые используют подпись родительского домена example.com.

  4. './@example.com' => 'WHITELIST',: добавляет адреса, которые имеют действительную подпись от "example.com". Это обычно используется для дискуссионных групп, которые подписывают свои сообщения.

Домен может иметь несколько настроек белого списка. После редактирования файла, перезапустите amavisd-new:

sudo /etc/init.d/amavis restart
В этом контексте, если домен добавлен в белый список, сообщение не будет передано каким-либо антивирусным или спам фильтрам. Это может быть как желательным, так и нежелательным поведением для вашего домена.

Postfix

Для интеграции Postfix, введите следующее из терминала:

sudo postconf -e 'content_filter = smtp-amavis:[127.0.0.1]:10024'

Далее отредактируйте /etc/postfix/master.cf, добавив следующее в коне файла:

smtp-amavis     unix    -       -       -       -       2       smtp
        -o smtp_data_done_timeout=1200
        -o smtp_send_xforward_command=yes
        -o disable_dns_lookups=yes
        -o max_use=20

127.0.0.1:10025 inet    n       -       -       -       -       smtpd
        -o content_filter=
        -o local_recipient_maps=
        -o relay_recipient_maps=
        -o smtpd_restriction_classes=
        -o smtpd_delay_reject=no
        -o smtpd_client_restrictions=permit_mynetworks,reject
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o smtpd_data_restrictions=reject_unauth_pipelining
        -o smtpd_end_of_data_restrictions=
        -o mynetworks=127.0.0.0/8
        -o smtpd_error_sleep_time=0
        -o smtpd_soft_error_limit=1001
        -o smtpd_hard_error_limit=1000
        -o smtpd_client_connection_count_limit=0
        -o smtpd_client_connection_rate_limit=0
        -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks

Также добавьте следующие две строки непосредственно после транспортного сервиса "pickup":

        -o content_filter=
        -o receive_override_options=no_header_body_checks

Это предотвратит от попадания в спам сообщений, созданных в качестве отчетов о спаме.

Теперь перезапустите Postfix:

sudo /etc/init.d/postfix restart

Фильтрация содержимого с поиском спама и вирусов теперь включена.

Amavisd-new и Spamassassin

При интеграции Amavisd-new со Spamassassin, если вы решили заблокировать фильтр Байеса, отредактировав /etc/spamassassin/local.cf, и использовать cron для обновления ночных правил, то это может привести к ситуации, когда большой объем сообщений об ошибках будет посылаться пользователю amavis через задание cron amavisd-new.

Существует несколько вариантов разрешить эту ситуацию:

  1. Настройте ваш MDA на фильтрацию сообщений, которые вы не желаете видеть.

  2. Измените /usr/sbin/amavisd-new-cronjob на проверку, что use_bayes установлен в 0. Например, отредактируйте /usr/sbin/amavisd-new-cronjob, добавив следующее в начало до строк проверки:

egrep -q "^[ \t]*use_bayes[ \t]*0" /etc/spamassassin/local.cf && exit 0

Проверка

Для начала проверьте, что Amavisd-new SMTP активен:

telnet localhost 10024
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 [127.0.0.1] ESMTP amavisd-new service ready
^]

В заголовке сообщений, которые будут проходить через фильтр содержимого вы должны увидеть следующее:

X-Spam-Level: 
X-Virus-Scanned: Debian amavisd-new at example.com
X-Spam-Status: No, hits=-2.3 tagged_above=-1000.0 required=5.0 tests=AWL, BAYES_00
X-Spam-Level: 
Ваш вариант может отличаться, но важно чтобы присутствовали записи X-Virus-Scanned и X-Spam-Status.

Разрешение проблем

Лучший способ обнаружить, что что-то идет не так - проверить файлы журнала.

1. Для инструкций по журналам Postfix смотрите раздел Разрешение проблем.

2. Amavisd-new использует Syslog для отправки сообщений в /var/log/mail.log. Количество деталей может быть увеличено добавлением опции $log_level в /etc/amavis/conf.d/50-user и установкой значения от 1 до 5.

$log_level = 2;
Когда вывод журнала Amavisd-new увеличивается, то вывод журнала Spamassassin также увеличивается.

3. Уровень журналирования ClamAV может быть увеличен редактированием /etc/clamav/clamd.conf и установкой следующей опции:

LogVerbose true

По уолчанию ClamAV посылает сообщения в журнал /var/log/clamav/clamav.log.

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

Ссылки

Для дополнительной информации обратитесь к следующим ссылкам:

Также не стесняйтесь задавать вопросы в канале IRC #ubuntu-server на freenode.