четверг, 30 октября 2014 г.

Интеграция почтового сервера iRedMail (Ubuntu/Debian) с Active Directory (Windows Server 2003/2008/2008R2 ) ( в одном пространстве имен!)

     Что-то я дано ничего путного не писал, на этот раз, я расскажу как интегрировать iRedMail и MS Windows Server с Active Directory на борту. Допустим, у вас есть небольшого или среднего размера компания, в ней уже есть контроллер домена (AD DC) и все функционирует как надо, но через некоторое время, появляется необходимость в настройке корпоративного почтового сервера.Необходимо подобрать будущую платформу для почтовой инфраструктуры, если руководствоваться соображениями разумного минимализма, то замену MS Exchange, можно найти в лице iRedMail, еще и бесплатной. Правда тут появляется один момент, что придется настраивать руками учетные записи пользователей в службе каталогов (Active Directory), а затем, создавать почтовые ящики на почтовом сервере и все это руками, в этой ситуации, обязательно возникнут сложности с пользователями и паролями (на вход в систему один пароль, на вход в почту другой), железобетонным, решением данной проблемы, будет интеграция этих систем между собой.


Для чего это нужно?!
Служба каталогов (Active Directory) представляет из себя централизованную базу хранения пользовательских данных и иных объектов, которая может обеспечить проверку подлинности пользователей. По сути, у нас уже есть база данных, с заполненной информацией о пользователях с сохраненными, в виде хешей, паролями и другими данными. Так почему ее не использовать?! Но переносить данные руками-совершенно не правильно, нам необходимо, этот процесс автоматизировать. Идея довольно проста, при попытке входа в почту, введенные данные пользователя будут пересылаться, для проверки подлинности, на контроллер домена, он, в свою очередь, проверив введенный пользователем пароль, разрешает вход или не разрешает- если пароль не верен, предположим, что введенный пароль верен, то пользователь получит доступ к своей почте.
У данной системы есть несомненный плюс, пользователю достаточно знать пароль, от собственной учетной записи, в Active Directory, в случае если он его забудет, то от вас, как от системного администратора, требуется его сбросить и пользователь снова может работать.
Как все это будет работать, я изобразил на схеме ниже:

Данное руководство рассчитано на работу контроллера домена и почтового сервера, в одном пространстве имен, в случае если ваши сервера имеют разные доменные имена, в настройке имеются существенные различия, для этого смотрите обновленный вариант статьи



Теперь, более подробно, о том, что я там изобразил.
У нас есть 2 сервера:
Сервер №1-Windows Server 2003/2008/2008R2 (с поднятыми ролями AD DC, DNS, NTP)
(данные службы присутствуют на любом контроллере домена!) с IP адресом 172.16.0.20 и ДНС именем DC1.example.org

Сервер №2-Linux (Ubuntu/Debian) сервер с установленной системой iRedMail (Postfix,OpenLDAP,RoundCube и прочее), который имеет IP адрес 172.16.0.100 и ДНС имя MAIL.example.org.
О том, как его поднять, я писал ранее в статье: Настройка почтового сервера iRedMail. Его необходимо только установить, никаких настроек делать, пока, не требуется.

Предполагается что оба сервера установлены и готовы к работе. Вся дальнейшая конфигурация представлена ИСКЛЮЧИТЕЛЬНО в тестовых целях, имена серверов, логины пользователей, IP адреса, пароли-необходимо заменить на свои, а пароли желательно вообще генерировать с помощью ПО, добавив им сложности!

Единственное ограничение — Dovecot воспринимает символ # как перенос, данный символ НЕЛЬЗЯ использовать в паролях!

Подготавливаем инфраструктуру к взаимодействию.

Поднимаем права до root:
В Ubuntu
sudo su

В Debian
su


нам необходимо добавить имя сервера в hosts
nano /etc/hosts


Добавляем туда:
172.16.0.20 dc1.example.org

Сохраняем изменения и выходим
Пробуем пинговать dc1.example.org
Если пинги, проходят все отлично! Если нет, то проверяем правильность написания и IP адрес контроллера домена.

Маленький, полезный, но не обязательный момент
Настроим синхронизацию времени почтового сервера с контроллером домена, это нужно для корректного отображения даты и времени получения писем, с другой стороны ничего не мешает использовать поставщиков времени в интернете, но если мы хотим получить полноценную систему, то лучше сделать это.
nano /etc/default/ntpdate

