Categories: Шпаргалки

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

Используемые термины: Postfix , Dovecot , Active 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@remontka.local и group@remontka.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 = remontka.local remontka.com
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 = remontka.com
server_port = 389
version = 3
bind = yes
start_tls = no
bind_dn = postfix
bind_pw = postfix_password
search_base = ou=Пользователи,dc=remontka,dc=ru
scope = sub
query_filter = (&(objectClass=person)(mail=%s))
result_attribute = mail
debuglevel = 0

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

postmap -q master@remontka.com ldap:/etc/postfix/ldap_sender_login_maps.cf

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

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

master@remontka.com

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

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

vi /etc/postfix/ldap_virtual_alias_maps.cf

server_host = remontka.com
server_port = 389
version = 3
bind = yes
start_tls = no
bind_dn = postfix
bind_pw = postfix_password
search_base = ou=Пользователи,dc=remontka,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@remontka.com ldap:/etc/postfix/ldap_virtual_alias_maps.cf

master@remontka.com

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

vi /etc/postfix/ldap_virtual_mailbox_maps.cf

server_host = remontka.com
server_port = 389
version = 3
bind = yes
start_tls = no
bind_dn = postfix
bind_pw = postfix_password
search_base = ou=Пользователи,dc=remontka,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@remontka.local:
    • %s — возвращает результат как есть, то есть, master@remontka.local.
    • %u — упускает домен, то есть, master.
    • %d — возвращает доменную часть, то есть, remontka.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@remontka.com ldap:/etc/postfix/ldap_virtual_mailbox_maps.cf

master@remontka.com

С картами закончили. Теперь продолжаем настройку 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. Возможны варианты 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

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

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

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

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

apt update

apt install dovecot-ldap

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

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

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

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

hosts = remontka.local
ldap_version = 3
auth_bind = yes
dn = cn=postfix,cn=Users,dc=remontka,dc=local
dnpass = ldap-password-for-postfix
base = ou=Пользователи,dc=remontka,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=remontka,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@remontka.local user_password

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

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

. OK … Logged in

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

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

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

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

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

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

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

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

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

admin

Recent Posts

Что такое Zulip

Zulip — программное обеспечение для реализации корпоративного чата. Разработан в 2012 году, в 2014 был…

2 месяца ago

Что такое Zookeeper

Zookeeper — cервис-координатор, который позволяет обеспечить контроль синхронизации данных. Разработан на Java компанией Apache Software…

2 месяца ago

Что такое Zimbra

Zimbra — программное обеспечение для реализации почтового сервиса или, если сказать точнее, автоматизации совместной деятельности…

2 месяца ago

Что такое Zabbix

Zabbix — бесплатная система мониторинга. Позволяет отслеживать состояние сетевых узлов, компьютеров и серверов. Возможности: Поддержка…

2 месяца ago

Что такое YouTube

YouTube — компания-владелец одноименного портала для просмотра и хранения видео. Чтобы пользоваться данным порталом достаточно…

2 месяца ago

Что такое yota

Yota — провайдер, предоставляющий доступ к сети Интернет по беспроводной связи. Впервые, сервис начал работать…

2 месяца ago