Dovecot SSL configuration — Dovecot documentation

Введение

У меня есть аналогичная статья про настройку postfix на centos 7. Она в целом не утратила актуальность, кроме ссылок на старые версии софта. С тех пор ничего принципиально не изменилось. Если вы не хотите использовать Centos 8, то смело используйте ту статью. У 7-й версии centos еще очень долго будет поддержка, так что вам скорее всего хватит этого времени.

Как я уже сказал, настраивать почтовый сервер буду на ОС linux, а точнее на CentOS 8. За основу будет взят postfix, который присутствует в этой системе из коробки. Инструкция получится универсальной, можно использовать и для других дистрибутивов.

Дополнительный функционал почтового сервера postfix

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

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

  1. Защиту от подбора паролей с помощью fail2ban.
  2. Мониторинг почтового сервера postfix с помощью zabbix.
  3. Сбор статистики с помощью pflogsumm или чего-то подобного.
  4. Просмотр и анализ логов с помощью webmin.
  5. Использование бесплатных сертификатов let’s encrypt.
  6. Регулярную очистку служебных почтовых ящиков.
  7. Бэкап всей почтовой базы.
  8. Сбор логов с почтовых серверов в ELK Stack.
Похожее:  Как зарегистрироваться в личном кабинете налогоплательщика

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

Dovecot ssl configuration — dovecot documentation

When Dovecot starts up for the first time, it generates new 512bit and 1024bit Diffie Hellman parameters and saves them into <prefix>/var/lib/dovecot/ssl-parameters.dat. Dovecot v2.1.x and older regenerated them every week by default, but because the extra security gained by the regeneration is quite small, Dovecot v2.2 disabled the regeneration feature completely.

From and up to version 2.2, you can specify the wanted DH parameters length using:

From version 2.3, you must specify path to DH parameters file using:

To generate new parameters file, you can use:

You can also convert an old v2.2 parameters file with command:

This should work most of the times. If not, generate new file.

By default Dovecot’s allowed ciphers list contains:

Disallowing more won’t really gain any security for those using better ciphers, but it does prevent people from accidentally using insecure ciphers. See https://www.openssl.org/docs/manmaster/man1/ciphers.html for a list of the ciphers.

You should usually prefer server ciphers and their order, so setting

is recommended.

Аутентификация

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

Базовая настройка

Для начала нужно создать хотя бы одного пользователя, который и будет получать/отправлять почту.

Создаем юзера командой:

и сразу перенаправляем всю входящую почту root’a на него (это нужно для безопасности), добавив запись в /etc/aliases:

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

На этом все. Более подробно базовую настройку системы я уже рассматривал ранее в статье Настройка Debian для Postfix.

Безопасность

Если установка Postfix прошла по стандартному сценарию, то как минимум дефолтные сертификаты должны присутствовать. В том или ином виде конфиг будет содержать параметры:

Где первые два параметра — пути к файлу сертификата и закрытому ключу, следующие два — пути к кэшу. Менять эти значения по умолчанию не нужно.

Примечание: В этом куске конфига вы можете встретить параметр smtpd_use_tls=yes. Его можно безболезненно убрать, поскольку он устарел и предназначен для совместимости устаревших версий Postfix. Вместо него используется smtpd_tls_security_level, значение которого имеет приоритет.

Следующую секцию параметров, относящуюся к SASL, вам нужно добавить вручную:

Ключ smtpd_sasl_auth_enable по умолчанию имеет значение no, то есть аутентификация не требуется. Именно поэтому нужно задать yes в явном виде. По умолчанию Postfix использует Cyrus SASL и чтобы он обратил свой взор в сторону Dovecot, нужно изменить параметр smtpd_sasl_type и указать путь до сокета в параметре smtpd_sasl_path.

Примечание: полный путь до сокета будет /var/spool/postfix/private/auth, просто параметр smtpd_sasl_path является составным и по умолчанию включает в себя  путь до очереди — queue_directory = /var/spool/postfix .

Советую к прочтению официальные мануалы34.

Ну и последний момент: проследите, чтобы в конфиге был определен параметр smtpd_relay_restrictions (иначе почта отправляться не будет). По умолчанию для только что установленного Postfix он будет иметь значения permit_mynetworks permit_sasl_authenticated defer_unauth_destination.

С настройками TLS и SASL разобрались, двигаемся дальше.

Настройка dkim

Напишу своими словами как я понимаю работу dkim. С помощью dkim вся исходящая почта сервера подписывается электронной цифровой подписью, связанной с именем домена. Открытый ключ шифрования с помощью DNS публикуется в txt записи. Таким образом, удаленный сервер, при получении письма от вас, сравнивает цифровую подпись с опубликованным в dns открытым ключом вашего домена.

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

Установка dkim на Centos 8 на момент написания статьи имеет некоторые сложности. Дело в том, что этого пакета до сих пор нет в стабильной версии репозитория Epel, где он обычно был для предыдущих версию. Хорошая новость в том, что он уже есть в тестовой ветке.

Для настройки dkim устанавливаем соответствующий пакет:

# dnf install opendkim

Создаем директорию для хранения ключей:

# mkdir -p /etc/postfix/dkim && cd /etc/postfix/dkim

Генерируем ключи для домена:

Настройка dmarc

Для настройки DMARC на самом почтовом сервере ничего делать не надо. По своей сути это просто указание другим, что делать с письмами от вас, не прошедшими проверки dkim и spf (которые являются подделками, если у вас все настроено правильно). Для этого сам принимающий почтовый сервер должен поддерживать работу в соответствии с dmark. Плюс, для вашего домена должны быть настроены правила, что делать в том или ином случае.

Есть три типа действий, которые можно настроить с помощью dmark:

  1. Отклонить письмо.
  2. Пометить письмо как спам.
  3. Ничего не делать.

При этом можно настроить при каждом действии формирование отчета и отправку его на какой-то email адрес. Я очень осторожно отношусь к этим правилам и никогда не настраиваю блокировку или пометку о спаме. Так можно выстрелить себе в ногу и загубить всю свою почту из-за какой-нибудь ошибки.

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

Указанные правила мы сейчас и добавим с помощью txt записи в DNS. Запись будет такая:

Настройка dovecot

Займемся настройкой dovecot — сервер доставки почты пользователю по протоколам pop3 и imap. Я не вижу причин использовать pop3. Он неудобен по сравнению с imap. Чаще всего pop3 отключаю вовсе. Но это уже на ваше усмотрение. Приведу пример с настройкой обоих протоколов. Помимо основного функционала по доставке почты, я настрою несколько полезных плагинов. Расскажу о них поподробнее:

  • Sieve — выполняет фильтрацию почты по заданным правилам в момент локальной доставки на почтовом сервере. Удобство такого подхода в том, что вы один раз можете настроить правило сортировки, и оно будет работать во всех клиентах, которыми вы будете получать почту по imap. Правила создаются, хранятся и исполняются на самом сервере.
  • Acl — позволяет пользователям расшаривать папки в своем почтовом ящике и предоставлять доступ к этим папкам другим пользователям. Не часто видел, чтобы этот функционал настраивали и использовали. Думаю, просто по незнанию. По мне так очень удобный и полезный функционал.

Часто вижу, что люди настраивают плагин quota, который позволяет ограничивать максимальный размер почтового ящика. Я лично в своей работе его не использую. Возможно, когда у тебя клиентов сотни и тысячи это имеет значение и надо обязательно настроить ограничение.

Когда же ящиков меньше, нет смысла напрягать людей постоянной чисткой. Сейчас диски стоят не так дорого. Мне кажется, проще и дешевле увеличить место на сервере, нежели постоянно беспокоить пользователей необходимостью чистки ящика. Лучше ограничить максимальный размер письма, скажем 20-ю мегабайтами.

Настройка spf

Настроим еще одно средство для повышения доверия к нашей почте со стороны других серверов — spf. Расскажу опять своими словами для чего это нужно. Spf запись добавляется в виде txt записи в dns вашего домена. С помощью этой записи вы указываете, какие ip адреса имеют право отправлять почту от вашего имени.

Можно указать конкретные ip адреса в записи, а можно сказать, чтобы ip адреса проверялись по спискам A и MX записей. У нас простой случай и только 1 сервер с одним ip, поэтому укажем конкретно этот ip адрес. Идем в панель управления dns и добавляем новую txt запись.

Настройка автоответчика

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

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

# mcedit /var/www/html/webmail/plugins/managesieve/config.inc.php

Изменяем там параметр:

$config['managesieve_vacation'] = 1;

После этого достаточно просто обновить веб интерфейс roundcube, и появятся новые настройки по адресу Настройки -> Отпуск.

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

Настройка брандмауэра для dovecot

Аналогично Postfix, для настроек будем использовать утилиту ufw. Проверим текущее правило для сервисов Dovecot (их два):

sudo cat /etc/ufw/applications.d/dovecot-imapd
[Dovecot IMAP]
title=Secure mail server (IMAP)
description=Dovecot is a mail server whose major goals are security and extreme
 reliability.
ports=143/tcp

[Dovecot Secure IMAP]
title=Secure mail server (IMAPS)
description=Dovecot is a mail server whose major goals are security and extreme
 reliability.
ports=993/tcp

# sudo cat /etc/ufw/applications.d/dovecot-pop3d
[Dovecot POP3]
title=Secure mail server (POP3)
description=Dovecot is a mail server whose major goals are security and extreme
 reliability.
ports=110/tcp

[Dovecot Secure POP3]
title=Secure mail server (POP3S)
description=Dovecot is a mail server whose major goals are security and extreme
 reliability.
ports=995/tcp

Разрешаем сетевое взаимодействие с Dovecot при помощи следующей команды:

sudo ufw allow 'Dovecot IMAP'
sudo ufw allow 'Dovecot POP3'

Настройка брандмауэра для postfix

Для внесения изменений изменений в правила брандмауэра воспользуемся специальной утилитой ufw (расшифровывается как uncomplicated firewall). По сравнению с известным iptables, у ufw проще синтаксис. Установим и запустим ufw:

sudo apt install ufw
sudo ufw enable

Проверим текущее правило для Postfix:

cat /etc/ufw/applications.d/postfix
[Postfix]
title=Mail server (SMTP)
description=Postfix is a high-performance mail transport agent
ports=25/tcp

[Postfix SMTPS]
title=Mail server (SMTPS)
description=Postfix is a high-performance mail transport agent
ports=465/tcp

[Postfix Submission]
title=Mail server (Submission)
description=Postfix is a high-performance mail transport agent
ports=587/tcp

Разрешаем сетевое взаимодействие с Postfix при помощи следующей команды:

sudo ufw allow Postfix

Необязательные настройки

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

В более ранних версиях Dovecot (2.0 и старше) использовался плагин Autocreate12, теперь же он устарел и рекомендуют использовать директиву namespace inbox13. Вот один из вариантов конфигурации:

Теперь можно объединить все настройки в один работающий конфиг.

Общие папки по imap

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

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

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

Настроим общую папку imap. Хотя настраивать нам, по сути, нечего. Мы уже все настроили ранее. Добавили соответствующие настройки в dovecot и активировали плагин acl в roundcube. Теперь нужно просто сделать папку и открыть ее для другого пользователя.

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

Заходим в ящик, которому добавили общий доступ и проверяем.

Все в порядке, общая папка imap настроена и подключена. В папке /mnt/mail/shared-folders появился файл с настроенным выше правилом.

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

Установка postfix

Установим из пакетов сам Postfix и коннектор к базе данных MySQL:

sudo apt install postfix postfix-mysql -y

После окончания установки в консоли откроется графический интерфейс первоначальной настройки.

На первом экране настройки выбираем Internet Site:

На следующем экране нужно указать FQDN сервера, на котором работает почтовый сервис:

На этом настройка почтового сервера окончена и можно переходить к работе с остальными инструментами для почтового обмена. Если позже появится необходимость внести изменения в выполненные настройки, можно воспользоваться утилитой dpkg-reconfigure:

sudo dpkg-reconfigure postfix

Для настройки Postfix, закомментируем в файле /etc/postfix/main.cf следующие строки символом #:

sudo nano /etc/postfix/main.cf
#smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
#smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
#smtpd_tls_security_level=may
#smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)

Затем добавляем следующее:

virtual_transport=lmtp:unix:private/dovecot-lmtp
relay_domains = mysql:/etc/postfix/mysql/relay_domains.cf
virtual_alias_maps = mysql:/etc/postfix/mysql/virtual_alias_maps.cf,mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql/virtual_mailbox_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql/virtual_mailbox_maps.cf
virtual_mailbox_base=/var/mail/vmail/
local_recipient_maps=$virtual_mailbox_maps

smtpd_sasl_auth_enable=yes
smtpd_sasl_type=dovecot
smtpd_sasl_path=private/auth
broken_sasl_auth_clients=yes
smtpd_sasl_security_options=noanonymous

smtpd_use_tls=yes
smtpd_tls_cert_file=/etc/postfix/certs/cert.pem
smtpd_tls_key_file=/etc/postfix/certs/key.pem
smtpd_sasl_tls_security_options=noanonymous
smtpd_tls_auth_only=yes

smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_non_fqdn_helo_hostname,reject_non_fqdn_sender,reject_unknown_sender_domain,reject_non_fqdn_recipient,reject_unknown_recipient_domain

smtpd_banner=$myhostname ESMTP

strict_rfc821_envelopes=yes
disable_vrfy_command=yes
smtpd_helo_required=yes

Открываем файл конфигурации /etc/postfix/master.cf на редактирование:

sudo nano /etc/postfix/master.cf

Добавляем в конец файла следующие строки:

Установка web интерфейса roundcube

Установим и настроим самый популярный web интерфейс для postfix — roundcube. Вообще говоря, его не обязательно ставить на почтовый сервер. Более того, я бы рекомендовал его ставить в другое место. Если в инфраструктуре имеется отдельный веб сервер, лучше поставить roundcube туда.

Скачиваем исходники последней lts версии roundcube. Я обычно использую именно lts версию, хотя она достаточно старая. Но моя практика показывает, что именно в ней все работает стабильно и сразу, без лишней возни. К примеру, когда я готовил эту статью, у меня не получилось настроить работу автоответчика, о котором я расскажу отдельно ниже.

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

Установка и настройка dovecot

В

прошлой заметке

была рассмотрена настройка веб-интерфейса для управления почтовыми ящиками Postfixadmin.

В этой заметке рассмотрена настройка агента доставки почты (MDA) Dovecot для совместного использования с Postfixadmin. Рассмотрена вторая версия сервера, настройка которой несколько отличается от настройки первой версии. Я и раньше не считал документацию на Dovecot хорошей, но для настройки второй версии мне пришлось потратить ещё больше времени, потому что для неё документации ещё меньше. Собственно, всё, что есть из документации – это официальный сайт с wiki-страницами, больше напоминающими обрывки HowTo, нежели систематическую исчерпывающую документацию по каждой доступной опции.

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

Однако при всех указанных недостатках, Dovecot всё равно настраивается проще других подобных систем (Courier и Cyrus). Причин у этого, на мой взгляд, две: он лучше поддерживается разработчиками дистрибутива и в нём меньше исторических наслоений. (По непонятным причинам поддержка Courier оставляет желать лучшего: когда я пытался его настроить, мне пришлось пересобрать пакет с библиотекой SASL, чтобы она поддерживала прямую работу с courier-auth. После длительных мучений с его настройкой, я решил больше не биться головой в закрытую дверь, пытаясь исправить очередную кривизну в поставке по умолчанию, и настроил Dovecot. Собственно, я и пытался-то настроить Courier из простого любопытства).

Главное разочарование, постигшее меня при настройке второй версии Dovecot, заключалось в том, что теперь не работает придуманный мной метод аутентификации POP-before-SMTP. В новом Dovecot можно задавать только скрипты, выполняемые при отключении клиента от сервера POP3 или IMAP, а не в момент подключения, как это было раньше. В результате для того, чтобы отправить письмо, нужно не только подключиться к POP3 или IMAP-серверу, но и тут же отключиться от него. Впрочем, большинство современных почтовых клиентов имеет встроенную поддержку аутентификации на SMTP-сервере, поэтому утрата не выглядит сейчас столь уж серьёзной.

1. Установка Dovecot

Установим пакеты Dovecot, содержащие поддержку серверов POP3 и IMAP, а также пакет, позволяющий использовать данные из MySQL:

# apt-get install dovecot-core dovecot-imapd dovecot-pop3d dovecot-mysql

2. Подготовка системы

Создадим группу и пользователя vmail, от имени которого будет работать Dovecot и дадим этому пользователю доступ к каталогу, в котором будет храниться почта пользователей почтовой системы. На серверах для размещения почтовых ящиков, как и другой часто меняющейся информации, обычно используется раздел /var, который заранее делается достаточно большим. На настраиваемой мной системе больше всего свободного места на разделе home, поэтому я размещу почтовые ящики пользователей на нём:

# groupadd -g 120 -r vmail
# useradd -g 120 -r -u 120 vmail
# mkdir /home/vmail
# chown vmail:vmail /home/vmail
# chmod u=rwx,g=rx,o= /home/vmail

Добавляем пользователя dovecot для доступа к базе данных:

USE mysql;

INSERT INTO user(user, password, host) VALUES('dovecot', PASSWORD('dovecot_password'), 'localhost');

FLUSH PRIVILEGES;

Вместо пароля dovecot_password я сгенерировал случайный пароль при помощи программы pwgen из одноимённого пакета. Можно сгенерировать сразу длинный пароль, поскольку вводить вручную его не придётся:

$ pwgen 16

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

Таблица mailbox в базе данных postfixadmin содержит информацию о почтовых ящиках. Дадим пользователю dovecot доступ к таблице mailbox и её колонкам:

USE mysql;

INSERT INTO tables_priv(host, db, user, table_name, table_priv, column_priv) VALUES
('localhost', 'postfixadmin', 'dovecot', 'mailbox', '', 'Select');

INSERT INTO columns_priv(host, db, user, table_name, column_name, column_priv) VALUES
('localhost', 'postfixadmin', 'dovecot', 'mailbox', 'username', 'Select'),
('localhost', 'postfixadmin', 'dovecot', 'mailbox', 'local_part', 'Select'),
('localhost', 'postfixadmin', 'dovecot', 'mailbox', 'domain', 'Select'),
('localhost', 'postfixadmin', 'dovecot', 'mailbox', 'password', 'Select'),
('localhost', 'postfixadmin', 'dovecot', 'mailbox', 'quota', 'Select'),
('localhost', 'postfixadmin', 'dovecot', 'mailbox', 'active', 'Select');

FLUSH PRIVILEGES;

3. Базовая настройка Dovecot

Обратимся к странице Сравнение почтовых программ на Википедии. Судя по сводной таблице механизмов аутентификации, поддерживаемых разными почтовыми клиентами, большинство из них поддерживает механизмы PLAIN, LOGIN и CRAM-MD5.

При использовании PLAIN и LOGIN пароль передаётся в открытом виде, а хранить в базе данных его можно в хэшированном виде. В случае с CRAM-MD5 дело обстоит с точностью до наоборот – пароль передаётся в хэшированном виде, но хранится – в открытом.

Что безопаснее? Если вы не собираетесь настраивать защищённые версии протоколов IMAP и POP3, то лучше использовать CRAM-MD5. На мой взгляд вероятность перехвата паролей выше, нежели вероятность получения не авторизованного доступа к базе данных. Если же предполагается всегда использовать шифрование, то безопаснее использовать PLAIN и LOGIN, потому что при их использовании можно хранить пароли в базе данных в хэшированном виде. Пароль при этом не получится перехватить, а в случае получения доступа к хэшам паролей воспользоваться ими напрямую не удастся, т.к. нужно будет подобрать пароль, который будет соответствовать хэшу.

Я буду использовать защищённые версии протоколов IMAP и POP3, поэтому настрою в файле /etc/dovecot/conf.d/10-auth.conf механизмы PLAIN и LOGIN, чтобы хранить пароли в базе данных в хэшированном виде:

disable_plaintext_auth = no
auth_default_realm = domain.tld
auth_mechanisms = plain login
!include auth-sql.conf.ext

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

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

Теперь нужно прописать в файл /etc/dovecot/dovecot-mysql.conf учётные данные для доступа к базе данных и запросы для извлечения из неё необходимой информации о почтовых ящиках:

driver = mysql

connect = host=localhost dbname=postfixadmin user=dovecot password=dovecot_password

default_pass_scheme = MD5-CRYPT

password_query = SELECT local_part AS username, 
                        domain, 
                        password, 
                        120 AS userdb_uid, 
                        120 AS userdb_gid, 
                        CONCAT('*:bytes=', quota) AS userdb_quota_rule 
                 FROM mailbox 
                 WHERE username = '%u' 
                   AND active = 1

user_query =  SELECT CONCAT('*:bytes=', quota) AS quota_rule, 
                     120 AS uid, 
                     120 AS gid 
              FROM mailbox 
              WHERE username = '%u' 
                AND active = 1