Находим строку и вписываемым туда DNS адрес контроллера домена:
NTPSERVERS="dc1.example.org"

Перезагружаем почтовый сервер, вуаля, все работает, время синхронизировалось.

Переходим на наш Windows Server 2003/2008/2008R2
Нам необходимо создать пользователя с именем iredmail, логином iredmail и паролем: password^1 Никаких админских прав, мы ему не даем-это важно! Его мы создаем в самом корне контроллера домена.

Чтобы путь к учетной записи в LDAP каталоге был cn=iredmail,dc=example,dc=org
Также, нам необходимо создать подразделение (Organization Unit), в нашей индустрии, его еще называют ОУшка-с ударением на У. Назовем подразделение personal путь в LDAP каталоге, будет иметь вид: ou=personal,dc=example,dc=org
Внутри подразделения personal, создадим 3 учетные записи, пользователей домена с паролем password@1 с именами:
Федя Мегатронов с логином megatronov и адресом электронной почты megatronov@example.org
Кеша Фуфлометов с логином fuflometov и адресом электронной почты fuflometov@example.org
Светлана Кукуева с логином kukueva и адресом электронной почты kukueva@example.org

Пути в каталоге LDAP, будут иметь вид:
cn=Федя Мегатронов,ou=personal,dc=example,dc=org
cn=Кеша Фуфлометов,ou=personal,dc=example,dc=org
cn=Светлана Кукуева,ou=personal,dc=example,dc=org

В этом подразделении, создадим группу распространения, allusers и электронной почтой allusers@example.org.
Вопрос на засыпку-какой путь в LDAP будет иметь данная группа?
В эту группу добавим трех наших пользователей.

Настраиваем сервер Linux

Протестуем соединение с LDAP:
ldapsearch -x -h dc1.example.org -p 389 -D 'CN=iredmail,DC=example,DC=org' -W

Enter password: Вводим пароль password^1

Нам должно вывалить кучу всякой инфы из AD, в которой содержатся информация о группах, пользователях и т.п. Я не буду ее тут выкладывать т.к. там целая портянка, на пару страниц. Для желающих посмотреть какая инфа там содержится, вывод результата всегда можно перенаправить в текстовый файл и потом, в спокойной обстановке, посмотреть что и к чему там.

Меняем настройки транспорта для сообщений:
postconf -e transport_maps='hash:/etc/postfix/transport'


Изменим настройки транспорта:
nano /etc/postfix/transport


Добавим в него следующее:
mail.example.org dovecot


Экспортируем все это, в базу данных Postfix:
postmap hash:/etc/postfix/transport


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

Указываем пользователя, от имени которого, будет выполняться опрос Active Directory ( по умолчанию, анонимные запросы к AD запрещены, их можно разрешить через политики безопасности, но это, очень хреновая идея, в плане безопасности!)
Подключаться к AD мы будем от имени пользователя iredmail (cn=iredmail,dc=example,dc=org) с паролем password^1, мы будем искать пользователей, которые находятся в аУшке personal (ou=presonal,dc=example,dc=org)
Нам необходимо отредактировать содержимое следующих файлов (то что там находится удаляем и заменяем на приложенное снизу)
nano /etc/postfix/ldap/virtual_mailbox_maps.cf


server_host     = dc1.example.org
server_port     = 389
version         = 3
bind            = yes
start_tls       = no
bind_dn         = cn=iredmail,dc=example,dc=org
bind_pw         = password^1
search_base     = ou=personal,dc=example,dc=org
scope           = sub
query_filter    = (&(objectclass=person)(userPrincipalName=%s))
result_attribute        = userPrincipalName
debuglevel      = 0


Разрешаем подключение к AD с целью поиска групп и их членов. (содержимое данного файла думаю понятно)
nano /etc/postfix/ldap/virtual_group_maps.cf


server_host     = dc1.example.org
server_port     = 389
version         = 3
bind            = yes
start_tls       = no
bind_dn         = cn=iredmail,dc=example,dc=org
bind_pw         = password^1
search_base     = ou=personal,dc=example,dc=org
scope           = sub
query_filter    = (&(objectClass=group)(mail=%s))
special_result_attribute = member
leaf_result_attribute = mail#result_attribute= userPrincipalName
debuglevel      = 0


