Thank you for reading this post, don't forget to subscribe!
рассмотрим пошаговый процесс настройки интеграции почтовой системы Postfix + Dovecot с LDAP на базе Active Directory. начнем с обычной аутентификации, затем подключим LDAP и, наконец, настроим виртуальных пользователей, хранящихся в службе каталогов. Также мы рассмотрим примеры для систем на базе Debian/Ubuntu и Red Hat/Centos.
Postfix - программный продукт, позволяющий организовать почтовый сервер. Является бесплатным и устанавливается на операционные системы семейства UNIX.
Dovecot - сервер для предоставления доступа к почтовым ящикам по протоколам POP3 и IMAP.
Dovecot разработан для операционных систем на базе UNIX, например, Ubuntu, CentOS, FreeBSD, Debian. Чаще всего, настраивается для совместной работы с Postfix и Exim.
Позиционируется, как безопасное решение для доступа к почте. Имеется поддержка множества способов аутентификации, защиты информации с помощью шифрования, возможность гибкой настройки прав для почтовых каталогов.
Основной конфигурационный файл находится по пути /etc/dovecot/dovecot.conf или /usr/local/etc/dovecot/dovecot.conf. Однака, в более новых версиях настройки разбиты по файлам, которые расположены в каталоге /etc/dovecot/conf.d — каждый из них отвечает за свою часть настроек.
Active Directory — служба каталогов от корпорации Microsoft. Сервер, на который ставится данная роль называют контроллером домена. Также на данный сервер, очень часто, устанавливают службы DHCP и DNS для полной интеграции.
Active Directory нужен для хранения информации о ресурсах компании (компьютерах, пользователях, принтерах и так далее) и предоставляет следующие возможности:
- Сервис аутентификации (проверки логина и пароля).
- Массовое распространение настроек всем пользователям и компьютерам сети.
- База данных для хранения настроек совместимых приложений (например, Exchange).
Настройка брандмауэра
Перед тем, как мы начнем настройку, убедимся, что для почтового сервера у нас открыты необходимые порты в брандмауэре. В зависимости от используемой системы управления netfilter команды будут отличаться.
Для Iptables
Как правило, Iptables используется для систем на базе Debian.
Для того, чтобы открыть нужные нам порты, вводим:
iptables -I INPUT 1 -p tcp --match multiport --dports 25,465,587 -j ACCEPT
iptables -I INPUT 1 -p tcp --match multiport --dports 110,143,993,995 -j ACCEPT
* где мы откроем следующие порты:
- 25 — стандартный SMTP через STARTTLS;
- 110 — стандартный POP3 через STARTTLS;
- 143 — стандартный IMAP через STARTTLS;
- 465 — защищенный SMTP через SSL/TLS;
- 587 — защищенный SMTP через STARTTLS;
- 993 — защищенный IMAP через SSL/TLS;
- 995 — защищенный POP3 через SSL/TLS.
Для сохранения правил установим пакет:
apt-get install iptables-persistent
И выполняем команду:
netfilter-persistent save
Firewalld
Firewalld, в основном, используется в системах на базе Red Hat.
Для открытия нужных нам портов вводим команды:
firewall-cmd --permanent --add-port=25/tcp --add-port=465/tcp --add-port=587/tcp
firewall-cmd --permanent --add-port=110/tcp --add-port=143/tcp --add-port=993/tcp --add-port=995/tcp
И применяем настройки:
firewall-cmd --reload
* где мы откроем следующие порты:
- 25 — стандартный SMTP через STARTTLS;
- 110 — стандартный POP3 через STARTTLS;
- 143 — стандартный IMAP через STARTTLS;
- 465 — защищенный SMTP через SSL/TLS;
- 587 — защищенный SMTP через STARTTLS;
- 993 — защищенный IMAP через SSL/TLS;
- 995 — защищенный POP3 через SSL/TLS.
1. Настройка аутентификации на Postfix
Аутентификация на postfix будет выполняться методом dovecot. Для этого устанавливаем его. Заодно, устанавливаем и postfix (на случай, если его нет еще в системе). В зависимости от используемой операционной системы используем разные команды.
а) если используем Ubuntu / Debian:
apt-get update
apt-get install postfix dovecot-imapd dovecot-pop3d
б) если используем CentOS / Red Hat:
yum install postfix dovecot
После установки пакетов, разрешаем автозапуск dovecot и postfix:
systemctl enable postfix dovecot
Открываем на редактирование конфигурационный файл нашего MTA Postfix:
vi /etc/postfix/main.cf
Добавляем строки (или меняем значения):
1 2 3 4 5 6 7 |
smtpd_sasl_type = dovecot smtpd_sasl_auth_enable = yes smtpd_sasl_path = private/auth smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination |
* где:
- smtpd_sasl_type — тип плагина, который используется для SASL-аутентификации. Командой postconf -a мы можем получить список механизмов аутентификации, которые поддерживаются почтовой системой.
- smtpd_sasl_auth_enable — разрешает или запрещает аутентификацию по механизму SASL.
- smtpd_sasl_path — путь до файла для обмена аутентификационной информацией. Используется для взаимодействия нескольких систем — в нашем примере Postfix + Dovecot.
- smtpd_relay_restrictions — правила разрешения и запрета использования MTA при пересылке. В нашем случае:
- permit_mynetworks — разрешить отправку с компьютеров, чьи IP-адреса соответствуют настройке mynetworks.
- permit_sasl_authenticated — разрешить отправку писем тем, кто прошел авторизацию.
- reject_unauth_destination — запретить всем, кто не прошел проверку подлинности.
Проверяем корректность настройки:
postconf > /dev/null
Если команда не вернула ошибок, перезапускаем Postfix:
systemctl restart postfix
Переходим к настройке dovecot — открываем файл:
vi /etc/dovecot/conf.d/10-master.conf
… и приводим опцию service auth к следующему виду:
1 2 3 4 5 6 7 8 9 |
service auth { ... unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix } ... } |
* если соответствующей секции unix_listener нет, то ее нужно создать. Обратите внимание, что для обмена аутентификационными данными мы применяем файл /var/spool/postfix/private/auth, который в конфигурационном файле postfix был указан, как private/auth.
Отключаем требование ssl для аутентификации (на текущем этапе нам это не нужно):
vi /etc/dovecot/conf.d/10-ssl.conf
Проверяем, чтобы значение ssl не было required:
ssl = yes
* нас устроит оба варианта — yes или no.
Настройки аутентификации приводим к следующему виду:
vi /etc/dovecot/conf.d/10-auth.conf
auth_mechanisms = plain login
* данные механизмы позволяют передачу данных в открытом виде.
В этом же файле проверяем, что снят комментарий со следующей строки:
!include auth-system.conf.ext
Проверяем корректность настройки dovecot:
doveconf > /dev/null
Если команда ничего не вернула, перезапускаем сервис:
systemctl restart dovecot
В качестве логина и пароля можно использовать любую системную учетную запись. Создадим ее для теста:
useradd smtptest
passwd smtptest
Мы настроили простую аутентификацию на сервере SMTP. Для проверки можно воспользоваться любым почтовым клиентом. Пример настройки thunderbird:
Пробуем отправить письмо. Отправка должна потребовать ввода логина и пароль — используем аутентификационные данные для записи, созданной выше.
Мы завершили настройку аутнтификации на postfix при отправке письма. Добавим проверку данных через LDAP.
2. Подключение LDAP
И так, наш сервер требует ввода логина и пароля от системных учетных записей для отправки писем. Теперь сделаем так, чтобы эти учетные записи брались из LDAP (на примере Active Directory).
В службе каталогов нам нужна учетная запись со стандартными правами — ее мы будем использовать для подключения к LDAP. Создаем служебную учетную запись, например, postfix в корневом контейнере Users. Таким образом, в моем примере, это будет запись cn=postfix,cn=Users,dc=test,dc=local (в домене test.local).
Теперь возвращаемся на наш сервер. Если у нас Debian/Ubuntu, необходимо установить пакет dovecot-ldap:
apt-get install dovecot-ldap
Открываем файл:
vi /etc/dovecot/dovecot-ldap.conf.ext
* в системах deb файл уже будет создан и в нем будут приведены примеры настройки; в системах RPM файл будет создан новый файл.
Добавляем в него следующее:
1 2 3 4 5 6 7 8 9 10 11 |
hosts = test.local ldap_version = 3 auth_bind = yes dn = cn=postfix,cn=Users,dc=test,dc=local dnpass = ldap-password-for-postfix base = ou=Пользователи,dc=test,dc=local scope = subtree deref = never pass_filter = (&(objectCategory=Person)(sAMAccountName=%n)) user_filter = (&(objectCategory=Person)(sAMAccountName=%n)) |
* где:
- hosts — имя нашего сервера ldap (в моем примере указан домен, так как по нему у меня разрешается кластер LDAP).
- ldap_version — версия ldap. Как правило, третья.
- auth_bind — указываем, нужно ли выполнять аутентификацию при связывании с LDAP.
- dn — учетная запись для прохождения авторизации при связывании со службой каталогов.
- dnpass — пароль от записи для прохождения авторизации.
- base — базовый контейнер, в котором мы ищем наших пользователей. Нельзя использовать поиск на уровне домена. Внимательнее проверяем путь на предмет использования контейнеров (CN) или организационных юнитов (OU).
- scope — указывает на каком уровне нужно искать пользователей:
- subtree — во всех вложенных контейнерах.
- onelevel — во всех вложенных контейнерах, но на один уровень.
- base — только в контейнере, который указан в base.
- deref — параметр означает использование поиска по разыменованным псевдонимам. К сожалению, не нашел подробного описания. Обычно, не используется.
- pass_filter — фильтр для поиска паролей пользователей. Его формат зависит от используемой реализации LDAP. В нашем примере это Active Directory.
- user_filter — фильтр для поиска учетных записей пользователей. Формат зависит от того, какую реализацию для LDAP мы используем.
Не знаю причину, но если для base указать корневой путь к домену, например, dc=test,dc=local, наша связка не будет работать, а система вернет ошибку … failed: Operations error.
Открываем файл:
vi /etc/dovecot/conf.d/10-auth.conf
Комментируем строку для использования аутентификации по системных учетных записям и снимаем комментарий для аутентификации в ldap. Получим следующий результат:
#!include auth-system.conf.ext
…
!include auth-ldap.conf.ext
Проверяем корректность настройки dovecot:
doveconf > /dev/null
И перезапускаем его:
systemctl restart dovecot
Возвращаемся к настроенному почтовому клиенту и меняем параметры для авторизации с smtptest на учетную запись из домена, например, master@test.local. Проверяем отправку письма — системы должна запросить пароль и отправить письмо при успешной проверке пользователя.
Можно переходить к настройке почтовых ящиков для пользователей из LDAP.
3. Виртуальные пользователи LDAP
Для получения почты нам осталось настроить виртуальные ящики, информация о которых хранится в LDAP. Для этого выполним настройку Postfix и Dovecot.
Создаем учетную запись, от которой будут выполняться задачи чтения и записи почтовых ящиков в каталоге на сервере:
groupadd -g 1024 vmail
useradd -d /home/mail -g 1024 -u 1024 vmail
* первой командой мы создаем группу vmail с идентификатором 1024. Вторая команда создает пользователя vmail с домашней директорией /home/mail и идентификатором 1024; пользователь входит в группу vmail, созданную первой командой. В вашей системе идентификатор 1024 может быть уже занят — в этом случае меняем его на другой номер и ниже по инструкции заменяем значение 1024 на свое.
Создаем домашнюю директорию для пользователя:
mkdir /home/mail
Задаем в качестве владельца нашего созданного пользователя:
chown vmail:vmail /home/mail
Мы будем хранить всю почту пользователей в каталоге /home/mail.
Для систем на базе Debian (Ubuntu) нужно также установить postfix-ldap:
apt-get install postfix-ldap
Открываем конфигурационный файл postfix:
vi /etc/postfix/main.cf
Добавляем следующие строки:
1 2 3 4 5 6 7 8 |
virtual_transport = dovecot virtual_minimum_uid = 1024 virtual_uid_maps = static:1024 virtual_gid_maps = static:1024 virtual_mailbox_base = /home/mail virtual_mailbox_domains = test.local test.ru virtual_alias_maps = ldap:/etc/postfix/ldap_virtual_alias_maps.cf virtual_mailbox_maps = ldap:/etc/postfix/ldap_virtual_mailbox_maps.cf |
* где:
- virtual_transport — указывает куда дальше должна передаваться полученная почта для обработки. В нашем примере, после постфикса она отправится в dovecot.
- virtual_minimum_uid — с какого номера присваивать идентификаторы пользователям.
- virtual_uid_maps — от какого идентификатора пользователя будет работать доставка сообщений. В нашем примере это 1024, который присвоен пользователю vmail.
- virtual_gid_maps — идентификатор группы пользователя для доставки сообщений — 1024 (vmail).
- virtual_mailbox_base — каталог, где будут храниться почтовые ящики пользователей и сами письма.
- virtual_mailbox_domains — домены, для которых наш сервер будет принимать почту. Если их несколько, перечисляем через пробел.
- virtual_alias_maps — путь хранения алиасов для виртуальных пользователей, а также формат хранения — в нашем случае ldap.
- virtual_mailbox_maps — формат и путь хранения почтовых ящиков для виртуальных пользователей.
В нашем конфиге создано 2 карты для получения данных из AD — ldap_virtual_alias_maps.cf и ldap_virtual_mailbox_maps.cf. Создаем эти файлы с описанием того, как нужно извлекать данные.
Создаем файл для получения алиасов:
vi /etc/postfix/ldap_virtual_alias_maps.cf
1 2 3 4 5 6 7 8 9 |
version = 3 server_host = ldap://test.local/ search_base = ou=Пользователи,dc=test,dc=local query_filter = (&(objectClass=person)(mail=%s)) result_attribute = mail scope = sub bind = yes bind_dn = cn=postfix,cn=Users,dc=test,dc=local bind_pw = test.ru135 |
Создаем файл для получения почтовых ящиков:
vi /etc/postfix/ldap_virtual_mailbox_maps.cf
1 2 3 4 5 6 7 8 9 10 11 |
version = 3 server_host = ldap://test.local/ search_base = ou=Пользователи,dc=test,dc=local query_filter = (&(objectClass=person)(mail=%s)) result_filter = %s result_attribute = mail special_result_attribute = member scope = sub bind = yes bind_dn = cn=postfix,cn=Users,dc=test,dc=local bind_pw = test.ru135 |
* где для обоих файлов:
- version — версия ldap. Как правило, третья.
- server_host — имя нашего сервера ldap (в моем примере указан домен, так как по нему у меня разрешается кластер LDAP).
- search_base — базовый контейнер, в котором мы ищем наших пользователей.
- query_filter — фильтр для поиска учетных записей пользователей. Формат зависит от того, какую реализацию для LDAP мы используем.
- result_filter — (или result_format) формат для вывода найденных результатов. Рассмотрим возможные варианты для master@test.local:
- %s — возвращает результат как есть, то есть, master@test.local.
- %u — упускает домен, то есть, master.
- %d — возвращает доменную часть, то есть, test.local.
- result_attribute — атрибут LDAP, который должен читать postfix. В реализации от Microsoft это mail.
- special_result_attribute — результат может содержать группу, по которой необходимо провести рекурсивный поиск. В этом случае Postfix будет выполнять данную рекурсию для атрибута member.
- scope — глубина поиска. Как и рассмотренная выше scope для dovecot, имеет 3 возможные значения:
- sub — во всех вложенных контейнерах.
- base — только в контейнере, который указан в base.
- one — во всех вложенных контейнерах, но на один уровень.
- bind — указываем, нужно ли выполнять аутентификацию при связывании с LDAP.
- bind_dn — учетная запись для прохождения авторизации при связывании со службой каталогов.
- bind_pw — пароль от записи для прохождения авторизации.
Открываем для редактирования файл:
vi /etc/postfix/master.cf
Добавляем строки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
submission inet n - n - - smtpd -o smtpd_tls_security_level=may -o smtpd_sasl_auth_enable=yes -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=/var/spool/postfix/private/auth -o smtpd_sasl_security_options=noanonymous -o smtpd_sasl_local_domain=$myhostname smtps inet n - n - - smtpd -o syslog_name=postfix/smtps -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient} #flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -d ${recipient} |
* необходимо убедиться, что в содержимом файла нет других раскомментированных опций для submission, smtps и dovecot (по умолчанию, их нет). В данном случае, мы настроили работу postfix на портах 25, 465 и 587. В файле master.cf мы настраиваем работу вспомогательных сервисов для Postfix. Описание каждого сервиса начинается с новой строки без отступа. Затем идут настройки для сервиса и параметры запуска. Для примера, рассмотрим первую добавленную строку —
submission inet n - n - - smtpd:
- submission — имя сервиса. Возможно использование заранее определенных в postfix служб или создание своих. В данном примере submission для подключения MUA по порту 587 при отправке почты.
- inet — тип обслуживания. Возможны варианты inet (сокет TCP/IP), unix (потоковый сокет), unix-dgram (сокет дейтаграммы), fifo (именованный канал очереди), pass (потоковый сокет UNIX-домена).
- первый "n" — является ли сервис частным и должен быть ограниченным. Возможны варианты y или n. Для типа обслуживания inet может быть только n.
- первый "-" — работает ли служба с правами root. Возможны варианты y, n и -. Прочерк означает неприменимость данного параметра к конкретному сервису.
- второй "n" — должна ли служба работать в окружении chroot. Возможны варианты y или n.
- второй "-" — через какое время в секундах пробудить службу, если она неактивна.
- третий "-" — максимальное количество одновременно выполняемых процессов, которые может запустить данный сервис.
- smtpd — выполняемая команда.
* после команды идут аргументы ее запуска. Они могут переопределять параметры, заданные в main.cf. Каждый аргумент записывается с новой строки и начинается с двух пробелов. В данном примере мы используем следующие аргументы:
- smtpd_tls_security_level — задает уровень безопасности с применением TLS. В данном примере may говорит о возможности его использования.
- smtpd_sasl_auth_enable — разрешает sasl аутентификацию.
- smtpd_sasl_type — указывает тип аутентификации.
- smtpd_sasl_path — путь до временных файлов обмена информацией с сервером хранения почты (в нашем случае Dovecot). Указывается либо абсолютный путь, либо относительный queue_directory.
- smtpd_sasl_security_options — дополнительные опции настройки sasl.
- smtpd_sasl_local_domain — добавить домен для пользователей, которые проходят smtp-аутентификацию.
- syslog_name — префикс названия службы при занесении ее в системный журнал.
- smtpd_tls_wrappermode — запускать ли службу в нестандартном режиме (для поддержки TLS).
- smtpd_client_restrictions — настройки ограничения клиентских соединений. В данном примере разрешить только авторизованных.
Обтатите внимание на dovecot — в моем примере идут 2 строки с опциями: первая для систем Debian, вторая закомментирована, и она для Red Hat. Вам необходимо оставить комментарий для нужно системы, вторую строку можно закомментировать или удалить.
Проверяем корректность настроек Postfix:
postconf > /dev/null
Если ошибок нет, перезапускаем его:
systemctl restart postfix
Переходим к настройке Dovecot. Открываем файл:
vi /etc/dovecot/conf.d/10-mail.conf
Находим опцию mail_location и приводим ее к виду:
mail_location = maildir:/home/mail/%d/%u/
* в данном примере сообщения будут храниться в более современном формате maildir в каталоге /home/mail/<почтовый домен>/<логин пользователя>.
Открываем файл:
vi /etc/dovecot/conf.d/10-master.conf
Ранее мы уже настраивали раздел service auth — допишем в него еще одну настройку:
1 2 3 4 5 6 7 8 |
service auth { ... unix_listener auth-userdb { mode = 0600 user = vmail group = vmail } } |
* auth-userdb — сокет для авторизации через dovecot-lda. Опция mode задает права на сокет, например, 666 позволит любому пользователю к нему подключиться; user и group задает пользователя и группу владельцев на сокет.
* обратите внимание, что unix_listener auth-userdb уже существует в открытом файле, поэтому нам нужно либо его привести к данному виду, либо закомментировать то, что было и вставить новый вариант.
Также добавим строки:
1 2 3 4 5 6 7 8 9 10 11 12 |
service stats { unix_listener stats-reader { user = vmail group = vmail mode = 0660 } unix_listener stats-writer { user = vmail group = vmail mode = 0660 } } |
* в противном случае, мы можем увидеть в логе ошибку error net_connect_unix(/var/run/dovecot/stats-writer) failed permission denied, так как у пользователя vmail не будет прав.
Идем далее — открываем файл:
vi /etc/dovecot/conf.d/15-lda.conf
lda_mailbox_autocreate = yes
* данной опцией мы разрешаем автоматически создавать каталоги для почтовых ящиков.
Наконец, открываем ранее настраиваемый нами файл:
vi /etc/dovecot/dovecot-ldap.conf.ext
… и добавляем:
user_attrs = \
=uid=1024, \
=gid=1024
* в данном примере мы возвращаем для найденного в LDAP пользователя атрибут с идентификатором созданного пользователя vmail. Это нужно, чтобы у нас не возникло проблем с доступом к каталогу почтовых ящиков.
Проверяем корректность настройка dovecot:
doveconf > /dev/null
И перезапустим его:
systemctl restart dovecot
Пробуем отправить письмо пользователю LDAP. Почтовый сервер должен принять письмо, а в каталоге /home/mail создать папку с доменом и email пользователя.