Автор Тема: OpenLDAP rewrite из AD  (Прочитано 14660 раз)

ev

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
OpenLDAP rewrite из AD
« : 17 Ноябрь 2016, 14:22:56 »
Добрый день!

Прошу помощи, можно ли сделав LDAP-прокси из MS AD подменить часть некоторых атрибутов объекта?
В частности: имеются поля "mail", содержащие текст юникод типа user@internal.domain.ru. Требуется при запросе на LDAP-прокси получить в поле mail значение user@domain.ru.

пробовал что-то типа
overlay                 rwm
rwm-rewriteEngine on
rwm-rewriteContext searchAttrDN   
rwm-rewriteRule         "(.+)?@internal.domain.ru$" "($1)@domain.ru"  ":"
не помогает..

Рекомендаций в страницах man по этому поводу крайне мало.. Единственное, к чему пришёл - что overlay rwm работает с атрибутами формата AVA. Может, я не в ту сторону копаю?

Заранее спасибо!

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: OpenLDAP rewrite из AD
« Ответ #1 : 18 Ноябрь 2016, 02:57:48 »
Здравствуйте!
Честно говоря, переписать значение атрибута на лету штатными средствами OpenLDAP практически невозможно. Наложение rwm в плане перезаписи работает только с самим DN записи или со значениями атриутов, имеющих синтаксис distinguishedName (то есть в которых хранится DN). С простыми строковыми значениями атрибутов оно, увы, не работает. См. комментарий Howard Chu (разработчика OpenLDAP).

Можно написать свой простенький прокси-скрипт на bash и подключить его с помощью back_shell. В скрипте, соответственно, выполняются любые преобразования. Примерно так:

slapd.conf:
include /etc/openldap/schema/core.schema

moduleload back_shell.la

database shell
suffix       "dc=mycompany,dc=ru"
search     /opt/openldap-tests/shell/test.sh

Скрипт /opt/openldap-tests/shell/test.sh:
#!/bin/bash

while [ 1 ]; do
    read TAG VALUE
    if [ $? -ne 0 ]; then
        break
    fi
    case "$TAG" in
        base:)
        BASE=$VALUE
        ;;
        filter:)
        FILTER=$VALUE
        ;;
        # include other parameters here
    esac
done

# Search
ldapsearch -x -LLL -H ldap://127.0.0.1:389 -b $BASE $FILTER | sed -e 's/mail: \(.*\)@.*/mail: \1@somedomen.ru/'

# result
echo "RESULT"
echo "code: 0"

exit 0
Параметры подключения к серверу определяются в виде аргументов ldapsearch. Перезапись вывода ldapsearch идёт через sed.

Получаем:
# ldapsearch -x -LLL -H ldap://127.1:9000 -b "ou=Users,dc=mycompany,dc=ru" "uid=egor" mail
dn: uid=egor,ou=Users,dc=mycompany,dc=ru
mail: egor@somedomen.ru

Егор


ev

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: OpenLDAP rewrite из AD
« Ответ #2 : 18 Ноябрь 2016, 15:30:21 »
Добрый день,
Спасибо огромное за оперативный ответ! Как знал что не в ту сторону копали.
Продолжим теперь в указанном..

Только почему-то (может, это в используемой версии slapd 2.4.40) этот бекэнд придумывает дополнительные символы к фильтру:
было (&(objectClass=user)(!(objectClass=Computer)), стало (&(?objectClass=user)(!(?objectClass=Computer)).

Ну и возвращаются только те атрибуты, которые известны OpenLDAP..

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: OpenLDAP rewrite из AD
« Ответ #3 : 22 Ноябрь 2016, 13:55:25 »
Здравствуйте! Проковырялся с Вашей проблемой довольно долго, но увы без особого успеха. Даже если включить в каталог схему microsoft.schema (после долгих причёсываний мне это удалось), записи возвращаются нормально (со всеми атрибутами), но фильтры всё-равно работают коряво: (samaccountname=*) срабатывает, а (samaccountname=ivan) или (samaccountname=i*) -- нет. Может быть, беда с какими-то специфическими правилами соответствия (matchingRules), ведь при работе с OpenLDAP в качестве удалённого сервера все фильтры отрабатывают нормально.

Тут некоторые в интернете предлагают написать своё наложение, но я пробовал посмотреть несколько исходников -- в логику разработчиков вникнуть на скорую руку не получилось, слишком всё путано.

Так что пока не знаю, что посоветовать. В зависимости от исходной задачи, можно попытаться сделать какой-нибудь клиент-обёртку для запросов и обработки результатов, но опять же, это нетривиальный подход, требующий программирования.

Простите, что не смог помочь. Егор

ev

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: OpenLDAP rewrite из AD
« Ответ #4 : 22 Ноябрь 2016, 15:08:32 »
Егор, спасибо на этом! Нетривиальность и сложность задачи не сразу была понятна.

Насчёт доп. атрибутов было найдено решение использовать как куски схем AD, найденные в Интернете (кстати, ваша версия схемы в общем доступе?), так и оверлей allop наконец.
Фильтры же действительно работают странно.

Мы тоже корячили возможные варианты несколько дней.. в итоге тот сервис (Cisco CUCM), который мы хотели подключить к LDAP, совсем устал от привязок. Сегодня решили обойтись обходным путём (локальная база). Если вернёмся к теме и добьём таки - отпишемся.

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: OpenLDAP rewrite из AD
« Ответ #5 : 23 Ноябрь 2016, 00:48:52 »
Я взял схему с сайта apple и переделал её:
1. Переставил типы атрибутов перед объектными классами
2. Убрал из атрибутов NO-USER-MODIFICATION
3. "Левые" синтаксисы заменил на octetString
4. Убрал типы атрибутов и классы, дублирующиеся в других наборах схемы
5. Пересортировал объектные классы для нормальной поддержки иеархии

Подключать после core, cosine, inetorgperson