В контексте данной статьи связка Postfix и Dovecot подразумевает использование Postfix как агента пересылки почты (MTA), Dovecot как агента локальной доставки (LDA), а также реализацию Dovecot SASL вместо Cyrus SASL для авторизации пользователей.
Найти больше информации о Postfix вы можете в основной статье по его настройке – Настройка Postfix.
Содержание
Связка Postfix и Dovecot – LDA
Я подразумеваю, что Dovecot у вас уже установлен, но если нет, то выполните команду:
1 |
apt-get install dovecot-core |
Если вы хотите использовать Dovecot как агента локальной доставки (что вполне возможно и официально поддерживается как со стороны Postfix, так и Dovecot), вам необходимо задать ряд настроек, которые я постараюсь подробно рассмотреть ниже отдельно для каждого конфигурационного файла.
Стоит отметить, что задать необходимые настройки Dovecot вы можете в одном конфигурационном файле dovecot.conf, а не растаскивать их по конфигам в директории /etc/dovecot/conf.d/. На мой взгляд вариант со всеми настройками в одном файле выглядит гораздо более удобным и простым.
Postfix – main.cf
Dovecot может выполнять роль LDA как для локальных пользователей системы, так и для виртуальных (см. документацию 1). Вариант с виртуальными пользователями для меня более предпочтителен и его реализацией для Postfix я занимался в предыдущих статьях (Виртуальные почтовые ящики Postfix), а теперь пришло время организовать для этой схемы агента локальной доставки, которым и будет Dovecot.
Открываем основной конфиг и добавляем туда параметры:
1 |
nano /etc/postfix/main.cf |
Применительно к моему окружению, значения параметров будут выглядеть следующим образом:
1 2 |
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, добавив соответствующие записи. Для начала забэкапим файл:
1 |
cp /etc/postfix/master.cf{,.orig} |
Открываем для редактирования:
1 |
nano /etc/postfix/master.cf |
Добавляем строчки (перед второй строкой нужно два пробела):
1 2 |
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 – загрузка новой конфигурации:
1 |
postfix reload |
Следующие изменения нужно выполнить уже в конфигах Dovecot.
Dovecot – 10-master.conf
Укажем для прослушивания сокет auth-userdb через директиву auth, чтобы Dovecot знал где искать почтовые ящики пользователей. Для этого открываем файл, предварительно его забэкапив:
1 |
cp /etc/dovecot/conf.d/10-master.conf{,.orig} |
1 |
nano /etc/dovecot/conf.d/10-master.conf |
Изменяем:
1 2 3 4 5 6 7 |
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. Открываем его для редактирования (сначала как всегда бэкап):
1 |
cp /etc/dovecot/conf.d/10-mail.conf{,.orig} |
1 |
nano /etc/dovecot/conf.d/10-mail.conf |
Устанавливаем параметры:
1 2 3 4 5 6 |
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:
1 |
service dovecot restart |
На этом настройка Dovecot как LDA в связке с Postfix завершена.
Связка Postfix и Dovecot – SASL
В ранних версиях Postfix (до 2.3) допускалось использование для аутентификации 6 только библиотеки Cyrus SASL. На данный момент доступен также Dovecot SASL 7. Чтобы проверить совместимость, выполните команду:
1 |
postconf -a |
1 2 |
cyrus dovecot |
Процесс настройки Dovecot SASL значительно проще и доступнее, им и займемся, начав с настроек Postfix.
Postfix – main.cf
Postfix нужно явно указать, чтобы он использовал Dovecot SASL (ведь по умолчанию он использует Cyrus SASL), а также настроить некоторые другие параметры.
Открываем main.cf для редактирования:
1 |
nano /etc/postfix/main.cf |
Добавляем:
1 2 3 4 5 6 7 |
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, который мы редактировали ранее в этой статье. Поскольку его бэкап уже сделан, сразу открываем для редактирования:
1 |
nano /etc/dovecot/conf.d/10-master.conf |
Добавляем в директиву auth вот такие параметры:
1 2 3 4 5 |
unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix } |
Другими словами – мы сообщаем Dovecot сокет, используемый для аутентификации, а также пользователя, группу и права доступа. В итоге с учетом изменений в предыдущей главе статьи, секция будет иметь следующий вид:
1 2 3 4 5 6 7 8 9 10 11 12 |
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
Следующий этап – установить механизмы проверки подлинности. Откроем для редактирования конфиг:
1 |
cp nano /etc/dovecot/conf.d/10-auth.conf{,.orig} |
1 |
nano /etc/dovecot/conf.d/10-auth.conf |
В конфиге необходимо задать механизм аутентификации:
1 2 |
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 для получения данных.
Создадим файл:
1 |
nano /etc/dovecot/dovecot-sql.conf |
Со следующим содержимым:
1 2 3 4 5 |
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 – запрос для получения имени пользователя.
Для только что созданного файла не забываем указать необходимые права:
1 |
chown dovecot:dovecot /etc/dovecot/dovecot-sql.conf |
1 |
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, но сначала бэкап:
1 |
cp nano /etc/dovecot/dovecot-sql.conf.ext{,.orig} |
1 |
nano /etc/dovecot/dovecot-sql.conf.ext |
Итоговое содержимое файла должно выглядеть так:
1 2 3 4 5 6 7 8 |
userdb { driver = sql args = /etc/dovecot/dovecot-sql.conf } passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf } |
Сохраняем изменения и закрываем файл.
На этом настройки связки Dovecot-SASL+Postfix завершены, не забудьте перезапустить Dovecot:
1 |
service dovecot restart |
Тестируйте конфигурацию, анализируйте логи.
Вывод
Помимо агента доступа к почте (MAA), Dovecot может использоваться как агент локальной доставки (MDA или LDA, что одно и то же), а также как отдельный фреймворк SASL вместо традиционного Cyrus SASL. Это значительно упрощает общую конфигурацию и уменьшает количество необходимых компонентов.
Если у Postfix вся конфигурация упирается в файлы main.cf и master.cf, то ситуация с Dovecot несколько сложнее – он имеет множество конфигов в каталоге conf.d/. Вы можете раскидывать настройки по этим файлам, а можете сосредоточить в одном dovecot.conf, выбор за вами. В любом случае связка Postfix+Dovecot подразумевает изменение параметров конфигурационных файлов и того и другого.