Корпоративный почтовый сервер часть вторая (Интеграция Postfix и Dovecot)

    Общий рейтинг статьи: 0 (проголосовало 0 )
    Опубликовано:  [просмотров 1187]


    В предыдущей статье "Создание корпоративного почтового сервера (IMAP-сервер Dovecot)" мы настроили почтовый сервер Dovecot интегрировав его с базой данных MySQL хранящий учетные данные пользователей. В таком режиме к нашему почтовому серверу можно подключиться при помощи клиента Thunderbird и использовать весь функционал IMAP-сервера.

    Принимать и отправлять почту вы естественно не сможете. За получение и отправку почты отвечает MTA (Message transfer agent). Существует довольно много разнообразных MTA, выполняющих в принципе идентичный функционал, но самыми популярными являются Exim и Postfix и хотя мы можем взять на поддержку любой почтовый сервер, предпочтение для новых серверов отдается Postfix. Соответственно и сегодня в нашей статье мы будем рассматривать интеграцию Postfix и Dovecot.

    Большой логотип Postfix

    В типовую поставку Ubuntu Server обычно входит предустановленный Postfix в минимальной конфигурации, но он нам не подходит и мы установим Postfix собранный с поддержкой базы данных Mysql.

    Для этого выполните следующую команду:

    # aptitude install postfix-mysql

    В процессе установки postfix будет запущен мастер который предложит вам сконфигурировать MTA-Postfix. Вы можете отказаться от настройки или ввести любые сведения, так как мы полностью перепишем конфигурационный файл с нуля.

    Основными конфигурационными файлами Postfix являются:

    • /etc/postfix/main.cf
    • /etc/postfix/master.cf

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

    smtpd_banner = mail.help-me-24.com (Mail server for help-me-24.com Domain)
    biff = no
    append_dot_mydomain = no
    readme_directory = no
    smtpd_use_tls=no
    smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
    myhostname = mail.help-me-24.com
    alias_maps = hash:/etc/aliases
    alias_database = hash:/etc/aliases
    mydestination = mail.help-me-24.com
    relayhost =
    mynetworks = 127.0.0.0/8
    mailbox_command =
    mailbox_size_limit = 0
    recipient_delimiter = +
    inet_interfaces = loopback-only
    default_transport = smtp
    relay_transport = smtp
    inet_protocols = ipv4

    Нам необходимо модифицировать конфигурационный файл таким образом, чтобы:

    • Почта доставлялась в локальные ящики пользователей по протоколу LMTP.
    • Существование запрашиваемого ящика проверялось согласно базы данных алиасов
    • Пересылка почты на другие домены (relay) осуществлялась только для авторизованных пользователей
    • Выполнялась проверка разрешений на использование Relay (опциональные ограничения для внутренних пользователей web-портала)

    Пойдем по всем пунктам по порядку и соответственно начнем с доставки почты в почтовые ящики пользователей почтового сервера. Для обработки доставки почты необходимо получать три типа сведений:

    • Почтовые ящики
    • Алиасы
    • Домены обслуживаемые почтовым сервером

    Последний пункт имеет отношение скорее к отправке сообщений пользователем, так как при помощи данных о локально обслуживаемых доменах определяется имеет ли место попытка Relay или же это локальная доставка почты.

    Конфигурируем внешние источники данных для Postfix (запросы к MySQL)

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

    alias_database = hash:/etc/aliases

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

    Запрос алиасов (/etc/postfix/db-aliases.cf):

    user=mail
    password=xxxPasswordxxx
    dbname=hm24_mail
    table=mail_alias
    select_field=user_mail
    where_field=alias
    hosts=127.0.0.1

    Проверить работоспособность запроса можно командой:

    # postmap -q freelance@help-me-24.com mysql:/etc/postfix/db-aliases.cf

    В результате запроса вы получите пользователя за которым закреплен алиас.

    Запрос пользователей (/etc/postfix/db-boxes.cf):

    user=mail
    password=xxxPasswordxxx
    dbname=hm24_mail
    table=mail_auth
    select_field=user
    where_field=user
    hosts=127.0.0.1

    Проверка аналогична запросу алиаса, но теперь проверяем существует ли пользователь:

    # postmap -q chernousov@help-me-24.com mysql:/etc/postfix/db-boxes.cf

    Запрос локальных доменов (/etc/postfix/db-domains.cf):

    Как вы наверное обратили внимание синтаксис конфигурационного файла запроса довольно ограниченный и для реализации сложных запросов он не подойдет. Мы, для того чтобы не городить дополнительную таблицу под домены, используем представление (view) базы данных:

    CREATE
        ALGORITHM = UNDEFINED
        DEFINER = `mail`@`localhost`
        SQL SECURITY DEFINER
    VIEW `domain_view` AS
        SELECT
            SUBSTRING_INDEX(`mail_alias`.`alias`, '@', -(1)) AS `domain`
        FROM
            `mail_alias`
        GROUP BY `domain`;

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

    user=mail
    password=xxxPasswordxxx
    dbname=hm24_mail
    table=mail_auth
    select_field=user
    where_field=user
    hosts=127.0.0.1

    Аналогично представленным выше запросам выполните проверку на существование домена:

    # postmap -q help-me-24.com mysql:/etc/postfix/db-domains.cf

    С источниками данных разобрались и теперь мы можем настроить сохранение входящей почты в локальные mail-box'ы пользователей. Но как вы знаете из прошлого обзора пользователи почтового сервера у нас виртуальные и никакого отношения к пользователям системы не имеют.

    Настройка доставки почты с использованием протокола LMTP

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

    # aptitude install dovecot-lmtpd

    Для активации плагина внесите следующие изменения в файл /etc/dovecot/conf.d/10-master.conf:

    service lmtp {
     inet_listener lmtp {
        address = 127.0.0.1
        port = 24
     }
    }

    Одной из неочевидных особенностей работы LMTP-демона является, то что вам потребуется указать параметр postmaster_address в файле /etc/dovecot/conf.d/15-lda.conf:

    postmaster_address = postmaster@domain.com

    После перезагрузки службы Dovecot проверьте, что сервер принимает подключения к 24-ому порту. 

    Авторизация клиентов Postfix

    Финальным этапом подготовки инфраструктуры перед настройкой самого MTA-Postfix является авторизация клиентов использующих MTA-Postfix для пересылки почты на другие домены (собственно Relay).

    В случае построения связки Posfix -> Dovecot имеется встроенный механизм Dovecot-Auth. Для реализации smtp-авторизации на Postfix сервере лучше всего использовать именно этот механизм. Для настройки postfix-auth внесите следующие изменения в файл 10-master.conf (конфигурация Dovecot).

    service auth {
     unix_listener auth-userdb {
     }
     unix_listener /var/spool/postfix/var/run/auth {
        mode = 0666
        user = postfix
        group = postfix
     }
    }

    Обратите внимание, что для авторизации unix-сокет и для корректной работы необходимо настроить доступ к этому сокету для пользователя и группы postfix. Также postfix запускается в chroot и расположение socket-файла должно быть относительно каталога /var/spool/postfix/.

    Недостающие каталоги, естественно, потребуется создать:

    # mkdir -p /var/spool/postfix/var/run/
    # chown postfix /var/spool/postfix/var/run/

    После перезагрузки сервиса Dovecot проверьте, что сокет авторизации создан.

    # ls -lua /var/spool/postfix/var/run/

    Настройка Postfix

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

    Доставка почты до локальных пользователей почтового сервера

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

    alias_maps = proxy:mysql:/etc/postfix/db-aliases.cf
    local_recipient_maps = proxy:mysql:/etc/postfix/db-boxes.cf $alias_maps
    mydestination = proxy:mysql:/etc/postfix/db-domains.cf

    Настраиваем доставку почты до виртуальных почтовых ящиков с использоватение протокола LMTP:

    mailbox_transport = lmtp:inet:127.0.0.1:24

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

    # aptitude install heirloom-mailx

    Для проверки доставки почты пользователям почтового сервера выполните в консоли следующую команду:

    # echo "TEST" | mailx  -S smtp=127.0.0.1 -r test@help-me-24.com -s "TEST Message" \
    -v "chernousov@help-me-24.com"

    Сообщение должно быть доставлено в mail-box виртуального пользователя и убедиться, что почта доставлена можно подключившись к IMAP-серверу при помощи почтового клиента Thunderbird.

    Лог почтового сервера собирается в файле /var/log/mail.log и анализ лог файла позволяет выявлять ошибки в работе почтового сервера. Например, записи о тестовой отправке выглядят следующим образом:

    Apr  5 13:57:44 mail dovecot: lmtp(1376): Connect from 127.0.0.1
    Apr  5 13:57:44 mail dovecot: lmtp(1376, chernousov@help-me-24.com): 5xNAD2iV5FhgBQAA+x5K7A:
    msgid=<58e49567.tepakSGwWkfOSMqR%test@help-me-24.com>: saved mail to INBOX
    Apr  5 13:57:44 mail postfix/lmtp[1375]: DFA503D034FE: to=<chernousov@help-me-24.com>,
    relay=127.0.0.1[127.0.0.1]:24, delay=0.82, delays=0.18/0.08/0.14/0.42, dsn=2.0.0,
    status=sent (250 2.0.0 <chernousov@help-me-24.com> 5xNAD2iV5FhgBQAA+x5K7A Saved)
    Apr  5 13:57:44 mail dovecot: lmtp(1376): Disconnect from 127.0.0.1: Successful quit
    Apr  5 13:57:44 mail postfix/qmgr[907]: DFA503D034FE: removed

    Отправка почты пользователями

    Будем надеяться, что вы понимаете принципы отправки/получения почты почтовым сервером и совсем в детали мы вдаваться не будем отметим только то, что при пересылке корреспонденции доменам не обслуживаемым почтовым сервером в обязательном порядке необходимо запрашивать авторизацию пользователя. В противном случае ваш сервер превратиться в open-relay и через него спамеры будут отправлять миллионы писем. В дальнейшем выйти из спам-листов будет довольно проблематично.

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

    Для ограничения relay-операций внесите в конфигурационный файл следующие изменения:

    smtpd_recipient_restrictions = permit_sasl_authenticated, reject_invalid_helo_hostname,
    reject_rbl_client sbl-xbl.spamhaus.org,reject_rbl_client postmaster.rfc-ignorant.org,
    reject_unauth_destination
    smtpd_relay_restrictions = permit_sasl_authenticated reject_unauth_destination

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

    # echo "TEST" | mailx  -S smtp=127.0.0.1 -r test@help-me-24.com -s \
    "TEST Message" -v "nl12345@mail.ru"

    В последнем случае вы получите сообщение:

    smtp-server: 554 5.7.1 <nl12345@mail.ru>: Relay access denied

    Соответственно теперь вы можете прописывать MX-записи обслуживаемого домена и открывать 25-ый порт для отправки и получения почты. Обратите внимание, что сейчас наш сервер толком не защищен и в следующей статье мы рассмотрим настройку TLS, спам-фильтров и некоторых других аспектов безопасности почтового сервера.

     


    Обсуждение статьи

    Ваш комментарий: