Differences

This shows you the differences between two versions of the page.


Previous revision
linux_faq:postfix-dovecot-и-active-directory [2019/02/11 09:13] (current) – external edit 127.0.0.1
Line 1: Line 1:
 +====== 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**:
 +<code>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,</code>
 + \\
 +В файле **/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**
 +<code>
 +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
 +</code>
 +
 +**/etc/postfix/ldap/aliases.cf**
 +<code>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
 +</code>
 +
 +**/etc/postfix/ldap/redirect.cf**
 +<code>
 +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
 +</code>
 +
 +**/etc/postfix/ldap/mailgroups.cf**
 +<code>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
 +</code>
 +Как видно, пользователей **postfix** обнаруживает по заполненному атрибуту **mail**, алиас по списку адресов в атрибуте **otherMailboxes**, для редиректа используем **userPrincipalName**, ну а список рассылки у нас не что иное, как группа распространения в **AD**, а список получателей - члены данной группы.\\
 +
 +Таким образом, если нужно изменить e-mail адрес пользователя, то изменяем его в атрибуте **mail**. Если у пользователя будет несколько адресов (алиасов), то в **otherMailboxes** добавляем их все (ADSIedit в помощ), а если нам нужен ящик для группы рассылки, заводим группу распространения, в атрибуте **mail** для нее пишем адрес группы и включаем необходимых участников.\\
 +
 +======dovecot======
 +За доставку почты в ящики  нас отвечает **dovecot**.\\
 +В **main.cf** указан транспорт\\
 +<code>virtual_transport = dovecot</code>
 +
 +И описываем этот транспорт в **master.cf**:\\
 +<code>dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${mailbox}</code>
 +
 +Так как пользователи у нас виртуальный, то фактически почта складывается в ящики от имени пользователя **vmail**.\\
 +Куда же падают наши письма? Смотрим в конфиг **dovecot** (у меня он тут - **/etc/dovecot/dovecot.conf**):\\
 +<code>mail_location = maildir:/home/DOMAIN.RU/%Lu/Maildir</code>
 +
 +где **%Lu** тут - имя пользователя.\\
 +
 +Почта в ящике! Осталось ее забрать :-)\\
 +Править конфиг по-умолчанию практически не приходится. Существенный момент - позаботимся об авторизации. Будем использовать запросы к **LDAP**. В разделе **auth default** (все в том же **dovecot.conf**) добавим:
 +<code>passdb ldap { args = /etc/dovecot/dovecot-ldap.conf }</code>
 +
 +И сам **dovecot-ldap.conf** (напоминает нам конфиги **postfix**):
 +<code>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))</code>
 +
 +Таким образом, **dovecot** складывает почту по папкам виртуальных пользователей и авторизует в **LDAP**.
 +
 +Немного более подробно я описал настроку почтовика на примере **iRedMail**: [[linux_faq:redmail_install_and_ad_config|Установка iRedMail на Ubuntu 14.04-minimal]]