postfix, dovecot и Active Directory

Реализовать почтовик на Linux с пользователями из Active Directory можно по-разному. Рассмотрим случай, когда почту принимает, отправляет, а так же фильтрует postfix, а раскладывает по папкам и отдает по imap - dovecot.

Postfix

Postfix фильтрует входящую почту как своими средствами (проверка на различные аспекты соответствия письма и сервера отправителя rfc), а так же прогоняет ее через amavisd, который в свою очередь использует spamassassin для категоризации писем на хорошие и спамные, и проверяет на вирусы.

В этом пункте стоит обратить внимание на то, как postfix связан c Active Directory, и, главное, зачем.

В нашей системе есть обычные пользователи, алиасы почтовых ящиков и списки рассылки. И всем этим добром мы командуем через оснастку управления Active Directory Users and computers. А Postfix, использую LDAP, проверяет, есть ли пользователь, которому написано письмо, или же письмо надо отправить кому-то другому, на чей алиас пришло письмо, а может и вовсе это письмо адресовано целой группе юзеров?

Заглянем в наш /etc/postfix/main.cf:

virtual_mailbox_maps = ldap:/etc/postfix/ldap/local_recipients.cf
virtual_alias_maps = ldap:/etc/postfix/ldap/redirect.cf,ldap:/etc/postfix/ldap/aliases.cf,ldap:/etc/postfix/ldap/mailgroups.cf,


В файле /etc/postfix/ldap/local_recipients.cf postfix смотрит, какому пользователю отправить письмо, в /etc/postfix/ldap/redirect.cf, как можно догадаться, адрес получателя проверяется на соответствие редиректам, в /etc/postfix/ldap/aliases.cf - алиасам, а в /etc/postfix/ldap/mailgroups.cf спискам рассылки.

/etc/postfix/ldap/local_recipients.cf

debuglevel = 0
version = 3
server_host = ldap://ldap_server_ip
search_base = ou=Users,dc=domain,dc=local
query_filter = (userPrincipalName=%s)
result_attribute = sAMAccountName
result_format = %u/
bind_dn = ldap-bind@domain.local
bind_pw = p@$$word
cache = no

/etc/postfix/ldap/aliases.cf

debuglevel = 0
version = 3
server_host = ldap://ldap_server_ip
search_base = ou=Users,dc=domain,dc=local
timeout = 3
query_filter = (otherMailbox=%s)
result_filter = %s
result_attribute = userPrincipalName
special_result_attribute = member
scope = sub
bind = yes
bind_dn = ldap-bind@domain.local
bind_pw = p@$$word

/etc/postfix/ldap/redirect.cf

mail:/etc/postfix/ldap# cat redirect.cf
debuglevel = 0
version = 3
server_host = ldap://ldap_server_ip
search_base = ou=Users,dc=domain,dc=local
timeout = 3
query_filter = (&(userPrincipalName=%s)(sAMAccountType=805306368))
result_filter = %s
result_attribute = mail
special_result_attribute = member
scope = sub
bind = yes
bind_dn = ldap-bind@domain.local
bind_pw = p@$$word

/etc/postfix/ldap/mailgroups.cf

debuglevel = 0
version = 3
server_host = ldap://ldap_server_ip
search_base = ou=Users,dc=domain,dc=local
timeout = 3
query_filter = (&(mail=%s)(sAMAccountType=268435457))
result_filter = %s
result_attribute = userPrincipalName
special_result_attribute = member
scope = sub
bind = yes
bind_dn = ldap-bind@domain.local
bind_pw = p@$$word

Как видно, пользователей postfix обнаруживает по заполненному атрибуту mail, алиас по списку адресов в атрибуте otherMailboxes, для редиректа используем userPrincipalName, ну а список рассылки у нас не что иное, как группа распространения в AD, а список получателей - члены данной группы.

Таким образом, если нужно изменить e-mail адрес пользователя, то изменяем его в атрибуте mail. Если у пользователя будет несколько адресов (алиасов), то в otherMailboxes добавляем их все (ADSIedit в помощ), а если нам нужен ящик для группы рассылки, заводим группу распространения, в атрибуте mail для нее пишем адрес группы и включаем необходимых участников.

dovecot

За доставку почты в ящики нас отвечает dovecot.
В main.cf указан транспорт

virtual_transport = dovecot

И описываем этот транспорт в master.cf:

dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${mailbox}

Так как пользователи у нас виртуальный, то фактически почта складывается в ящики от имени пользователя vmail.
Куда же падают наши письма? Смотрим в конфиг dovecot (у меня он тут - /etc/dovecot/dovecot.conf):

mail_location = maildir:/home/DOMAIN.RU/%Lu/Maildir

где %Lu тут - имя пользователя.

Почта в ящике! Осталось ее забрать :-)
Править конфиг по-умолчанию практически не приходится. Существенный момент - позаботимся об авторизации. Будем использовать запросы к LDAP. В разделе auth default (все в том же dovecot.conf) добавим:

passdb ldap { args = /etc/dovecot/dovecot-ldap.conf }

И сам dovecot-ldap.conf (напоминает нам конфиги postfix):

hosts = ldap-server-ip:3268 //наш LDAP-сервер
dn = CN=ldap-user,OU=some_ou,DC=domain,DC=local //путь к учеткам в AD
dnpass = P@$$word
auth_bind = yes
ldap_version = 3
base = dc=domain,dc=ru
deref = searching
scope = subtree
user_filter = (&(ObjectClass=person)(sAMAccountName=%u))
pass_filter = (&(ObjectClass=person)(sAMAccountName=%u))

Таким образом, dovecot складывает почту по папкам виртуальных пользователей и авторизует в LDAP.

Немного более подробно я описал настроку почтовика на примере iRedMail: Установка iRedMail на Ubuntu 14.04-minimal

Enter your comment. Wiki syntax is allowed:
 
  • linux_faq/postfix-dovecot-и-active-directory.txt
  • Last modified: 2019/02/11 09:13
  • by 127.0.0.1