iterate_query = SELECT username AS user 
                FROM mailbox 
                WHERE active = 1

Выделенные жирным шрифтом части запросов используются плагином quota. Если вы не собираетесь настраивать этот плагин, то эти части запросов можно пропустить. Настройка этого плагина подробнее рассмотрена ниже.

Стоит сразу же изменить права доступа к этому файлу, чтобы посторонние пользователи системы не смогли увидеть пароль, под которым dovecot будет подключаться к базе данных:

# chown root:dovecot /etc/dovecot/dovecot-mysql.conf 
# chmod u=rw,g=r,o= /etc/dovecot/dovecot-mysql.conf

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

Изменим форматирование отметок времени, вписав в файл /etc/dovecot/conf.d/10-logging.conf следующую настройку:

log_timestamp = "%Y-%m-%d %H:%M:%S "

На время отладки также можно включить другие опции из этого файла:

auth_verbose = yes
auth_verbose_passwords = yes
auth_debug = yes
mail_debug = yes

В файле /etc/dovecot/conf.d/10-mail.conf настроим путь к почтовым ящикам и пользователя, от имени которого dovecot будет работать с ящиками:

mail_home = /home/vmail/%Ld/%Ln
mail_location = maildir:/home/vmail/%Ld/%Ln
mail_uid = vmail
mail_gid = vmail
first_valid_uid = 120
last_valid_uid = 120
first_valid_gid = 120
last_valid_gid = 120

Сейчас придётся немного опять забежать вперёд и настроить SASL. Это сервис, при помощи которого Postfix будет проверять учётные данные почтовых клиентов. Для этого отредактируем файл /etc/dovecot/conf.d/10-master.conf и впишем в него путь к UNIX-сокету и права доступа к нему:

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

Сокет-файл размещается в chroot-окружении Postfix и доступен для чтения и записи только пользователю postfix.

Зададим в файле /etc/dovecot/conf.d/15-lda.conf адрес, с которого Dovecot будет отправлять сообщения об ошибках:

postmaster_address = [email protected]

Осталось отредактировать файл /etc/dovecot/dovecot.conf, указав в нём адрес, на котором сервер будет ожидать подключений:

!include_try /usr/share/dovecot/protocols.d/*.protocol
listen = *
!include conf.d/*.conf
!include_try local.conf

Начальная настройка сервера окончена. Осталось перезапустить Dovecot, чтобы настройки вступили в силу:

# /etc/init.d/dovecot restart

4. Настройка плагина acl

Плагин acl позволяет пользователям предоставлять друг другу доступ к папкам в своих почтовых ящиках. Это может быть полезно для корпоративных пользователей. Например, для директора и его заместителя. Или для директора и его секретаря. Или для сотрудников из одного отдела, которые подменяют друг друга на время обеда или отпуска. Эта возможность, естественно, доступна только при использовании протокола IMAP.

В файле /etc/dovecot/conf.d/10-mail.conf включаем использование плагина:

mail_plugins = acl

В файле /etc/dovecot/conf.d/20-imap.conf включаем использование плагина в IMAP-сервере:

protocol imap {
  mail_plugins = $mail_plugins imap_acl
}

В файле /etc/dovecot/conf.d/10-mail.conf прописываем следующие настройки:

namespace inbox {
  type = private
  separator = /
  prefix =
  inbox = yes
}

namespace {
  type = shared
  separator = /
  prefix = shared/%%u/
  location = maildir:%%h:INDEX=%h/shared/%%u
  subscriptions = yes
  list = children
}

Эти настройки описывают два пространства имён: в первом хранится личная почта пользователя, а во втором будут отображаться каталоги других пользователей, к которым этот пользователь имеет доступ.

Поясню смысл настроек location для пространства имён общих каталогов:

В файл /etc/dovecot/conf.d/90-acl.conf прописываем настройки плагина:

plugin {
  acl = vfile
  acl_shared_dict = file:/home/vmail/%Ld/shared-mailboxes.db
}

Значение vfile предписывает создавать внутри почтового ящика файл dovecot-acl, в котором и будут прописываться права доступа к нему со стороны других пользователей.

Значение acl_shared_dict указывает путь к файлу словаря, который позволит пользователям узнавать, к каким каталогам в чужих почтовых ящиках у них имеется доступ. В данном случае для каждого домена будет создан отдельный файл словаря, расположенный в каталоге домена, на одном уровне с ящиками.

Заодно опишем в файле /etc/dovecot/conf.d/15-mailboxes.conf назначение различных каталогов внутри пространства имён, в котором хранится личная почта пользователя:

namespace inbox {
  mailbox Drafts {
    special_use = Drafts
  }
  mailbox Junk {
    special_use = Junk
  }
  mailbox Trash {
    special_use = Trash
  }
  mailbox Sent {
    special_use = Sent
  }
}

Современные почтовые программы смогут прямо по протоколу IMAP узнать назначение каждого из специальных каталогов, вне зависимости от их названия. Это бывает полезно, если каталог имеет нестандартное название или название на языке пользователя ящика, например “Входящие” или “Спам”.

Чтобы настройки плагина acl вступили в силу, нужно перезапустить Dovecot:

# /etc/init.d/dovecot restart

5. Настройка плагина quota

Плагин quota позволяет назначить для почтового ящика ограничения на объём хранящихся в нём писем или даже на их общее количество. На мой взгляд, ограничение на общее количество писем имеет довольно мало смысла. Единственная польза, которая мне приходит на ум – это возможность защититься от исчерпания inode’ов в файловой системе, если кто-то намеренно решит отправить огромное количество мелких писем в ящики пользователей, с целью нарушить работу почтовой системы.

Мы настроим плагин так, чтобы он использовал значения квот, указанные в интерфейсе Postfixadmin. Эти квоты ограничивают только максимальный объём писем в ящике.

Включим использование плагина в файле /etc/dovecot/conf.d/10-mail.conf:

mail_plugins = aclquota

Жирным шрифтом показан добавленный текст, а курсивом – текст, добавленный нами при включении плагина acl. Если вы не включали плагин acl, то вписывать этот текст не нужно.

В файл /etc/dovecot/conf.d/15-lda.conf впишем, что в случае превышения квоты Dovecot должен сообщать о временной ошибке, но не отклонять письмо окончательно. Почтовый сервер отправителя (или наш MTA) будет периодически предпринимать повторные попытки в надежде на то, что адресат почистит свой ящик от ненужных писем.

quota_full_tempfail = yes

В файл /etc/dovecot/conf.d/20-imap.conf добавим поддержку квот в IMAP-сервере:

protocol imap {
  mail_plugins = $mail_plugins imap_aclimap_quota
}

Этот плагин позволит почтовым клиентам, работающим по протоколу IMAP, узнавать квоту почтового ящика и её текущее использование.

Укажем в файле /etc/dovecot/conf.d/90-quota.conf, что значения квот берутся из словаря и зададим пустое правило по умолчанию:

plugin {
  quota = dict:User quota::proxy::quota
  quota_rule = *:
}

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

Плагин quota использует сервис доступа к словарям данных. Включим и настроим этот сервис в файле /etc/dovecot/conf.d/10-master.conf:

service dict {
  unix_listener dict {
    mode = 0600
    user = vmail
    group = vmail
  }
}

Теперь укажем в файле /etc/dovecot/dovecot.conf, где хранятся настройки словаря с данными квот:

dict {
  quota = mysql:/etc/dovecot/dovecot-dict-mysql.conf
}

И укажем в файле с настройками /etc/dovecot/dovecot-dict-mysql.conf, в какой таблице хранятся данные о текущем использовании квот и как подключиться к базе данных с этой таблицей:

connect = host=localhost dbname=postfixadmin user=dovecot password=dovecot_password

map {
  pattern = priv/quota/storage
  table = quota2
  username_field = username
  value_field = bytes
}

Сразу же изменим права доступа к этому файлу, чтобы посторонние пользователи системы не смогли увидеть пароль, под которым dovecot будет подключаться к словарям в базе данных:

# chown root:dovecot /etc/dovecot/dovecot-dict-mysql.conf 
# chmod u=rw,g=r,o= /etc/dovecot/dovecot-dict-mysql.conf

Выдадим пользователю dovecot права на доступ к таблице quota2 и её колонкам:

USE mysql;

INSERT INTO tables_priv(host, db, user, table_name, table_priv, column_priv) VALUES
('localhost', 'postfixadmin', 'dovecot', 'quota2', 'Delete', 'Select,Insert,Update');

INSERT INTO columns_priv(host, db, user, table_name, column_name, column_priv) VALUES
('localhost', 'postfixadmin', 'dovecot', 'quota2', 'username', 'Select,Insert,Update'),
('localhost', 'postfixadmin', 'dovecot', 'quota2', 'bytes', 'Select,Insert,Update');

FLUSH PRIVILEGES;

Не забудьте вписать в файл /etc/dovecot/dovecot-mysql.conf текст, выделенный жирным шрифтом в разделе 3. Этот текст извлекает из базы данных настройки квот ящиков.

Настройка плагина закончена. Осталось перезапустить Dovecot:

# /etc/init.d/dovecot restart

6. Настройка плагина expire

Плагин expire позволяет автоматически удалять устаревшие письма из каталогов почтовых ящиков. Обычно это каталоги с удалённой почтой и спамом. Поскольку алгоритмы обнаружения спама не совершенны, не стоит удалять такие письма – нужно дать пользователю возможность прочитать письмо, ошибочно определённое как спам. С другой стороны, хочется избавить пользователя от утомительной привычки периодически чистить почтовый ящик, особенно для каталогов со спамом и удалёнными письмами – письма в этих каталогах обладают заведомо низкой ценностью.

Включим плагин в файле /etc/dovecot/conf.d/10-mail.conf:

mail_plugins = acl quotaexpire

Курсивом отмечены плагины, настройка которых была рассмотрена выше. Если вы пропустили их настройку, не нужно их вписывать – достаточно добавить текст, отмеченный жирным шрифтом.

Теперь настроим плагин в файле /etc/dovecot/conf.d/90-expire.conf:

plugin {
  expire = Trash 7            # Хранение писем в папке Trash - 7 дней
  expire2 = Trash/* 7         # Хранение писем в подпапках папки Trash - 7 дней
  expire3 = Junk 30           # Хранение писем в папке Junk - 30 дней
  expire_dict = proxy::expire # Использовать словарь для хранения отметок времени писем
}

Текст proxy задаёт использование прокси-сервера, который выполняет мультиплексирование подключений к базе данных (см. выше описание плагина quota). На самом деле для каждого каталога будет храниться лишь одна отметка времени для самого старого письма в каталоге, которая будет обновляться при очередной чистке каталога.

В файле /etc/dovecot/dovecot.conf укажем путь к файлу с настройками словаря, в котором будут храниться данные об отметках времени писем:

dict {
  quota = mysql:/etc/dovecot/dovecot-dict-mysql.confexpire = mysql:/etc/dovecot/dovecot-dict-mysql.conf
}

Курсивом отмечена строчка, которая была добавлена в процессе настройки плагина quota. Сейчас же нужно добавить строчку, отмеченную жирным шрифтом.

Настроим учётные данные для подключения к базе данных в файле /etc/dovecot/dovecot-dict-mysql.conf. Там же укажем, в какой таблице и в каких её полях хранить отметки времени.

connect = host=localhost dbname=postfixadmin user=dovecot password=dovecot_password

map {
  pattern = priv/quota/storage
  table = quota2
  username_field = username
  value_field = bytes
}map {
  pattern = shared/expire/$user/$mailbox
  table = expire
  value_field = expire_stamp

  fields {
    username = $user
    mailbox = $mailbox
  }
}

Тут так же нужно добавить лишь текст, выделенный жирным шрифтом. Курсивом отмечен текст, добавленный при настройке плагина quota.

Если вы ещё не поменяли права доступа к этому файлу, стоит сделать это сейчас, чтобы посторонние пользователи системы не могли прочитать пароль, под которым dovecot будет подключаться к словарям в базе данных:

# chown root:dovecot /etc/dovecot/dovecot-dict-mysql.conf 
# chmod u=rw,g=r,o= /etc/dovecot/dovecot-dict-mysql.conf

Включим в файле /etc/dovecot/conf.d/10-master.conf сервис для доступа к словарям, если вы его ещё не включили при настройке плагина quota:

service dict {
  unix_listener dict {
    mode = 0600
    user = vmail
    group = vmail
  }
}

Поскольку по умолчанию в Postfixadmin нет таблицы, предназначенной для хранения информации плагина expire из Dovecot, создадим эту таблицу и дадим пользователю Dovecot права доступа к ней:

USE postfixadmin;

CREATE TABLE expire (
  username varchar(255) not null,
  mailbox varchar(255) not null,
  expire_stamp integer not null,
  primary key (username, mailbox)
);

USE mysql;
 
INSERT INTO tables_priv(host, db, user, table_name, table_priv, column_priv) VALUES
('localhost', 'postfixadmin', 'dovecot', 'expire', 'Delete', 'Select,Insert,Update');

INSERT INTO columns_priv(host, db, user, table_name, column_name, column_priv) VALUES
('localhost', 'postfixadmin', 'dovecot', 'expire', 'username', 'Select,Insert,Update'),
('localhost', 'postfixadmin', 'dovecot', 'expire', 'mailbox', 'Select,Insert,Update'),
('localhost', 'postfixadmin', 'dovecot', 'expire', 'expire_stamp', 'Select,Insert,Update');

FLUSH PRIVILEGES;

На этом настройку плагина можно считать оконченной. Осталось лишь перезапустить Dovecot, чтобы изменения вступили в силу:

# /etc/init.d/dovecot restart

7. Настройка SSL

Настройка SSL будет подробнее рассмотрена в одной из следующих заметок. Там будет описана настройка отдельных сертификатов SSL для разных доменов, а также будет освещён вопрос подготовки самих сертификатов – самоподписанных или подписанных центром сертификации.

Если у вас имеются готовый подписанный сертификат, можно включить поддержку SSL в файле /etc/dovecot/conf.d/10-ssl.conf и указать в нём пути к файлам сертификата:

ssl = yes
ssl_cert = </etc/ssl/mail_public.pem
ssl_key = </etc/ssl/mail_private.pem

После настройки сертификатов нужно перезапустить Dovecot, чтобы изменения вступили в силу:

# /etc/init.d/dovecot restart

8. Настройка плагина sieve

Sieve – это скрипты фильтрации почты, которые выполняются агентом локальной доставки (LDA) в момент получения письма от почтового сервера (MTA). Скрипты позволяют раскладывать письма в разные папки, ориентируясь на их содержимое – тему письма, получателей, отправителей и т.п. Можно удалить письмо, переслать его на другой ящик или отправить уведомление отправителю, причём использовать можно любое поле заголовка или содержимое тела письма.

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

Конечно, в наши времена больших почтовых сервисов типа Gmail или Яндекс-почты, этим никого не удивишь. Но тут плюс заключается в том, что перед нами не стоит дилемма “удобство” – “безопасность”. Мы можем хранить почту у себя, не делясь ею с посторонними компаниями, имея над ней полный контроль, и в то же время можем пользоваться удобствами, характерными для больших почтовых сервисов.

Установим пакет с плагином Sieve:

# apt-get install dovecot-sieve

Включим использование плагина в файле /etc/dovecot/conf.d/15-lda.conf:

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Укажем настройки плагина в файле /etc/dovecot/conf.d/90-sieve.conf:

plugin {
  sieve = /home/vmail/%Ld/%n/active.sieve # Расположение активного скрипта
  sieve_dir = /home/vmail/%Ld/%n/sieve    # Каталог для скриптов
  sieve_max_script_size = 1M              # Максимальный размер одного скрипта
  sieve_quota_max_scripts = 50            # Максимальное количество скриптов
  sieve_quota_max_storage = 1M            # Максимальный общий объём скриптов
}

Каждый пользователь может обладать собственным набором Sieve-скриптов, из которых в любой момент времени активным может быть только один. Каталог для скриптов указывается в настройке sieve_dir, а в настройке sieve указывается имя символической ссылки, которая будет указывать на активный скрипт.

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

# /etc/init.d/dovecot restart

Подробнее о скриптах Sieve можно почитать на Википедии, в статье

Sieve

.

9. Настройка сервиса managesieve

Плагин sieve не был бы столь полезным, если бы Sieve-скриптами нельзя было бы управлять прямо из почтового клиента. Именно эту функцию и реализует сервис ManageSieve. Он ожидает подключений клиентов на отдельном TCP-порту 4190. Для управления скриптами клиент использует учётные данные своего почтового ящика.

Для включения сервиса достаточно лишь установить дополнительный пакет:

# apt-get install dovecot-managesieve

В следующих заметках фильтрация писем при помощи Sieve будет рассмотрена подробнее – я покажу, как им пользоваться в почтовых клиентах.

10. Результирующий файл конфигурации

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

$ doveconf -n

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

# 2.1.7: /etc/dovecot/dovecot.conf
# OS: Linux 3.2.0-4-amd64 x86_64 Debian 7.3 ext4
auth_default_realm = domain.tld
auth_mechanisms = plain login
dict {
  expire = mysql:/etc/dovecot/dovecot-dict-mysql.conf
  quota = mysql:/etc/dovecot/dovecot-dict-mysql.conf
}
disable_plaintext_auth = no
first_valid_gid = 120
first_valid_uid = 120
last_valid_gid = 120
last_valid_uid = 120
listen = *
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_gid = vmail
mail_home = /home/vmail/%Ld/%Ln
mail_location = maildir:/home/vmail/%Ld/%Ln
mail_plugins = quota acl expire
mail_uid = vmail
managesieve_notify_capability = mailto
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date ihave
namespace {
  list = children
  location = maildir:%%h:INDEX=%h/shared/%%u
  prefix = shared/%%u/
  separator = /
  subscriptions = yes
  type = shared
}
namespace inbox {
  inbox = yes
  location = 
  mailbox Drafts {
    special_use = Drafts
  }
  mailbox Junk {
    special_use = Junk
  }
  mailbox Sent {
    special_use = Sent
  }
  mailbox Trash {
    special_use = Trash
  }
  prefix = 
  separator = /
  type = private
}
passdb {
  args = /etc/dovecot/dovecot-mysql.conf
  driver = sql
}
plugin {
  acl = vfile
  acl_shared_dict = file:/home/vmail/%Ld/shared-mailboxes.db
  expire = Trash 7
  expire2 = Trash/* 7
  expire3 = Spam 30
  expire_dict = proxy::expire
  quota = dict:User quota::proxy::quota
  quota_rule = *:
  sieve = /home/vmail/%Ld/%n/active.sieve
  sieve_dir = /home/vmail/%Ld/%n/sieve
  sieve_max_script_size = 1M
  sieve_quota_max_scripts = 50
  sieve_quota_max_storage = 1M
}
postmaster_address = [email protected]
protocols = " imap sieve pop3"
service auth {
  unix_listener /var/spool/postfix/private/auth {
    group = postfix
    mode = 0600
    user = postfix
  }
}
service dict {
  unix_listener dict {
    group = vmail
    mode = 0600
    user = vmail
  }
}
ssl_cert = </etc/ssl/mail.stupin.su.public.pem
ssl_key = </etc/ssl/mail.stupin.su.private.pem
userdb {
  args = /etc/dovecot/dovecot-mysql.conf
  driver = sql
}
protocol lda {
  mail_plugins = quota acl expire sieve
}
protocol imap {
  mail_plugins = quota acl expire imap_quota imap_acl
}

Примечание от 27 марта 2022 года: Дополнил описание плагина acl.

На этом заметку, посвящённую настройке Dovecot, можно считать оконченой. Продолжение: Установка и настройка Postfix, OpenDKIM, ClamAV-Milter, Milter-Greylist. Или можете продолжить настройку на основе Exim: Настройка Exim

Установка и настройка mysql для postfix и roundcube

Базу данных MySQL мы будем использовать сразу для двух целей: хранение учетных данных пользователей Postfix и хранение конфигурации и данных Roundcube.

Установим базу данных MySQL, PHP и веб-сервер Apache:

sudo apt install mysql-server mysql-client apache2 libapache2-mod-php php php-imap php-mysql php-mbstring

Запускаем MySQL, веб-сервер и добавим их в автозагрузку:

sudo systemctl start apache2
sudo systemctl enable apache2
sudo systemctl start mysql
sudo systemctl enable mysql

После установки базы данных, зададим пароль для учетной записи root и создадим базы данных для Postfix и Roundcube:

sudo mysql -u root -p

В консоли mysql> выполняем следующие команды, подтверждая каждую нажатием Enter:

Хранилище

Настройка хранилища в упрощенной конфигурации с локальными учетками упирается всего лишь в один параметр:

Запись означает, что почта будет храниться в формате maildir9 (maildir:) в домашнем каталоге текущего пользователя (~/) внутри папки Maildir (Maildir), используя иерархию каталогов (:LAYOUT=fs), а не в плоском виде как то подразумевает формат Maildir 10.

На этом настройка хранилища завершена.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *