В этой статье мы настроим синхронизацию между Active Directory и OpenDJ в обе стороны. Таким образом изменения, внесенные в Active Directory, будут синхронизированы в OpenDJ и наоборот, изменения в OpenDJ будут синхронизированы с Active Directory.
Развертывание OpenIDM описано в документации. Предполагается, что OpenIDM у вас уже развернут и готов к настройке.
Скачайте с GitHub файл подключения к Active Directory provisioner.openicf-adldap.json и скопируйте его в каталог conf OpenIDM
Поменяйте свойства в соответствии с настройками вашего сервера Active Directory:
| Настройка | Описание |
|---|---|
| host | Имя хоста/IP адрес сервера AD |
| port | Порт подключения (по умолчанию 389) |
| ssl | По умолчанию SSL не используется |
| principal | DN учетной записи, подключающейся к AD, например "CN=Administrator,CN=Users,DC=example,DC=com" |
| credentials | Пароль учетной записи |
| baseContexts | Список DN, содержащих учетные записи для синхронизации, например, ["CN=Users,DC=Example,DC=com"] |
| baseContextsToSynchronize | Значение, идентичное baseContexts |
| accountSearchFilter | Фильтр для поиска учетных записей |
| accountSynchronizationFilter | Фильтр для синхронизации учетных записей. |
Если у вас не установлен OpenDJ, установите его, как описано в документации.
Скачайте с GitHub файл с тестовыми данными Example.ldif
Выполните первоначальную настройку OpenDJ и импортируйте в него данные командой
cd /path/to/opendj
./setup --cli \
--hostname localhost \
--ldapPort 1389 \
--rootUserDN "cn=Directory Manager" \
--rootUserPassword password \
--adminConnectorPort 4444 \
--baseDN dc=com \
--ldifFile /path/to/Example.ldif \
--acceptLicense \
--no-prompt
...
Configuring Directory Server ..... Done.
Creating Base Entry dc=com ..... Done.
Starting Directory Server ....... Done.
...
Скачайте с GitHub файл конфигурации подключения к OpenDJ provisioner.openicf-ldap.json и скопируйте его в каталог conf OpenIDM.
Файл можно оставить без изменений, он уже настроен в соответствии с параметрами подключения к OpenDJ по умолчанию.
Откройте консоль администратора OpenIDM по ссылке http://localhost:8080/admin. Введите в поля логин и пароль значение openidm-admin. В верхнем меню откройте Configure → Mappings и создайте Mapping ad → user как показано на рисунке ниже.

Откройте созданный Mapping systemAdAccounts_managedUser и на закладке Properties настройте соответствия полей как показано в таблице
| Source | Target |
|---|---|
| cn | cn |
| description | description |
| givenName | givenName |
| sn | sn |
| telephoneNumber | telephoneNumber |
| smAccountName | userName |
На закладке Behaviors настройте поведение при различных ситуациях синхронизации.
| Situation | Action |
|---|---|
| Ambiguous | Ignore |
| Source Missing | Delete |
| Missing | Ignore |
| Found Already Linked | Exception |
| Unqualified | Delete |
| Unassigned | Ignore |
| Link Only | Exception |
| Target Ignored | Ignore |
| Source Ignored | Ignore |
| All Gone | Ignore |
| Confirmed | Update |
| Found | Ignore |
| Absent | Create |
Сохраните изменения.
На закладке Mappings создайте еще один Mapping как показано на рисунке ниже

Откройте настройки созданного mapping managedUser_systemLdapAccounts и на закладке Properties настройте соответствия полей как указано в таблице ниже:
| Source | Target | Transformation script | Conditional updates |
|---|---|---|---|
| userName | uid | ||
| sn | sn | ||
| cn | source.cn || (source.givenName + ' ' + source.sn) |
||
| givenName | givenName | ||
| description | description | ||
| telephoneNumber | telephoneNumber | object.telephoneNumber !== undefined && object.telephoneNumber !== null && object.telephoneNumber !== '' |
Для поля description укажите значение по умолчанию Created in OpenIDM
На закладке Behaviors настройте поведение при различных ситуациях синхронизации:
| Sutiation | Action |
|---|---|
| Ambiguous | Ignore |
| Source Missing | Delete |
| Missing | Ignore |
| Found Already Linked | Exception |
| Unqualified | Delete |
| Unassigned | Ignore |
| Link Only | Exception |
| Target Ignored | Ignore |
| Source Ignored | Ignore |
| All Gone | Ignore |
| Confirmed | Update |
| Found | Update |
| Absent | Create |
На этой же закладке в разделе Situational Event Scripts добавьте скрипт для события onCreate.
target.dn = 'uid=' + source.userName + ',ou=People,dc=example,dc=com';
Создайте синхронизацию OpenDJ → Managed User

В поле Linked mapping выберите managedUser_systemLdapAccounts.
Откройте созданный Mapping systemLdapAccount_managedUser и на закладке Properties настройте соответствия полей как показано в таблице
| Source | Target |
|---|---|
| sn | sn |
| givenName | givenName |
| uid | userName |
| telephoneNumber | telephoneNumber |
На закладке Behaviors настройте поведение.
| Situation | Action |
|---|---|
| Ambiguous | Ignore |
| Source Missing | Delete |
| Missing | Ignore |
| Found Already Linked | Exception |
| Unqualified | Delete |
| Unassigned | Ignore |
| Link Only | Exception |
| Target Ignored | Ignore |
| Source Ignored | Ignore |
| All Gone | Ignore |
| Confirmed | Update |
| Found | Ignore |
| Absent | Create |
Создайте Mapping Managed User → Active Directory

В поле Linked mapping выберите systemAdAccounts_managedUser.
В созданном Mapping managedUser_systemAdAccount настройте соответствие:
| Source | Target | Transformation Script |
|---|---|---|
| userName | dn | 'CN=' + source + ',CN=Users,DC=example,DC=org' |
| givenName | givenName | |
| sn | sn | |
| cn | source.displayName || (source.givenName + ' ' + source.sn) |
|
| description | description | |
| telephoneNumber | telephoneNumber | |
| userName | sAMAccountName |
На закладке Behaviors настройте поведение аналогично шагу выше.
В консоли администратора выберите Mapping systemAdAccounts_managedUser и нажмите кнопку Reconcile.

В консоли администратора перейдите в список Manage → User. В списке пользователей появятся учетные записи из Active Directory

В консоли администратора выберите Mapping managedUser_systemLdapAccounts и нажмите кнопку Reconcile. После успешной синхронизации в OpenDJ появятся созданные в Managed Users записи из Active Directory.
Проверьте наличие учетной записи командой
./opendj/bin/ldapsearch -p 1389 -b dc=example,dc=com "(uid=aduser)" uid
dn: uid=aduser,ou=People,dc=example,dc=com
uid: aduser
В консоли администратора в разделе Configure → Mappings выберите Mapping systemLdapAccount_managedUser. И нажмите кнопку Reconcile.
Перейдите в раздел Manage → User.
В списке пользователей появятся учетные записи из OpenDJ

Далее выберите Mapping managedUser_systemAdAccount и нажмите Reconcile.
После успешной синхронизации в Active Directory появятся учетные записи из OpenDJ.
Проверьте их наличие командой
ldapsearch -H ldap://ad.example.com -x -W -D "admin@example.com" -b "dc=example,dc=com" "(sAMAccountName=bjensen)" | grep dn
Enter LDAP Password:
dn: CN=bjensen,CN=Users,DC=example,DC=org