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
Discussion