Настройка Postfix + Dovecot + LDAP

Используемые термины: Postfix, DovecotActive Directory, Linux.

Мы рассмотрим пошаговый процесс настройки интеграции почтовой системы Postfix + Dovecot с LDAP на базе Active Directory. Чтобы нам было проще разобраться с этим, начнем с обычной аутентификации, затем подключим LDAP и, наконец, настроим виртуальных пользователей, хранящихся в службе каталогов. Также мы рассмотрим примеры для систем на базе Debian/Ubuntu и Red Hat/Centos.

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

Перед тем, как мы начнем настройку, убедимся, что для почтового сервера у нас открыты необходимые порты в брандмауэре. В зависимости от используемой системы управления 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 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 update

apt 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

Добавляем строки (или меняем значения):

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 к следующему виду:

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 в Postfix

Создаем тестового пользователя и группу в службе каталогов AD. Например, master@dmosk.local и group@dmosk.local. Обязательно, заполняем для них поле с почтовым адресом. В группу добавим созданного тестового пользователя.

Для получения почты нам нужно настроить виртуальные ящики, информация о которых хранится в 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.

Для систем Linux нужно установить пакет postfix-ldap:

а) на базе Debian (Ubuntu):

apt install postfix-ldap

б) на базе RPM:

yum install postfix-ldap

Открываем конфигурационный файл postfix:

vi /etc/postfix/main.cf

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

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 = dmosk.local dmosk.ru
smtpd_sender_login_maps = ldap:/etc/postfix/ldap_sender_login_maps.cf
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 — домены, для которых наш сервер будет принимать почту. Если их несколько, перечисляем через пробел.
  • smtpd_sender_login_maps — карта для поиска учетных записей отправителей.
  • virtual_alias_maps — путь хранения алиасов для виртуальных пользователей, а также формат хранения — в нашем случае ldap.
  • virtual_mailbox_maps — формат и путь хранения почтовых ящиков для виртуальных пользователей.

В нашем конфиге создано 3 карты для получения данных из AD — ldap_sender_login_maps.cf, ldap_virtual_alias_maps.cf и ldap_virtual_mailbox_maps.cf. Создаем эти файлы с описанием того, как нужно извлекать данные.

1) Создаем карту для отправителей:

vi /etc/postfix/ldap_sender_login_maps.cf

server_host      = dmosk.ru
server_port      = 389
version          = 3
bind             = yes
start_tls        = no
bind_dn          = postfix
bind_pw          = postfix_password
search_base      = ou=Пользователи,dc=dmosk,dc=ru
scope            = sub
query_filter     = (&(objectClass=person)(mail=%s))
result_attribute = mail
debuglevel       = 0

Проверяем получение адреса для пользователя:

postmap -q master@dmosk.ru ldap:/etc/postfix/ldap_sender_login_maps.cf

* обратите внимание, что пользователь LDAP у нас в домене dmosk.local, но мы ищем пользователя по почтовому домену dmosk.ru.

В итоге, мы должны получить в качестве результата свой email:

master@dmosk.ru

Если команда вернула нам результат, мы на правильном пути. В противном случае, в карте меняем значение опций debuglevel на 1 и смотрим лог в файле /var/log/maillog.

2) Создаем файл для получения алиасов:

vi /etc/postfix/ldap_virtual_alias_maps.cf

server_host              = dmosk.ru
server_port              = 389
version                  = 3
bind                     = yes
start_tls                = no
bind_dn                  = postfix
bind_pw                  = postfix_password
search_base              = ou=Пользователи,dc=dmosk,dc=ru
scope                    = sub
query_filter             = (&(objectClass=group)(mail=%s))
special_result_attribute = member
leaf_result_attribute    = mail
result_attribute         = mail
debuglevel               = 0

Проверяем списки пользователей в группах:

postmap -q group@dmosk.ru ldap:/etc/postfix/ldap_virtual_alias_maps.cf

master@dmosk.ru

3) Создаем файл для получения почтовых ящиков: 

vi /etc/postfix/ldap_virtual_mailbox_maps.cf

server_host      = dmosk.ru
server_port      = 389
version          = 3
bind             = yes
start_tls        = no
bind_dn          = postfix
bind_pw          = postfix_password
search_base      = ou=Пользователи,dc=dmosk,dc=ru
scope            = sub
query_filter     = (&(|(mail=%s)(otherMailbox=%u@%d))(objectClass=person))
result_attribute = mail
debuglevel       = 0

* где для вышеописанных файлов:

  • version — версия ldap. Как правило, третья.
  • server_host — имя нашего сервера ldap (в моем примере указан домен, так как по нему у меня разрешается кластер LDAP).
  • search_base — базовый контейнер, в котором мы ищем наших пользователей.
  • query_filter — фильтр для поиска учетных записей пользователей. Формат зависит от того, какую реализацию для LDAP мы используем.
  • result_filter — (или result_format) формат для вывода найденных результатов. Рассмотрим возможные варианты для master@dmosk.local:
    • %s — возвращает результат как есть, то есть, master@dmosk.local.
    • %u — упускает домен, то есть, master.
    • %d — возвращает доменную часть, то есть, dmosk.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 — пароль от записи для прохождения авторизации.

