Синхронизация из OpenLDAP в Active Directory

Автор: | 01.02.2017

Как то пришла мне гениальная мысль, синхронизировать пользователей из 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"

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *