среда, 15 декабря 2010 г.

Настройка Postfix+MySQL+Dovecot-POP3+Amavis в ubuntu server 10.04

Раздел 8. AMaViS: фильтрация вирусов и спама.

На просторах интернета две извечных проблемы - спам и вирусы. Эти проблемы не обошли и почту. К счастью, бороться с обоими можно при помощи AMaViS (A Mail Virus Scaner). AMaViS - это своего рода интерфейс между Postfix, SpamAssasin (довольно распространенный и надежный спам-фильтр) и, опционально, антивирусом. AMaViS содержит спам-фильтр, но в нем нет встроенного антивируса. Т.е. нам необходимо установить таковой (что мы уже сделали в первом разделе этого мануала). Воспользуемся ClamAV`ом. Очень качественный и бесплатный антивирус с постоянным обновлением вирусных баз.

Конфигурационные файлы AMaViS лежат в /etc/amavis/conf.d. Итак, ClamAV у нас уже установлен и сконфигурирован по умолчанию, осталось только его включить:
#>mcedit /etc/amavis/conf.d/15-content_filter_mode

и раскомментируем строки, начинающиеся с:

@bypass_virus_checks_maps
@bypass_virus_checks_maps

Рассмотрим еще один конфиг /etc/amavis/conf.d/20-debian_defaults. Его непосредственно, лучше не править. Чтоб поправить его настройки - правильнее будет править /etc/amavis/conf.d/50-user и добавим в него:

$sa_spam_subject_tag = '***SPAM***'; 
$QUARANTINEDIR = '/var/vmail/spamvirusmails';
$spam_quarantine_method = 'local:spam-%b-%i-%n';
$spam_quarantine_to = 'spam-quarantine';
$final_spam_destiny = D_DISCARD;
$sa_tag_level_deflt  = undef;
$spam_admin = "root\@$mydomain";
1;  # ensure a defined return 

Возможные параметры:

$sa_spam_subject_tag: если установлен этот параметр - к теме email`а, который AMaViS сочтет спамом, будет добавлена строка "***SPAM***", установленная в этом параметре. Если мы хотим оставить "оригинальную" тему письма, то необходимо оставить этот параметр в виде: "$sa_spam_subject_tag = undef". Служебная инфа о том, что AMaViS пометил письмо "как спам", для пользователя все равно останется в X-Spam-Status заголовке.

$sa_tag_level_deflt: параметр спам-уровня (число). В зависимости от установленного уровня: выше или ниже, в заголовок письма будет добавляться спам-заголовки (т.е., на сколько я понял, в заголовок письма добавятся заголовки о спам проверке, вне зависимости от того, будет ли письмо расценено как спам или нет). Для упрощения отладки, мы всегда будем добавлять эти заголовки, поэтому этот параметр установлен в самый низкий уровень, т.е. "undef".

$sa_tag2_level_deflt: этот параметр спам-уровня отвечает за чувствительность спам-фильтра к определению спама. Лучше оставить его по-умолчанию (или вообще не определять в конфиге), ибо при слишком низком уровне - может проскочить много спама, при слишком высоком уровне - как спам могут быть расценены совершенно безобидные сообщения.

$sa_kill_level_deflt: должен быть установлен в то же значение, что и $sa_tag2_level_deflt

$final_spam_destiny: параметр "судьбы" спама. По-умолчанию = D_BOUNCE (отбросить).
В нашем случае, спам будет помещаться в карантин, т.е. D_DISCARD. Если же установить его в D_PASS - письма проходить будут, и пусть пользователь сам принимает решение о том, что делать со спамом.

Даем AMaViS`у разрешение на писать в карантин:

#> chown amavis:amavis -R /var/vmail/spamvirusmails

Перестартуем AMaViS:

#> /etc/init.d/amavis restart 

Проверяем, чтоб AMaViS слушал 10024 порт:

#> netstat -nap | grep 10024 

Должно быть что то типа:

tcp  0   0 127.0.0.1:10024     0.0.0.0:*    LISTEN   12345/amavisd 

Если получили похожую строку - значит AMaViS запущен и ждет SMTP сессии. В противном случае - смотри логи (/var/log/mail.log)

Теперь, рассмотрим как это работает. Кто то отправляет нам мыло из инета. Postfix его получает через TCP порт 25 (SMTP). Если Postfix пропускает это сообщение - он форвардит его AMaViS`у на TCP порт 10024 (SMTP). Далее, если AMaViS`а устраивает содержимое письма, то форвардит мыло обратно Postfix`у на TCP порт 10025 (SMTP). И после всего этого Postfix уже отправляет мыло до конечного получателя.


Объясняем Postfix`у вышеуказанную модель и укажем еще один важный параметр "receive_override_option", назначение которого рассмотрим позже:

#>postconf -e content_filter=smtp-amavis:[127.0.0.1]:10024
#>postconf -e receive_override_options=no_address_mappings 


Также, необходимо объявить службу smtp-amavis в параметрах /etc/postfix/master.cf. Плюс, указать Postfix`у слушать 10025 порт, для получения писем от AMaViD:

smtp-amavis unix -      -       n     -       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
     -o local_header_rewrite_clients= 

Важно! В данном случае -o mynetworks=127.0.0.0/8 необходимо оставить именно в таком виде, а не указывать mynetworks как /etc/postfix/main.cf. Ибо связка Postfix - AMaViS крутятся на одном сервере и находятся в пределах одной подсети 127.0.0.0/8.


Перезагрузим Postfix:

#> postfix reload 


Дадим некоторые пояснения. Сначала мы установили опцию receive_override_options в значение no_address_mapping, ее мы упоминали выше. Она отключает все сопоставления (mapping) адресов. Для чего это нужно?

Postfix принимает письмо. Правила редиректа (таблица forwardings в MySQL) из-за отключения сопоставления адресов не сработали (не подтверждены). Письмо пересылается в службу smtp-amavis, после чего опять возвращается на 127.0.0.1:10025 уже с кучей параметров. Один из этих параметров как раз опять receive_override_option, но теперь уже без значения no_address_mapping (т.е. теперь сопоставление адресов включено). И уже на этом этапе происходит обработка таблицы forwardings. Т.е. эта опция необходима, что бы не задваивать письма при форвардинге.

Внимание! receive_override_option = no_address_mapping фактически дает директиву Postfix отключить форвардинг. И если впоследствии мы решим отключить AMaViS, то нужно будет убрать и эту опцию!!!


Напомним, что пользователь "clamav" должен быть в группе "amavis", что бы эти службы могли общаться друг сдругом. Добавим его туда:

#>adduser clamav amavis
#>/etc/init.d/clamav-daemon restart 


Отключим спам проверку для нашей (внутри нашего домена) исходящей почты. Для этого в /et/amavis/conf.d/50-user перед "1;" добавим такие строки:

@lookup_sql_dsn = (     ['DBI:mysql:database=mail;host=127.0.0.1;port=3306',
      'mail_admin',
      'mailadminpass']);
$sql_select_policy = 'SELECT domain FROM domains WHERE CONCAT("@",domain) IN (%k)'; 

@lookup_sql_dsn определяет параметры доступа AMaViS кнашей базе данных mail в MySQL. А $sql_select_policy задает SQL запрос, который выполняется когда AMaViS определяет из какого домена идет отсылка и принадлежит ли полученный домен нашему. %k - набор строк, с которыми идет сопоставление. Т.е. полноценный SQL запрос будет выглядеть следующим образом:

SELECT domain FROM domains WHERE CONCAT("@",name)
 IN ( 'john@example.com',
     'john',
     '@example.com',
     '@.example.com',
     '@.com', 
    '@.') 

Выглядит, конечно странно... Но в конечном итоге получим строку '@exemple.com'.

Перегрузим AMaViS:

#>/etc/init.d/amavis restart 


Пробуем отослать мыло на john@exemple.com. Если просмотреть заголовки письма, то мы должны найти строки, добавленные AMaViS:

X-Virus-Scanned: Debian amavisd-new at mymailserver
X-Spam-Score: 0
X-Spam-Level:
X-Spam-Status: No, score=0 tagged_above=-9999 required=6.31 tests=[none] 


На этом настройка завершена! Все входящие письма теперь будут проверяться на вирусы и спам. Выполним еще одну проверку. Пример спама есть в /usr/share/docs/spamassasin/exemples/sample-spam.txt. Отправим спам-сообщение на jhon@exemple.com:

#>sendmail john@example.com < /usr/share/doc/spamassassin/examples/sample-spam.txt 

Смотрим в логи /var/log/mail.log, должны увидеть что AMaViS отработал:

amavis[13001]: (13001-02) Passed SPAM, <...> -> , ... 

Отлично! Письмо помечено как спам и отправлено Jhon`у. И, наконец, устанавливаем необходимые права:

#>chmod o= /etc/amavis/conf.d/50-user

Все! Теперь имеем полнофункциональный почтовый сервер!

Данный мануал является вольным переводом статьи Postfix+MySQL+Dovecot-POP/IMAP+Amavis howto on Debian Lenny by Christoph Haas, адаптированный под UBUNTU 10.04

Жопиздан (с) Job Is Done


5 комментариев:

  1. есть способ намного проще iredmail называется
    об установке почтового сервера – http://www.iredmail.ru/index.php/install
    за 10 минут поднимается рабочий сервак(зависит от скорости интернета)
    http://www.iredmail.ru/

    ОтветитьУдалить
  2. У него есть минус, он не переносит установку рядом с чем-то и ставить на голый сервак, если ты поставишь хоть что-то, то его скрипт установки даст сбой

    ОтветитьУдалить
  3. И еще он во многом стал платным.

    ОтветитьУдалить
  4. Спасибо за статью, особенно за postconf -e receive_override_options=no_address_mappings

    ОтветитьУдалить