Проверяем, что система вернет почтовый ящик:

postmap -q master@dmosk.ru ldap:/etc/postfix/ldap_virtual_mailbox_maps.cf

master@dmosk.ru

С картами закончили. Теперь продолжаем настройку Postfix.

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

vi /etc/postfix/master.cf

Добавляем строки:

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. Возможны варианты yn и . Прочерк означает неприменимость данного параметра к конкретному сервису.
  • второй "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

3. Настройка Dovecot + LDAP

И так, наш сервер требует ввода логина и пароля от системных учетных записей для отправки писем. Теперь сделаем так, чтобы эти учетные записи брались из LDAP (на примере Active Directory).

В службе каталогов нам нужна учетная запись со стандартными правами — ее мы будем использовать для подключения к LDAP. Создаем служебную учетную запись, например, postfix в корневом контейнере Users. Таким образом, в моем примере, это будет запись cn=postfix,cn=Users,dc=dmosk,dc=local (в домене dmosk.local).

Теперь возвращаемся на наш сервер. Если у нас Debian/Ubuntu, необходимо установить пакет dovecot-ldap:

apt update

apt install dovecot-ldap

Открываем файл:

vi /etc/dovecot/dovecot-ldap.conf.ext

* в системах deb файл уже будет создан и в нем будут приведены примеры настройки; в системах RPM файл будет создан новый файл.

Добавляем в него следующее:

hosts            = dmosk.local
ldap_version     = 3
auth_bind        = yes
dn               = cn=postfix,cn=Users,dc=dmosk,dc=local
dnpass           = ldap-password-for-postfix
base             = ou=Пользователи,dc=dmosk,dc=local
scope            = subtree
deref            = never

user_filter     = (&(objectClass=person)(mail=%u))
pass_filter     = (&(objectClass=person)(mail=%u))
user_attrs      = 
    =uid=1024,
    =gid=1024

* где:

  • 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. Обратите внимание, что в качестве поля поиска учетной записи мы будем использовать mail.
  • user_filter — фильтр для поиска учетных записей пользователей. Формат зависит от того, какую реализацию для LDAP мы используем. Обратите внимание, что в качестве поля поиска учетной записи мы будем использовать mail.

Не знаю причину, но если для base указать корневой путь к домену, например, dc=dmosk,dc=local, наша связка не будет работать, а система вернет ошибку … failed: Operations error.

Открываем файл:

vi /etc/dovecot/conf.d/10-auth.conf

Комментируем строку для использования аутентификации по системных учетных записям и снимаем комментарий для аутентификации в ldap. Получим следующий результат:

#!include auth-system.conf.ext

!include auth-ldap.conf.ext

Открываем файл:

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 — допишем в него еще одну настройку:

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

* auth-userdb — сокет для авторизации через dovecot-lda. Опция mode задает права на сокет, например, 666 позволит любому пользователю к нему подключиться; user и group задает пользователя и группу владельцев на сокет.
* обратите внимание, что unix_listener auth-userdb уже существует в открытом файле, поэтому нам нужно либо его привести к данному виду, либо закомментировать то, что было и вставить новый вариант.

Также добавим строки:

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

* данной опцией мы разрешаем автоматически создавать каталоги для почтовых ящиков.

Проверяем корректность настройки dovecot:

doveconf > /dev/null

И перезапускаем его:

systemctl restart dovecot

Проверим наши настройки. Подключимся к нашему SMTP телнетом:

telnet localhost 143

Если система пришлет ошибку, устанавливаем telnet.

а) на системы DEB:

apt install telnet

б) на системы RPM:

yum install telnet

Мы должны увидеть что-то на подобие:

Trying 127.0.0.1…
Connected to localhost.
Escape character is '^]'.
* OK … ready.

После вводим команду для аутентификации (точка в начале обязательна):

. login master@dmosk.local user_password

* где master@dmosk.local — созданный в AD пользователь для теста; user_password — его пароль.

Если все корректно работает, мы должны увидеть:

. OK … Logged in

Возвращаемся к настроенному почтовому клиенту и меняем параметры для авторизации с smtptest на учетную запись из домена, например, master@dmosk.local. Проверяем отправку письма — системы должна запросить пароль и отправить письмо при успешной проверке пользователя.

Читайте также

Вам могут оказаться полезными следующие статьи:

1. Установка и использование веб-интерфейса для работы с почтой Roundcube на выделенный сервер.

2. Большой почтовый сервер на Ubuntu + настройка DNS для корректной отправки почты без попадания в СПАМ.

3. Почтовый сервер Postfix на CentOS 7 с виртуальными доменами, системой управления, веб-доступом с хранением данных в MySQL.

4. Полноценный почтовый сервер на CentOS 8.

5. Установка Postfixadmin на CentOS.

6. Развертывание готового почтового сервера iRedMail на Ubuntu или CentOS.

Комментарии

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

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