Активируем поиск логинов отправителей в AD:
nano /etc/postfix/ldap/sender_login_maps.cf


server_host     = dc1.example.org
server_port     = 389
version         = 3
bind            = yes
start_tls       = no
bind_dn         = cn=iredmail,dc=example,dc=org
bind_pw         = password^1
search_base     = ou=personal,dc=example,dc=org
scope           = sub
query_filter    = (&(userPrincipalName=%s)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
result_attribute= userPrincipalName
debuglevel      = 0


Отредактируем main.cf
nano /etc/postfix/main.cf

Там нам необходимо найти и удалить строку:
check_policy_service inet:127.0.0.1:7777

Тестируем подключение к Active Directory


Проверка логина отправителя:
postmap -q megatronov@example.org ldap:/etc/postfix/ldap/sender_login_maps.cf

Должно выдать:
megatronov@example.org


Проверим разрешение членства в группе:
postmap -q allusers@example.org ldap:/etc/postfix/ldap/virtual_group_maps.cf

Должно выдать:
kukueva@example.org,fuflometov@example.org,megatronov@example.org

Если нет вывода то возможно 2 причины:
1) Не правильные данные для подключения к AD
2) В указанную группу не добавлены пользователи.

Нам также необходимо перенастроить Dovecot для запросов в Active Directory, все что там написано сотрем и записываем свое:
nano /etc/dovecot/dovecot-ldap.conf

Вставляем
hosts           = dc1.example.org:389
ldap_version    = 3
auth_bind       = yes
dn              = iredmail
dnpass          = password^1
base            = ou=personal,dc=example,dc=org
scope           = subtree
deref           = never
user_filter     = (&(userPrincipalName=%u)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
pass_filter     = (&(userPrincipalName=%u)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
pass_attrs      = userPassword=password
default_pass_scheme = CRYPT
user_attrs      = =home=/var/vmail/vmail1/%Ld/%Ln/Maildir/,=mail=maildir:/var/vmail/vmail1/%Ld/%Ln/Maildir/


Квота на размер почтового ящика.
По умолчанию, iRedMail позволяет задавать квоты на размер почтового ящика, но перейдя с OpenLDAP на работу с AD эта возможность теряется, но мы можем указать дисковую квоту для всех пользователей, одним махом.
nano /etc/dovecot/dovecot.conf

Находим строку:
quota_rule = *:storage=1G

Это и есть размер почтового ящика для каждого пользователя- 1Гб.

Перезапускаем службы:
/etc/init.d/postfix restart/etc/init.d/dovecot restart

Создание пользователей на почтовом сервере:

Создавать пользователей, на почтовом сервере больше не требуется, достаточно на контроллере домена создать учетную запись с заполненным полем электронной почты, при первом подключении пользователя, его папка будет создана автоматически!
Алгоритм работы очень простой-создали учетку, лезем в почту. Все остальное, сделает сервер самостоятельно.

Почтовые ящики пользователей находятся в:
/var/vmail/vmail1/example.org/$userlogin

Эта информация вам пригодится, когда понадобится настроить резервное копирование почтовых ящиков пользователей!

Пробуем подключиться через telnet
telnet localhost 110

Получаем:
Trying 127.0.0.1…
Connected to localhost.
Escape character is '^]'.
+OK Dovecot ready.
Пишем туда:
user megatronov@example.org

Получаем:
+OK
Вводим пароль:
pass password@1

Получаем:
+OK Logged in.
Проверим количество писем( у меня там лежит 2 письма):
list

Получаем:
+OK 2 messages:
1 1554
2 1554
.
Отключимся от сервера:
quit

нам выдаст:
+OK Logging out.
Connection closed by foreign host.

Отлично, все работает.
Заходим через WEB интерфейс.
Пользователь: megatronov@example.org
Пароль:password@1
Пробуем подключиться под другими пользователям, с паролем, который мы указывали на сервере Windows- при создании учетных записей.
Нас должно пускать под всеми тремя!
Пробуем написать письмо, но тут нас ждет маленький сюрприз, авто заполнение получателя письма не работает, но мы напишем email ручками полностью и жмем отправить, заходи под пользователем которому мы отправили письмо, у него появилось новое письмо.
Приятным бонусом будет возможность входа по логину т.е. достаточно указать login пользователя, для примера:
login: megatronov
pass: password@1

Пользователь также получит доступ к почтовому ящику.
Но заполнять получателей руками это не есть гуд, прикрутим адресную книгу из Active Directory

Прикрутим адресную книгу:

nano /usr/share/apache2/roundcubemail/config/main.inc.php


Находим строку:
$rcmail_config['autocomplete_addressbooks']

Приводим ее к виду:
$rcmail_config['autocomplete_addressbooks'] = array("sql", "mail.example.org");


Далее, нам необходимо найти раздел:
// Global LDAP address book.


И привести его к виду, указанному ниже:
(Я специально ничего не удалал, а просто за комментировал строки, которые там были изначально и добавил свои, также слегка переделал порядок сортировки, теперь он идет по алфавиту)
Вставляем туда:
$rcmail_config['ldap_public']["mail.example.org"] = array(
    'name'          => 'Global AD Address Book',
    'hosts'         => array('dc1.example.org'),
    'port'          => 389,
    'use_tls'       => false,
// Search accounts in the same domain.
    'user_specific' => false, // If true the base_dn, bind_dn and bind_pass default to the user's IMAP login.
    'base_dn'       => 'ou=personal,dc=example,dc=org',
    'bind_dn'       => 'cn=iredmail,dc=example,dc=org',
    'bind_pass'     => 'password^1',
    'writable'      => false, //запретим запись в AD
    'ldap_version'  => '3',
//    'search_fields' => array('mail', 'cn', 'givenName', 'sn'),
    'search_fields' => array('mail', 'cn', 'sAMAccountName', 'displayname', 'sn', 'givenName'),
//    'name_field'    => 'cn',

    'email_field'   => 'mail',
    'surname_field' => 'displayName',
    'firstname_field' => 'givenName',
//    'sort'          => 'cn',
    'scope'         => 'sub',
//    'filter'        => '(&(enabledService=mail)(enabledService=deliver)(enabledService=displayedInGlobalAddressBook)(|(objectClass=mailList)(objectClass=mailAlias)(objectClass=mailUser)))',
    'filter'        => "(mail=*@*)",
    'fuzzy_search'  => true);

Сохраняем изменения, пробуем под пользователем зайти в адресную книгу, у нас там появиться пункт Global AD Address Bookнажимаем на него и получаем список пользователей домена, которые имеют почтовые ящики.

Ну а теперь легкий тюнинг вида ящика. Слегка изменим порядок отображения колонок в почтовом ящике, лично мне нравится дефонтный порядок отображения колонок писем в Outlook, на мой взгляд, он удобный, по этому я решил привести отображение писем немного похожим на него.
Открываем файл:
nano /usr/share/apache2/roundcubemail/config/main.inc.php

находим строку:
$rcmail_config['list_cols'] = array

Закоментриуем ее и сразу под ней добавим, готовую строку:
$rcmail_config['list_cols'] = array('flag','attachment', 'from', 'subject', 'status', 'date', 'size' );

Важный и тонкий момент!

Поиск пользователей и скорость работы системы!
В данной статье, я указывал базу для поиска пользователей ou=personal,dc=example,dc=org, но ничего не запрещает вам опрашивать весь контроллер домена целиком расширив зону поиска до dc=example,dc=org, но есть одно НО! Время опроса получается очень большим, так Dovecot, при опросе всего LDAP каталога, пускает пользователя в почтовый ящик почти 1 минуту, это очень много, по этому я и сузил параметры поиска, так поиск учетных данных пользователя, происходит практически мгновенно. Обязательно попробуете это, в настройках указав адресной книге искать по всему LDAP dc=example,dc=org вы сразу увидите как долго идет поиск пользователей.

На этом все.
Обо всех найденных недостатках, ошибках и возможных улучшениях, а также, если просто возникли вопросы, прошу в комментарии.
Данная схема была протестирована на Windows Server 2008/2008R2 на Windows 2k3 все должно работать т.к. атрибуты учетных записей не изменились.
Статья была написана с использованием материалов:
iRedMail-WiKi Но видимо, она написана для совсем старой версии iRedMail.
А также форума, на сайте разработчиков. На котором написано как у них все здорово работает, но не написано как это сделать.

Комментариев нет:

Отправить комментарий