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

HELP-ME-24.COM (Freelance Team), Черноусов Антон

В предыдущей статье "Создание корпоративного почтового сервера (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, спам-фильтров и некоторых других аспектов безопасности почтового сервера.

 

Оставьте комментарий

Вы должны быть вошедший в чтобы отправить комментарий