Устанавливаем почтовый сервер. Часть третья

Продолжение первой части и второй части установки и настройки корпоративного почтового сервера.

Настройка Amavisd-new и ClamAV

Для начала установим необходимые пакеты

# aptitude install amavisd-new clamav clamav-daemon zoo unzip bzip2 libnet-ph-perl libnet-snpp-perl libnet-telnet-perl nomarch lzop pax

После завершения установки выбранных ранее пакетов, приступаем к настройке Amavisd-New. Откроем в текстовом редакторе конфигурационный файл /etc/amavis/conf.d/15-content_filter_mode и расcкомментируем следующие строки: @bypass_virus_checks_maps и @bypass_spam_checks_maps.

use strict;

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

#
# Default antivirus checking mode
# Please note, that anti-virus checking is DISABLED by
# default.
# If You wish to enable it, please uncomment the following lines:

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

#
# Default SPAM checking mode
# Please note, that anti-spam checking is DISABLED by
# default.
# If You wish to enable it, please uncomment the following lines:

@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
1;  # ensure a defined return

Посмотреть текущие настройки определения спама и какие действия выполняются с обнаруженным спамом можно в файле /etc/amavis/conf.d/20-debian_defaults. Сам этот конфигурационный файл мы трогать не будем, а внесём необходимые изменения в другой конфигурационный файл /etc/amavis/conf.d/50-user. Изначально этот конфигурационный файл пустой.

use strict;

#
# Place your configuration directives here.  They will override those in
# earlier files.
#
# See /usr/share/doc/amavisd-new/ for documentation and examples of
# the directives you can use in this file
#

$pax='pax';
#Считываем таблицу обслуживаемых доменов. Письма адресованные пользователям этих доменов будут проверяться на спам
@lookup_sql_dsn = ( ['DBI:mysql:database=maildbname;host=127.0.0.1;port =3306', 'mailadmin', 'mailadmin_password']);
$sql_select_policy = 'SELECT domain FROM domain';
#Что дописываем в тему спам сообщения
$sa_spam_subject_tag                 = '***SPAM***';
$sa_spam_modifies_subj               = 1;
#Дописывать данные о проверке на спам в заголовок письма всегда
$sa_tag_level_deflt                  = undef;
#Пропускаем спам письма адресату.
$final_spam_destiny                  = D_PASS;
#Пропускаем письма содержащие вирус адресату.
$final_virus_destiny                 = D_PASS;
$final_banned_destiny                = D_PASS;
#Добавляем в тему письма содержащего вирус
$subject_tag_maps_by_ccat{+CC_VIRUS} = [ '***VIRUS*** ' ];
#Таким образом отключим оповещения о вирусах и спаме
$virus_admin                         = undef;
$spam_admin                          = undef;
#------------ Do not modify anything below this line -------------
1;  # ensure a defined return

где

  • maildbname — название базы данных
  • mailadmin — имя пользователя базы данных
  • mailadmin_password — пароль пользователя mailadmin

Добавим пользователя clamav в группу amavis, и перегрузим amavis и clamav.

# addgroup clamav amavis
# invoke-rc.d amavis restart
# invoke-rc.d clamav-daemon restart
# invoke-rc.d clamav-freshclam restart

Чтобы входящая почта передавалась amavis для проверки, необходимо внести изменения в конфигурационный файл /etc/postfix/main.cf. Откроем конфигурационный файл main.cf и добавим пару строчек.

content_filter             = amavis:[127.0.0.1]:10024
receive_override_options   = no_address_mappings

Затем откроем конфигурационный файл /etc/postfix/master.cf и в самый его конец добавим следующий код

amavis unix - - - - 2 smtp
       -o smtp_data_done_timeout=1200
       -o smtp_send_xforward_command=yes
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_client_restrictions=
       -o smtpd_helo_restrictions=
       -o smtpd_sender_restrictions=
       -o smtpd_recipient_restrictions=permit_mynetworks,reject
       -o mynetworks=127.0.0.0/8
       -o strict_rfc821_envelopes=yes
       -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks

Перегружаем Postfix

# invoke-rc.d postfix restart

Проверим работоспособность того, что мы только что настроили, выполнив команду

# netstat -tap

Среди строк вы должны увидеть строки подобные этим

tcp        0      0 localhost:10024         *:*                     LISTEN      1254/amavisd
tcp        0      0 localhost:10025         *:*                     LISTEN      21606/master
tcp        0      0 *:ssmtp                 *:*                     LISTEN      21606/master

Порт 10024 у нас «слушает» amavis, а порты 10025 и 25 «слушает» postfix, что нам и требовалось.

Настройка SpamAssassin

Устанавливаем необходимые пакеты

# aptitude install spamassassin

Приступим к настройке SpamAssassin. Откроем в редакторе конфигурационный файл /etc/spamassassin/local.cf и приведём его к следующему виду

# Указываем какие подсети будут "доверенными", письма с которых не будут считаться спамом
trusted_networks 192.168.0.0/24

# Включаем bayes обучение системы
use_bayes                       1
use_bayes_rules                 1

# Указываем путь до базы bayes
bayes_path                      /var/lib/amavis/.spamassassin/bayes

# SA будет автоматически добавлять сообщения, распознанные как SPAM
# на 100% или на 100% как не SPAM сообщения, в bayes базу данных
bayes_auto_learn 1

# Не отключаем разные сетевые проверки
skip_rbl_checks                 0

# Указываем SA использовать Razor
use_razor2                      1

# Указываем SA не использовать DCC
use_dcc                         0

# Указываем SA не использовать Pyzor
use_pyzor                       0

#Следующие строчки указывают, на каких языках Вам обычно приходят письма. Если
#проверяемое письмо будет на другом языке, то его Spam-Level повысится.
ok_languages                    en ru
ok_locales                      en ru

# Указываем какие заголовки будут игнорироваться
bayes_ignore_header X-Bogosity
bayes_ignore_header X-Spam-Flag
bayes_ignore_header X-Spam-Status

#   Some shortcircuiting, if the plugin is enabled
#
ifplugin Mail::SpamAssassin::Plugin::Shortcircuit
#
#   default: strongly-whitelisted mails are *really* whitelisted now, if the
#   shortcircuiting plugin is active, causing early exit to save CPU load.
#   Uncomment to turn this on
#
# shortcircuit USER_IN_WHITELIST       on
# shortcircuit USER_IN_DEF_WHITELIST   on
# shortcircuit USER_IN_ALL_SPAM_TO     on
# shortcircuit SUBJECT_IN_WHITELIST    on

#   the opposite; blacklisted mails can also save CPU
#
# shortcircuit USER_IN_BLACKLIST       on
# shortcircuit USER_IN_BLACKLIST_TO    on
# shortcircuit SUBJECT_IN_BLACKLIST    on

#   if you have taken the time to correctly specify your "trusted_networks",
#   this is another good way to save CPU
#
# shortcircuit ALL_TRUSTED             on

#   and a well-trained bayes DB can save running rules, too
#
# shortcircuit BAYES_99                spam
# shortcircuit BAYES_00                ham
endif # Mail::SpamAssassin::Plugin::Shortcircuit

Чтобы внесённые изменения вступили в силу, перегрузим amavis

# invoke-rc.d amavis restart

Настройка Razor

Устанавливаем необходимые пакеты

# aptitude install razor

Создадим конфигурацию по умолчанию

# razor-admin -create

Необходимые конфигурационные файлы будут созданы в домашнем каталоге текущего пользователя ~/.razor. Регистрируемся на серверах razor

# razor-admin -register -user=user -pass=pass

Настройка Postgrey

Postgrey — средство для борьбы со спамом, использует механизм серых списков (grey listing). Принцип его работы — временный отказ в принятии почты в надежде, что спамеры не будут повторять отправку. Не очень хороший способ, поскольку замедляет доставку почты и увеличивает трафик самого Интернета, так как почтовые сервера вынуждены отправлять одно сообщение несколько раз, но трафик от провайдера уменьшиться на величину объёма отказанных писем. Пока этот способ довольно действенен.

В общих словах: если клиент подключается в первый раз (его нет в белых списках доменов и отправителей и в списке клиентов за последние 24 часа), то ему предлагают прийти попозже (выдается временная ошибка), через 5 минут к примеру. По стандарту, клиент обязан попробовать доставить письмо ещё раз. Спамеры обычно этим не заморачиваются, поэтому грейлистинг очень эффективен. Минус этого подхода в том, что первое письмо от каждого конкретного отправителя может задерживаться на неопределённый срок (обычно 5-30 минут, в зависимости от настроек клиента), но бывает и дольше (редко, обычно это криво настроенные сервера). После того как клиент проходит проверку, адрес отправителя добавляется в белый список чтобы избежать задержки в дальнейшем. Когда набирается достаточное количество проверенных отправителей из одного домена, он целиком добавляется в белый список.

Использовать postgrey или нет, решайте сами. У меня стоит, жалобы на долгое получение писем от клиентов бывают, но очень редко.

Устанавливаем необходимые пакеты.

# aptitude install postgrey

Переходим к настройке postgrey. Откроем в любимом текстовом редакторе файл /etc/postfix/main.cf и в секцию smtpd_recipient_restrictions добавим строку check_policy_service inet:127.0.0.1:10023.

smtpd_recipient_restrictions = hash:/etc/postfix/config/access,
                               reject_unknown_sender_domain,
                               reject_unknown_recipient_domain,
                               reject_unauth_pipelining,
                               permit_mynetworks,
                               permit_sasl_authenticated,
                               reject_unauth_destination,
                               reject_multi_recipient_bounce,
							   check_policy_service inet:127.0.0.1:10023,
                               permit

Чтобы «честные» письма клиентов приходили без проверки, откроем файл /etc/postgrey/whitelist_clients и добавим туда необходимые домены. В этом файле уже содержится приличный список доменов, поэтому добавить по аналогии не составит большого труда. В этот белый список я добавил не всех клиентов вообще, а только тех с которыми идёт постоянная переписка.

В файле /etc/postgrey/whitelist_recipient содержится список почтовых ящиков локальных пользователей, письма которым не будут обрабатываться postgrey. У меня таковых не имеется, поэтому данный файл я никогда не открывал. После внесения всех необходимых изменений, перегружаем postgrey и postfix.

# invoke-rc.d postgrey restart
# invoke-rc.d postfix restart

Настройка Roundcube

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

# aptitude install roundcube roundcube-mysql roundcube-plugins roundcube-plugins-extra

В репозитории присутствуют не все плагины, поэтому список доступных для roundcube плагинов можно найти на это странице http://trac.roundcube.net/wiki/Plugin_Repository и подобрать что-нибудь нужное для себя.

Во время установки будет задан вопрос: «Создавать ли базу данных для roundcube?» Отвечаем утвердительно, выберем базу данных и укажем пароль пользователя root и зададим пароль для пользователя roundcube, который автоматически создаётся при установке.

Доступ к веб-интерфейсу у нас будет осуществляться через https, поэтому проведём кое-какие настройки веб-сервера Apache.

# mv /etc/apache2/conf.d/roundcube /etc/apache2/sites-available/
# a2ensite roundcube
# a2enmod ssl

Откроем в редакторе конфигурационный файд /etc/apache2/sites-available/roundcube и приведём его к такому виду.

<VirtualHost _default_:443>
    ServerName mail.yourdomain.com
    DocumentRoot /var/www

    Alias /roundcube/program/js/tiny_mce/ /usr/share/tinymce/www/
    Alias /roundcube /var/lib/roundcube

    # Access to tinymce files
    <Directory "/usr/share/tinymce/www/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    <Directory /var/lib/roundcube/>
        Options +FollowSymLinks
        # This is needed to parse /var/lib/roundcube/.htaccess. See its
        # content before setting AllowOverride to None.
        AllowOverride All
        order allow,deny
        allow from all
    </Directory>

    # Protecting basic directories:
    <Directory /var/lib/roundcube/config>
        Options -FollowSymLinks
        AllowOverride None
    </Directory>

    <Directory /var/lib/roundcube/temp>
        Options -FollowSymLinks
        AllowOverride None
        Order allow,deny
        Deny from all
    </Directory>

    <Directory /var/lib/roundcube/logs>
        Options -FollowSymLinks
        AllowOverride None
        Order allow,deny
        Deny from all
    </Directory>
    SSLEngine on
    SSLCertificateFile    /etc/ssl/certs/mydovecot.pem
    SSLCertificateKeyFile /etc/ssl/private/mail.yourdomain.com.key
</VirtualHost>

Настроим перенаправление с корня сайта, для этого откроем в редакторе конфигурационный файл /etc/apache2/sites-enabled/default и добавим следующие строки в начало файла после

ServerAdmin webmaster@yourdomain.com
        ServerName mail.yourdomain.com
        DocumentRoot /var/www
        RewriteEngine   on
        RewriteRule ^(.*)$ https://mail.yourdomain.com/roundcube

Теперь откроем в редакторе конфигурационный файл /etc/roundcube/main.inc.php. Изменим только некоторые параметры

<?php
…
$rcmail_config['default_host'] = 'ssl://%n';
…
$rcmail_config['smtp_server'] = '%n';
…
$rcmail_config['force_https'] = true;
…
$rcmail_config['username_domain'] = '%d';
…
$rcmail_config['mail_domain'] = '%n';
…
$rcmail_config['create_default_folders'] = true;
…
$rcmail_config['skip_deleted'] = true;
…
# Если вы будет использовать какие-либо плагины, не забудьте поправить этот параметр
$rcmail_config['plugins'] = array('managesieve', 'password');
…
?>

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

После всех этих настроек осталось только перегрузить Apache

# invoke-rc.d apache2 restart

Для проверки работоспособности нашего веб-интерфейса к нашему почтовому серверу откроем в бразуере веб-интерфейс почты, набрав адрес https://mail.yourdomain.com/roundcube или http://mail.yourdomain.com. Должна загрузиться страница с приглашением ввести логин и пароль. На этом можно и закончить настройку почтового сервера, т.к. всё необходимое для его работы мы сделали. Осталось только завести пользователей и раздать своим сотрудникам необходимые данные и пояснения. Но… Нам же хочется иметь хоть какую-нибудь статическую информацию о загрузке нашего сервера и т.п., поэтому продолжаем.

Установка Mailgraph

Для начала устанавливаем необходимый пакет.

# aptitude install mailgraph

Ничего настраивать не надо, и можно сразу перейти по адресу https://mail.yourdomain.com/cgi-bin/mailgraph.cgi для просмотра графиков работы вашего почтового сервера.

Настройка AwStats

Устанавливаем необходимый пакет

# aptitude install awstats

Открываем в редакторе конфигурационный файл /etc/awstats/awstats.postfix.conf и приводим его к такому виду

LogFile                         = "perl /usr/share/doc/awstats/examples/maillogconvert.pl standard < /var/log/mail.log |"
LogType                         = M
LogFormat                       = "%time2 %email %email_r %host %host_r %method %url %code %bytesd"
SiteDomain                      = "mail.yourdomain.com"
HostAliases                     = "127.0.0.1 localhost REGEX[mail\.yourdomain\.com$]"
DirData                         = "/home/awstats
DirCgi                          = "/awstats"
DirIcons                        = "/awstatsicons"
AllowFullYearView               = 3
AllowToUpdateStatsFromBrowser   = 0

LevelForBrowsersDetection       = 0
LevelForOSDetection             = 0
LevelForRefererAnalyze          = 0
LevelForRobotsDetection         = 0
LevelForWormsDetection          = 0
LevelForSearchEnginesDetection  = 0
LevelForFileTypesDetection      = 0

UseFramesWhenCGI                = 1
ShowSummary                     = HB
ShowMonthStats                  = HB
ShowDaysOfMonthStats            = HB
ShowDaysOfWeekStats             = HB
ShowHoursStats                  = HB
ShowDomainsStats                = 1
ShowHostsStats                  = HBL
ShowAuthenticatedUsers          = 0
ShowRobotsStats                 = 0
ShowEMailSenders                = HBML
ShowEMailReceivers              = HBML
ShowSessionsStats               = 0
ShowPagesStats                  = 0
ShowFileTypesStats              = 0
ShowFileSizesStats              = 0
ShowBrowsersStats               = 0
ShowOSStats                     = 0
ShowOriginStats                 = 0
ShowKeyphrasesStats             = 0
ShowKeywordsStats               = 0
ShowMiscStats                   = 0
ShowHTTPErrorsStats             = 0
ShowSMTPErrorsStats             = 1
LoadPlugin                      = "decodeutfkeys"

Настраиваем ежечасное автоматическое обновление данных

# echo "55  * * * * root     /usr/lib/cgi-bin/awstats.pl -config=postfix -update > /dev/null" >> /etc/cron.d/awstats

Отредактируем настройки нашего виртуального хоста mail.yourdomain.com, открыв конфигурационный файл /etc/apache2/sites-enabled/roundcube. Добавим в него следующее содержимое

Alias /awstatsicons /usr/share/awstats/icon
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
</Directory>

Для отображения иконок сделаем символическую ссылку

# ln -s /usr/share/awstats/icon/ /var/www/awstatsicons

Создадим каталог, где awstats будет хранить свои данные (каталог, который вы указали в конфигурационном файле /etc/awstats/awstats.postfix.conf), и выставим необходимые права доступа.

# mkdir /home/awstats
# chown www-data:www-data /home/awstats

Посмотреть статистику теперь можно по адресу https://mail.yourdomain.com/cgi-bin/awstats.pl?config=postfix.

На этом собственно вся установка и настройка почтового сервера завершена.

P.S. Да я в курсе, что есть готовые сборки и прочее прочее прочее. Ну во-первых, я не любитель комбайнов «всё в одном». Во-вторых, такие комбайны чаще всего используют какой-то свой внутренний язык/синтаксис (типа Зимбры) для управления, который надо изучать по документации или каким-то факам, а оно мне надо… В-третьих, установив такой комбайн вы не поймёте сути работы.

Устанавливаем почтовый сервер. Часть третья: 6 комментариев

  1. 1. SpamAssassin очень медленный. Если нагрузка сколько нибудь высокая, то стоит посмотреть на rspamd - он сложнее в настройке, но в десятки раз быстрее.

    2. awstats на сколько нибудь больших логаз выжирает всю память и загоняет машину в swap. Что вместо него сходу не подскажу. А ещё он написан в ужасном стиле - спагетти из код и html, циклы на несколько страниц и т. п.

    3. У подключения чего либо к postfix через content_filter есть нескольку существенных недостатков:

    — если контент фильтр упадёт почта ходить не будет, нельзя настроить так, чтобы ходила без проверки

    — не совместимо с большими нагрузками

    — если использовать after queue filter то сервер превращается в генератор баунсов, за что заслуженно попадает в блэклисты

    Всех этих недостатков лишён способ подключения фильтров через milter, благо мильтеров написано разных много. Чтобы не плодить кучу мильтров для многих почтовых серверов хватит одного — rmilter.

    Хотя 10 лет назад написанное тут было актуально: posfix тогда не умел miter-ы, а rspamd/rmilter ещё не были написаны.

  2. Спасибо за дельный комментарий.

    1) Ну меня пока устраивает его работа. У меня не такая высокая нагрузка, чтобы придумывать что-то ещё. Всего человек 70.

    2) Вот том-то и дело, что я тоже пока не знаю альтернативы.

    3) Возможно с miter'ами и лучше, но у меня не такая высокая нагрузка на сервер, настроен он был хрен знает когда.

    Работает и ладно. А вот за miter'ы спасибо. Почитаю на досуге, когда с сайтом фирмы завершу.

  3. Все классно и главное понятно.

    Одно не нашел!!! Как проверить работу amovis?

    Он у меня в логе вроде пишет что нашел вирус в rar архиве, и даже письмо в карантин, КОПИЮ поместил! Но в тот же момент пропустил сообщение с вирусом адресату!?

    Я так понимаю что еще где-то настройки есть удалять данные сообщения.

  4. 2Виталий

    Смотреть логи. Вот честно скажу, мне на почту уже давно писем с вирусами не приходят, только ссылки на скрипты, которые закачивают вирусню на комп жертвы.

  5. приветствую.

    решил попробовать втою схему и вроде как на разные ящики письма отправляет, через веб морду postfixadmin, в логах пишет

    Sep 12 13:44:31 debian postfix/cleanup[1043]: warning: proxy:mysql:/etc/postfix/

    sql/mysql_virtual_alias_maps.cf lookup error for «root@yourmail.domain.com»

    Sep 12 13:44:31 debian postfix/cleanup[1043]: warning: AA3C4822691: virtual_alia

    s_maps map lookup problem for root@yourmail.domain.com — message not accepted,

    try again later

    Sep 12 13:45:31 debian postfix/cleanup[1043]: warning: proxy:mysql:/etc/postfix/

    sql/mysql_virtual_alias_maps.cf lookup error for «root@yourmail.domain.com»

    Sep 12 13:45:31 debian postfix/cleanup[1043]: warning: B4E67822691: virtual_alia

    s_maps map lookup problem for root@yourmail.domain.com — message not accepted,

    try again later

    хотя все права задал да и впринципе все как ты описывал делал.

    как я понял отправлять он отправляет но принять не может...

    и в алиасах ты ничего не прописываешь?

    1. Естественно не может, т.к. «@yourmail.domain.com» надо поменять на свой домен. Если делаешь на какой-то тестовой машине, то либо поднимать свой ДНС-сервер, чтобы было всё по феншую, либо правильно сделать записи в /etc/hosts.

Обсуждение закрыто.