Как то пришла мне гениальная мысль, синхронизировать пользователей из OpenLDAP в Active Directory. Много информации было прочитано в Интернете и наткнулся я на интересный проект — lsc (LDAP Synchronization Connector). Установил, посмотрел, что-то не то. Набросал конфиг по wiki и вот что вышло. Это основной конфигурационный файл lsc.xml. Думаю с большего понятно, что первая секция описывает соединение к серверу Active Directory, вторая секция соединение с OpenLDAP, а дальше пошли описания задач, что вообще хотим делать.
<?xml version="1.0" ?> <lsc xmlns="http://lsc-project.org/XSD/lsc-core-2.1.xsd" revision="0"> <connections> <ldapConnection> <name>AD</name> <url>ldap://gml-mainserver:389/dc=gomel,dc=domain,dc=com</url> <username>administrator@GOMEL.DOMAIN.COM</username> <password>PASSWORD</password> <authentication>GSSAPI</authentication> <referral>IGNORE</referral> <derefAliases>NEVER</derefAliases> <version>VERSION_3</version> <pageSize>1000</pageSize> <factory>com.sun.jndi.ldap.LdapCtxFactory</factory> <tlsActivated>false</tlsActivated> </ldapConnection> <ldapConnection> <name>openldap</name> <url>ldap://localhost:389/dc=gomel,dc=domain,dc=com</url> <username>cn=admin,dc=gomel,dc=domain,dc=com</username> <password>PASSWORD</password> <authentication>SIMPLE</authentication> </ldapConnection> </connections> <tasks> <task> <name>People</name> <bean>org.lsc.beans.SimpleBean</bean> <ldapSourceService> <name>openldap-source-service</name> <connection reference="openldap" /> <baseDn>ou=users,dc=gomel,dc=domain,dc=com</baseDn> <pivotAttributes> <string>uid</string> </pivotAttributes> <fetchedAttributes> <string>description</string> <string>cn</string> <string>sn</string> <string>givenName</string> <string>displayName</string> <string>userPassword</string> <string>objectClass</string> <string>uid</string> <string>mail</string> <string>title</string> </fetchedAttributes> <getAllFilter><![CDATA[(objectClass=inetOrgPerson)]]></getAllFilter> <getOneFilter><![CDATA[(&(objectClass=inetOrgPerson)(uid={uid}))]]></getOneFilter> <cleanFilter><![CDATA[(&(objectClass=inetOrgPerson)(uid={sAMAccountName}))]]></cleanFilter> </ldapSourceService> <ldapDestinationService> <name>ad-dst-service</name> <connection reference="AD" /> <baseDn>ou=GroupA,DC=gomel,DC=domain,DC=com</baseDn> <pivotAttributes> <string>samAccountName</string> </pivotAttributes> <fetchedAttributes> <string>description</string> <string>cn</string> <string>sn</string> <string>givenName</string> <string>objectClass</string> <string>title</string> <string>displayName</string> <string>samAccountName</string> </fetchedAttributes> <getAllFilter><![CDATA[(objectClass=user)]]></getAllFilter> <getOneFilter><![CDATA[(&(objectClass=user)(sAMAccountName={uid}))]]></getOneFilter> </ldapDestinationService> <propertiesBasedSyncOptions> <mainIdentifier>"CN=" + srcBean.getDatasetFirstValueById("cn") + ", OU=GroupA,DC=gomel,DC=domain,DC=com"</mainIdentifier> <defaultDelimiter>;</defaultDelimiter> <defaultPolicy>FORCE</defaultPolicy> <dataset> <name>description</name> <policy>FORCE</policy> <forceValues> <string>js:srcBean.getDatasetFirstValueById("sn").toUpperCase() + " (" + srcBean.getDatasetFirstValueById("mail") + ")"</string> </forceValues> </dataset> <dataset> <name>samAccountName</name> <policy>KEEP</policy> <createValues> <string>js:srcBean.getDatasetFirstValueById("uid")</string> </createValues> </dataset> <dataset> <name>objectClass</name> <policy>KEEP</policy> <createValues> <string>"user"</string> </createValues> </dataset> <dataset> <name>userPassword</name> <policy>KEEP</policy> <createValues> <string>"Changethi0"</string> </createValues> </dataset> </propertiesBasedSyncOptions> </task> </tasks> </lsc>
Дальше возникла у меня проблема с аутентификацией в Active Directory. Пришлось настраивать Kerberos и выставить флаг useSubjectCredsOnly=false самого lsc приложения:
export JAVA_OPTS="$JAVA_OPTS -Djavax.security.auth.useSubjectCredsOnly=false"
так же необходимо сделать ссылку krb5.conf в директорию с конфигом lsc и назвать её krb5.ini. Не знаю почему ini, может быть связано с JAVA.
Конфиг Kerberos думаю нет смысла публиковать, там всё стандартно, главное соблюдать ВЕРХНИЙ РЕГИСТР в доменных именах там где это требуется.
Проверить аутентификацию в Active Directory можно командой
kinit administrator@DOMAIN.COM
этой командой мы собственно и аутентифицируемся. Если что-то не так, нам сообщат.
Запуск синхронизации происходит командой:
lsc -f /etc/lsc/ol2ad -s all -c all
/etc/lsc/ol2ad - это директория в которой находится конфиг lsc.xml
Если по непонятным причинам не удаётся пройти аутентификацию в Active Directory, то можно включить Debug режим, для этого необходимо выполнить
export JAVA_OPTS="$JAVA_OPTS -Dsun.security.krb5.debug=true" export JAVA_OPTS="$JAVA_OPTS -Dsun.security.jgss.debug=true"