Nero2002
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Установка Openfire с поддержкой общего списка пользователей для нескольких доменов (лесов) Вступление В процессе написания статьи я получил информацию, о том что для объединения двух доменов (лесов) в настройках Openfire можно указать параметр ldap.alternateBaseDN, в котором нужно прописать второй домен. При этом список пользователей, согласно документации, будет объединятся в один. Но разобравшись в теме увидел целую кучу подводных камней. Во-первых, таким способом можно объединить только два домена, во-вторых, судя по форуму разработчика, из второго домена не подтягиваются соответствующие ему группы, в-третьих, структура обоих доменов должна быть строго говоря идентична (например, для фильтрации пользователей по группе), ну и в-четвертых, на версии 3.6.4 лично у меня этот параметр не отработал. Предполагается, что вы уже поставили NTLM патч и настроили Openfire для работы с одним из доменов. 1. Подготовка доменов Для полноценной работы между доменами требуется установить двухсторонние доверительные отношения. Для этого на каждом контроллере домена необходимо запустить консоль domain.msc и в свойствах домена указать доверенный домен (потребуются привилегии администратора домена). После установления двухсторонних доверительных отношений необходимо проверить, что все сделано правильно и через поиск по Active Directory можно найти пользователей соседних доменов. 2. Установка ADAM ADAM является своеобразным прокси, к которому можно подключить несколько доменов для получения общего списка пользователей. Этим его функционал не ограничивается, но именно эта функция нам потребуется прежде всего. Перед установкой ADAM стоит определиться на каком сервере вы будете его разворачивать. ADAM позволяет установить свои службы на любые свободные порты, поэтому вы можете развернуть его непосредственно на контроллере домена. В моем случае я разворачивал ADAM на отдельном сервере Jabber, который не выполняет роль контроллера домена, поэтому я мог использовать стандартные порты для Active Directory - TCP 389 и TCP 636 (SSL). Учтите этот нюанс при установке ADAM. Загрузить ADAM можно с сайта Microsoft по следующей ссылке. 3. Настройка ADAM После установки ADAM требуется создать его рабочую инстанцию. Делается это в меню Программы\ADAM. При запуске мастера для создания инстанций делаем следующее: - Нажимаем Next
- Выбираем A unique instance, нажимаем Next
- Вводим любое название инстанции, например OpenfireADProxy, нажимаем Next
- Указываем порты LDAP и LDAP SSL (если стандартные порты будут заняты - при установке будет предложено использовать порты 50000 и 50001 соответственно), нажимаем Next
- Выбираем Yes, create an application directory partition и вводим название новой директории в ADAM, например, DC=jabber,DC=local, нажимаем Next
- Указываем каталог для хранения базы данных (можно оставить по-умолчанию), нажимаем Далее
- Указываем под какой учетной записью стартовать ADAM (можно оставить по-умолчанию Network service account), нажимаем Next
- Указываем учетную запись для управления базой данных ADAM (я использовал пользователя, под которым вошел в систему), нажимаем Next
- Указываем какие политики импортировать в новую инстанцию: выбираем в список MS-InetOrgPerson.LDF, MS-User.LDF, MS-UserProxy.LDF, нажимаем Next
- Нажимаем Next, инстанция ADAM установлена
4. Загрузка данных в ADAM Первое с чего надо начать - создать базовую схему ADAM. Для этого требуется объединить изначальную базовую схему ADAM и целевого домена. Для объединения схем сделаем следующее: - Откроем консоль ADAM Tools Command Prompt из меню Программа\ADAM
- Вводим adschemaanalyzer и нажимаем Enter
- В меню File выбираем Load target schema и указываем хост, порт и учетные данные целевого домена
- В меню File выбираем Load base schema и указываем только хост и порт ADAM инстанции
- В меню Schema выбираем пункт Mark all non-present elements as included
- В меню File выбираем Create LDIF file, указываем имя файла (например, Adam1.ldf)
- Записываем полученный файл в каталог %WINDIR%\ADAM
- Импортируем в ADAM Tools Command Prompt полученную схему
Код: ldifde -i -s localhost -c "CN=Configuration,DC=X" #ConfigurationNamingContext -f Adam1.ldf | Повторяем все сначала, но теперь меняем местами target и base местами: - Откроем консоль ADAM Tools Command Prompt из меню Программа\ADAM
- Вводим adschemaanalyzer и нажимаем Enter
- В меню File выбираем Load target schema и указываем хост и порт ADAM инстанции
- В меню File выбираем Load base schema и указываем хост, порт и учетные данные целевого домена
- В меню Schema выбираем пункт Mark all non-present elements as included
- В меню File выбираем Create LDIF file, указываем имя файла (например, Adam2.ldf)
- Записываем полученный файл в каталог %WINDIR%\ADAM
- Импортируем в ADAM Tools Command Prompt полученную схему
Код: ldifde -i -s localhost -c "CN=Configuration,DC=X" #ConfigurationNamingContext -f Adam2.ldf | Если атрибуты сущностей объединяемых доменов отличаются, процедуру требуется повторить для каждого отличающегося домена. Напоследок требуется расширить схему еще одним файлом: - Импортируем в ADAM Tools Command Prompt полученную схему
Код: ldifde -i -s localhost:389 -c "CN=Configuration,DC=X" #ConfigurationNamingContext -f MS-AdamSyncMetadata.ldf | Перезапустите сервис ADAM инстанции (в моем случае, это OpenfireADProxy). 5. Добавление полей для userProxy - Нажимаем Пуск, Выполнить, вводим mmc, нажимаем OK
- Нажимаем Файл File, Add/Remove Snap-in…
- Нажимаем кнопку Add…
- Выбираем ADAM Schema и нажимаем Add, затем Close
- Нажимаем OK
- Нажимаем правую клавишу на ADAM Schema и выбираем Change ADAM Server…
- Вводим хост и порт ADAM инстанции, нажимаем OK
- Раскрываем список ADAM Schema и Classes
- Находим в списке параметр userProxy, нажимаем правую клавишу, далее Properties, затем закладку Attributes
- В список полей добавить следующие:
Код: cn postalCode co primaryGroupID department sAMAccountName displayName sn facsimileTelephoneNumber st givenName streetAddress l telephoneNumber mail title memberOf userPrincipalName mobile company pager userAccountControl sourceObjectGuid lastAgedChange | Перезапустите сервис ADAM инстанции (в моем случае, это OpenfireADProxy). 6. Настройка синхронизации Для того, чтобы ADAM имел актуальную базу пользователей и их атрибутов, необходимо с заданной периодичностью запускать процедуру синхронизации данных с целевыми доменами. Перед началом синхронизации создадим для каждого домена свой организационный юнит в ADAM. Для работы с базой данных ADAM служит программа ADAM ADSI Edit в меню Программы\ADAM. С помощью нее следует выполнить следующие шаги: - Нажать на корне дерева консоли правую кнопку и выбрать Connect To...
- Ввести хост и порт инстанции ADAM
- Выбрать в настройках Distinguished name (DN) or naming context и ввести имя инстанции ADAM (в примере, dc=jabber,dc=local)
- Нажать ОК
- В дереве раскрыть корень инстанции, затем ее название
- По правой клавише выбрать New, затем Object
- В списке выбрать organizationalUnit и ввести имя домена, например domain1
- Нажать Next, затем Finish
- Повторить процедуру для второго домена
Для синхронизации можно использовать любой планировщик, например, написанный мною аналог CronNT. Сервис планировщика необходимо запускать под учетной записью, которой в процессе установки инстанции ADAM были даны права администрирования. Вот пример командного файла, который я запускаю каждую ночь: Код: cd c:\windows\adam adamsync /install localhost:389 Domain1.xml /log - adamsync /sync localhost:389 "ou=domain1,dc=jabber,dc=local" /log C:\CronNT\SyncDomain1.log adamsync /install localhost:389 Domain2.xml /log - adamsync /sync localhost:389 "ou=domain2,dc=jabber,dc=local" /log C:\CronNT\SyncDomain2.log | Вот пример конфигурации для Domain1.xml: Код: <?xml version="1.0"?> <doc> <configuration> <config-name>domain1</config-name> <description>Adamsync Proxy Config File</description> <security-mode>object</security-mode> <source-ad-name>domain1.local</source-ad-name> <source-ad-partition>dc=domain1,dc=local</source-ad-partition> <source-ad-account></source-ad-account> <account-domain>domain1.local</account-domain> <target-dn>ou=domain1,dc=jabber,dc=local</target-dn> <query> <base-dn>dc=domain1,dc=local</base-dn> <object-filter>(|(&(objectClass=user)(memberOf=CN=jabber,CN=Builtin,DC=domain1,DC=local))(&(objectClass=User)(isDeleted=TRUE)))</object-filter> <attributes> <include>objectSid</include> <include>cn</include> <include>co</include> <include>company</include> <include>department</include> <include>displayName</include> <include>givenName</include> <include>mail</include> <include>memberOf</include> <include>primaryGroupID</include> <include>sAMAccountName</include> <include>streetAddress</include> <include>telephoneNumber</include> <include>sn</include> <include>st</include> <include>title</include> <include>userAccountControl</include> <include>sourceObjectGuid</include> <include>lastAgedChange</include> <exclude></exclude> </attributes> </query> <user-proxy> <source-object-class>user</source-object-class> <target-object-class>userProxy</target-object-class> </user-proxy> <schedule> <aging> <frequency>1</frequency> <num-objects>0</num-objects> </aging> <schtasks-cmd></schtasks-cmd> </schedule> </configuration> <synchronizer-state> <dirsync-cookie></dirsync-cookie> <status></status> <authoritative-adam-instance></authoritative-adam-instance> <configuration-file-guid></configuration-file-guid> <last-sync-attempt-time></last-sync-attempt-time> <last-sync-success-time></last-sync-success-time> <last-sync-error-time></last-sync-error-time> <last-sync-error-string></last-sync-error-string> <consecutive-sync-failures></consecutive-sync-failures> <user-credentials></user-credentials> <runs-since-last-object-update></runs-since-last-object-update> <runs-since-last-full-sync></runs-since-last-full-sync> </synchronizer-state> </doc> | Вот пример конфигурации для Domain2.xml: Код: <?xml version="1.0"?> <doc> <configuration> <config-name>domain2</config-name> <description>Adamsync Proxy Config File</description> <security-mode>object</security-mode> <source-ad-name>domain2.local</source-ad-name> <source-ad-partition>dc=domain2,dc=local</source-ad-partition> <source-ad-account></source-ad-account> <account-domain>domain2.local</account-domain> <target-dn>ou=domain2,dc=jabber,dc=local</target-dn> <query> <base-dn>dc=domain2,dc=local</base-dn> <object-filter>(|(&(objectClass=user)(memberOf=CN=jabber,CN=Builtin,DC=domain2,DC=local))(&(objectClass=User)(isDeleted=TRUE)))</object-filter> <attributes> <include>objectSid</include> <include>cn</include> <include>co</include> <include>company</include> <include>department</include> <include>displayName</include> <include>givenName</include> <include>mail</include> <include>memberOf</include> <include>primaryGroupID</include> <include>sAMAccountName</include> <include>streetAddress</include> <include>telephoneNumber</include> <include>sn</include> <include>st</include> <include>title</include> <include>userAccountControl</include> <include>sourceObjectGuid</include> <include>lastAgedChange</include> <exclude></exclude> </attributes> </query> <user-proxy> <source-object-class>user</source-object-class> <target-object-class>userProxy</target-object-class> </user-proxy> <schedule> <aging> <frequency>1</frequency> <num-objects>0</num-objects> </aging> <schtasks-cmd></schtasks-cmd> </schedule> </configuration> <synchronizer-state> <dirsync-cookie></dirsync-cookie> <status></status> <authoritative-adam-instance></authoritative-adam-instance> <configuration-file-guid></configuration-file-guid> <last-sync-attempt-time></last-sync-attempt-time> <last-sync-success-time></last-sync-success-time> <last-sync-error-time></last-sync-error-time> <last-sync-error-string></last-sync-error-string> <consecutive-sync-failures></consecutive-sync-failures> <user-credentials></user-credentials> <runs-since-last-object-update></runs-since-last-object-update> <runs-since-last-full-sync></runs-since-last-full-sync> </synchronizer-state> </doc> | Файлы конфигурации XML необходимо положить в папку %WINDIR%\ADAM. 7. Настройка учетной записи ADAM для соединения с Openfire Запустим программу ADAM ADSI Edit в меню Программы\ADAM. С помощью нее следует выполнить следующие шаги: - Нажать на корне дерева консоли правую кнопку и выбрать Connect To...
- Ввести хост и порт инстанции ADAM
- Выбрать в настройках Well-known naming context и в списке Configuration
- Нажать ОК
- В дереве раскрыть корень конфигурации, затем CN=Roles
- Выбрать CN=Administrators, затем по правой клавише Properties
- В списке атрибутов найти member, нажать кнопку Edit
- Добавить учетную запись, с помощью которой Openfire будет подключаться к ADAM
8. Подключение Openfire к ADAM Особенность работы ADAM с Openfire заключается в том, что взаимодействие выполняется только по протоколу SSL. Openfire умеет работать по SSL, но для того, чтобы ADAM заработал по SSL требуется сертификат (самодельный или выданный каким-нибудь CA, с привилегиями Server Authentication). Рассмотрим сложный вариант, а именно если у нас нет корпоративного CA центра. Для начала требуется скачать мои скрипты (Windows XP/2003). Папка содержит файлы конфигураций и исполняемый модуль OpenSSL. Первым делом следует поправить поле Subject в файле iis.inf в соответствии с вашими данными. Далее следует поправить файл openssl.cnf. У меня были проблемы с генерацией правильного сертификата в случае, если данные Subject в файле iis.inf отличались от соответствующих данных секции в req_distinguished_name в файле openssl.cnf. Будьте внимательны при заполнении этих реквизитов! После правки конфигурационных файлов все просто: - Запускаем скрипт newcert_ca.cmd, вводим пароль, генерируем корневой сертификат CA
- Запускаем скрипт newreq_iis.cmd, генерируем запрос на сертификат сервера
- Запускаем скрипт signreq_iis.cmd, вводим пароль, подписываем сертификат сервера, два раза нажимаем Yes
Все, на этом этапе мы получили сертификат сервера с закрытым ключем, но хранится все это в хранилище локального компьютера. Чтобы получить сертификат необходимо сделать следующие шаги: - Нажимаем Пуск, Выполнить, вводим mmc, нажимаем OK
- Нажимаем Файл File, Add/Remove Snap-in…
- Нажимаем кнопку Add…
- Выбираем Certificates, выбираем Computer account, нажимаем кнопку Finish, затем Close и OK
- Раскроем дерево сертификатов, нам нужна ветка Personal. Если все прошло успешно, ветка будет содержать только что созданный сертификат, который включает закрытый ключ (без него SSL работать не будет).
- Экспортируем его вместе с закрытым ключем по правой клавише с помощью меню All Tasks и далее Export...
- Для работы по SSL нам также потребуется корневой сертификат ca.crt, который находится в подпапке IIS папки скриптов
- Сертификаты генерируются на 10 лет, так что проблем с их продлением у вас не будет долго.
Полученные сертификаты (и корневой и серверный) нужно проинсталлировать на сервере с ADAM инстанцией, а корневой сертификат на сервере Openfire (производим простой импорт, дважды нажав по нему левой клавишей мыши). Импортировать сертификат в ADAM следует следующим образом: - Нажимаем Пуск, Выполнить, вводим mmc, нажимаем OK
- Нажимаем Файл File, Add/Remove Snap-in…
- Нажимаем кнопку Add…
- Выбираем Certificates, выбираем Service account, нажимаем кнопку Next, в списке находим название сервиса инстанции ADAM (в моем случае OpenfireADProxy), затем нажимаем кнопку Finish, затем Close и OK
- Раскроем дерево сертификатов, нам нужна ветка Personal.
- Импортируем сертификат сервера по правой клавише с помощью меню All Tasks и далее Import...
- Для работы по SSL нам также потребуется корневой сертификат ca.crt, который требуется импортировать в ветку Trusted Publishers
Перезапустите сервис ADAM инстанции (в моем случае, это OpenfireADProxy). В настройках Openfire поставьте галку, что мы будем использовать SSL, укажите хост ADAM инстанции и порт SSL (обычно это порты 636 или 50001), укажите baseDN (в примере DC=jabber,DC=local), а также учетную запись и пароль, входящую в административную группу ADAM. Для прозрачной NTLM аутентификации нам потребуется еще поправить значение настроек sasl.approvedRealms, которое должно содержать NETBIOS имена целевых доменов через запятую (например, DOMAIN1,DOMAIN2). Учтите, что для фильтрации в параметре ldap.searchFilter требуется использовать ссылку на класс userProxy, вместо user, например так: Код: (&(objectClass=userProxy)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) | PS. При использовании данного материала просьба ссылаться на первоисточник, вам все равно - а мне будет приятно! | Всего записей: 154 | Зарегистр. 30-08-2002 | Отправлено: 17:00 29-08-2011 | Исправлено: Nero2002, 12:24 08-09-2011 |
|