Связка Postfix и Dovecot

Связка Postfix и DovecotВ контексте данной статьи связка Postfix и Dovecot подразумевает использование Postfix как агента пересылки почты (MTA), Dovecot как агента локальной доставки (LDA), а также реализацию Dovecot SASL вместо Cyrus SASL для авторизации пользователей.


Найти больше информации о Postfix вы можете в основной статье по его настройке — Настройка Postfix.


Связка Postfix и Dovecot — LDA

Я подразумеваю, что Dovecot у вас уже установлен, но если нет, то выполните команду:

apt-get install dovecot-core

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

Стоит отметить, что задать необходимые настройки Dovecot вы можете в одном конфигурационном файле dovecot.conf, а не растаскивать их по конфигам в директории /etc/dovecot/conf.d/. На мой взгляд вариант со всеми настройками в одном файле выглядит гораздо более удобным и простым.

Postfix — main.cf

Dovecot может выполнять роль LDA как для локальных пользователей системы, так и для виртуальных (см. документацию 1). Вариант с виртуальными пользователями для меня более предпочтителен и его реализацией для Postfix я занимался в предыдущих статьях (Виртуальные почтовые ящики Postfix), а теперь пришло время организовать для этой схемы агента локальной доставки, которым и будет Dovecot.

Открываем основной конфиг и добавляем туда параметры:

nano /etc/postfix/main.cf

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

virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

Итак, ключевыми параметрами, влияющими на связку Dovecot-lda+Postfix, являются:

  • virtual_transport — транспорт, используемый Postfix для конечной доставки сообщений. Параметр используется вместе с virtual_mailbox_domains;
  • dovecot_destination_recipient_limit — максимальное количество получателей для каждого сообщения, отправленное Dovecot’у. При работе с виртуальными пользователями требуется установка значения в 1, иначе получите в логах ошибку warning: pipe flag ‘D’ requires dovecot_destination_recipient_limit = 1. Ограничение не означает, что вам придется каждому виртуальному пользователю отправлять одно и то же сообщение персонально, просто на этапе обработки оно будет разбиваться и отправляться каждому пользователю отдельно.

Напоминаю, что настройку виртуальных доменов я выполнил в предыдущей статье (Настройка связки Postfix PostfixAdmin). Сохраняем изменения и закрываем main.cf.

Postfix — master.cf

Дальше нужно сообщить Postfix кому передавать почтовые данные и с какими параметрами. В нашем случае это будет разумеется Dovecot. Сделать это можно через файл master.cf, добавив соответствующие записи. Для начала забэкапим файл:

cp /etc/postfix/master.cf /etc/postfix/master.cf.orig

Открываем для редактирования:

nano /etc/postfix/master.cf

Добавляем строчки (перед второй строкой нужно два пробела):

dovecot unix - n n - - pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${recipient}

Комментарии к строчкам. Первая:

  • dovecot — имя сервиса;
  • unix — тип сервиса (unix — доступный только для локального доступа unix-сокет. Доступны и другие, см. документацию);
  • — — пропускаем ограничение доступа;
  • n — Непривелегированный выставляем в n, поскольку pipe должен выполняться в привилегированном режиме;
  • n — Ставим n для выполнения в изолированной среде (так нужно для демона pipe);
  • — — пропускаем режим автоматического пробуждения;
  • — — пропускаем ограничение количества процессов;
  • pipe — имя демона.

Более подробную информацию см. в выводе команды man 5 master или в документации 2.

Следующая строчка:

  • flags=DRhu — устанавливает флаги;
  • user=vmail:vmail — задаем пользователя и группу, с правами которого будет выполняться процесс;
  • argv=/usr/lib/dovecot/dovecot-lda — процесс, которому должны передаваться данные;
  • — -f и -d — это параметры Dovecot, которые отвечают за адрес отправителя и адрес получателя соответственно (см. в документации 3), ну а ${sender} и ${recipient} — переменные Postfix (в них передаются адреса отправителя и получателя, как в этом можно убедиться из документации 4 pipe).

Последняя задача с Postfix — загрузка новой конфигурации:

postfix reload

Следующие изменения нужно выполнить уже в конфигах Dovecot.

Dovecot — 10-master.conf

Укажем для прослушивания сокет auth-userdb через директиву auth, чтобы Dovecot знал где искать почтовые ящики пользователей. Для этого открываем файл, предварительно его забэкапив:

cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.orig
nano /etc/dovecot/conf.d/10-master.conf

Изменяем:

service auth {
 unix_listener auth-userdb {
 mode = 0600
 user = vmail
 group = vmail
 }
}

Сокет (unix_listener auth-userdb) установлен по умолчанию, нам остается лишь указать режим (mode) и пользователя (user) с группой (group). Напоминаю, что пользователя я создавал в одной из предыдущих статей (Виртуальные почтовые ящики Postfix). Закрываем файл, сохранив изменения.

Dovecot — 10-mail.conf

Поскольку у меня все почтовые данные сохраняются под одним пользователем, в моем случае логично задать статические uid и gid. Делается это в файле 10-mail.conf. Открываем его для редактирования (сначала как всегда бэкап):

cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.orig
nano /etc/dovecot/conf.d/10-mail.conf

Устанавливаем параметры:

mail_location = maildir:/var/vmail/%d/%n
mail_uid = 5000
mail_gid = 5000
mail_privileged_group = vmail
first_valid_uid = 5000
last_valid_uid = 5000

Комментарии наверно излишни, но все же:

  • mail_location — расположение и формат хранения почтовых данных;
  • mail_uid и mail_gid — идентификаторы пользователя и группы;
  • mail_privileged_group — сообщает Dovecot группу, под которой необходимо выполнять блокировку почтовых ящиков. Указать это значение необходимо для предотвращения вечной блокировки, когда одни и те же данные используются разными приложениями, подробнее в документации 5.
  • first_valid_uid и last_valid_uid — диапазон идентификаторов пользователей, под которыми могут сохраняться данные. У меня используются скорее для надежности и в принципе могут быть пропущены.

Перезапускаем Dovecot:

service dovecot restart

На этом настройка Dovecot как LDA в связке с Postfix завершена.

Связка Postfix и Dovecot — SASL

В ранних версиях Postfix (до 2.3) допускалось использование для аутентификации 6 только библиотеки Cyrus SASL. На данный момент доступен также Dovecot SASL 7. Чтобы проверить совместимость, выполните команду:

postconf -a
cyrus
dovecot

Процесс настройки Dovecot SASL значительно проще и доступнее, им и займемся, начав с настроек Postfix.

Postfix — main.cf

Postfix нужно явно указать, чтобы он использовал Dovecot SASL (ведь по умолчанию он использует Cyrus SASL)а также настроить некоторые другие параметры.

Открываем main.cf для редактирования:

nano /etc/postfix/main.cf

Добавляем:

smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous, noplaintext
smtpd_sasl_tls_security_options = noanonymous
smtpd_tls_auth_only = yes

Пояснения:

  • smtpd_sasl_auth_enable — использование SASL;
  • smtpd_sasl_type — реализация SASL, по умолчанию Cyrus;
  • smtpd_sasl_path — указывает путь до сокета (путь очереди Postfix + smtpd_sasl_path, реальный путь будет /var/spool/postfix/private/auth);
  • broken_sasl_auth_clients — допускает к авторизации нестандартные типы клиентов, опция не влияет на работоспособность других клиентов и при отсутствии явной необходимости может быть отключена;
  • smtpd_sasl_security_options — по умолчанию имеет значение noanonymous, но вот что на этот счет говорят разработчики:

Always set at least the noanonymous option. Otherwise, the Postfix SMTP server can give strangers the same authorization as a properly-authenticated client.

Поэтому указываем значение noanonymous в явном виде, а также noplaintext. Опция запрещает использовать механизмы аутентификации, пересылающие пароль в незашифрованном виде.

  • smtpd_sasl_tls_security_options — опция используется в дополнение к вышестоящей. Вопреки ей, она разрешает отправку пароля в незашифрованном виде, но только поверх сеанса TLS. Этот вариант меня полностью устраивает;
  • smtpd_tls_auth_only — позволяет использовать SASL только поверх TLS.

Сохраняем изменения, закрываем main.cf.

Dovecot — 10-master.conf

Первым делом нужно указать путь до сокета, а также пользователя и группу, под которыми будет выполняться процесс. Сделать это нужно в конфигурационном файле 10-master.conf, который мы редактировали ранее в этой статье. Поскольку его бэкап уже сделан, сразу открываем для редактирования:

nano /etc/dovecot/conf.d/10-master.conf

Добавляем в директиву auth вот такие параметры:

unix_listener /var/spool/postfix/private/auth {
 mode = 0660
 user = postfix
 group = postfix
 }

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

service auth {
 unix_listener auth-userdb {
 mode = 0600
 user = vmail
 group = vmail
 }
 unix_listener /var/spool/postfix/private/auth {
 mode = 0660
 user=postfix
 group=postfix
 }
}

Сохраняем изменения, закрываем файл. Напоминаю, что аналогичные действия для любого конфига в conf.d/ вы можете проделать в файле dovecot.conf, чтобы держать всю конфигурацию в одном единственном файле.

Dovecot — 10-auth.conf

Следующий этап — установить механизмы проверки подлинности. Откроем для редактирования конфиг:

cp nano /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.orig
nano /etc/dovecot/conf.d/10-auth.conf

В конфиге необходимо задать механизм аутентификации:

disable_plaintext_auth = yes
auth_mechanisms = plain login cram-md5

Из названия параметров в принципе должно быть понятно их назначение:

  • disable_plaintext_auth — отключение аутентификации простым текстом без ssl/tls;
  • auth_mechanisms — механизмы аутентификации 8. устанавливаем plain (именно! Этот тип — простой текст. Поскольку аутентификация будет происходить поверх ssl/tls, об этом не стоит беспокоиться), login необходим для аутентификации клиентов Microsoft, в cram-md5 хранится хэш пароля в базе данных Postfixadmin (параметр $CONF[‘encrypt’] = ‘dovecot:CRAM-MD5’;, его я настраивал в статье Настройка связки Postfix PostfixAdmin), удобно использовать и этот тип в том числе.

Сохраняем изменения, закрываем файл.

Теперь пришло время рассказать Dovecot откуда ему брать учетные данные виртуальных пользователей для проверки. У меня вся информация о пользователях, доменах и алиасах хранится в отдельной базе данных MySQL, которую создал Postfixadmin (Настройка связки Postfix PostfixAdmin), поэтому логично будет использовать отдельный sql-запрос 9 для получения данных.

Создадим файл:

nano /etc/dovecot/dovecot-sql.conf

Со следующим содержимым:

driver = mysql
connect = host=localhost dbname=postfixadmin user=postfixadmin password=пароль_пользователя
default_pass_scheme = CRAM-MD5
password_query = SELECT username as user, password FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT maildir, 5000 AS uid, 5000 AS gid FROM mailbox WHERE username = '%u' AND active='1'

Теперь подробнее о каждом параметре:

  • driver — тип СУБД;
  • connect — параметры подключения к БД;
  • default_pass_scheme — схема хранения паролей 10. Имеет смысл задавать этот параметр, если все записи паролей хранятся в одном и том же виде, собственно так у меня и есть, поэтому выставляем значение CRAM-MD5. Именно в этом виде у меня хранятся все пароли в БД Postfixadmin, я упоминал это чуть выше по тексту;
  • password_query — запрос для получения пароля. Обязательно должен возвращать поле с именем password (если у вас в бд он имеет другое имя, используйте конструкцию AS);
  • user_query — запрос для получения имени пользователя.

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

chown dovecot:dovecot /etc/dovecot/dovecot-sql.conf
chmod 770 /etc/dovecot/dovecot-sql.conf

Переходим к последнему этапу.

Dovecot — auth-sql.conf.ext

Теперь остается только немного подкорректировать файл auth-sql.conf.ext, ведь по умолчанию он указывает на конфиг SQL /etc/dovecot/dovecot-sql.conf.ext, вместо созданного в предыдущем разделе файла /etc/dovecot/dovecot-sql.conf, но сначала бэкап:

cp nano /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.orig
nano /etc/dovecot/dovecot-sql.conf.ext

Итоговое содержимое файла должно выглядеть так:

userdb {
 driver = sql
 args = /etc/dovecot/dovecot-sql.conf
}
passdb {
 driver = sql
 args = /etc/dovecot/dovecot-sql.conf
}

Сохраняем изменения и закрываем файл.

На этом настройки связки Dovecot-SASL+Postfix завершены, не забудьте перезапустить Dovecot:

service dovecot restart

Тестируйте конфигурацию, анализируйте логи.

Вывод

Помимо агента доступа к почте (MAA), Dovecot может использоваться как агент локальной доставки (MDA или LDA, что одно и то же), а также как отдельный фреймворк SASL вместо традиционного Cyrus SASL. Это значительно упрощает общую конфигурацию и уменьшает количество необходимых компонентов.

Если у Postfix вся конфигурация упирается в файлы main.cf и master.cf, то ситуация с Dovecot несколько сложнее — он имеет множество конфигов в каталоге conf.d/. Вы можете раскидывать настройки по этим файлам, а можете сосредоточить в одном dovecot.conf, выбор за вами. В любом случае связка Postfix+Dovecot подразумевает изменение параметров конфигурационных файлов и того и другого.

comments powered by HyperComments