Форум проекта Pro-LDAP.ru
Администрирование OpenLDAP => Конфигурационный файл slapd.conf => Тема начата: ev от 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. Может, я не в ту сторону копаю?
Заранее спасибо!
-
Здравствуйте!
Честно говоря, переписать значение атрибута на лету штатными средствами OpenLDAP практически невозможно. Наложение rwm в плане перезаписи работает только с самим DN записи или со значениями атриутов, имеющих синтаксис distinguishedName (то есть в которых хранится DN). С простыми строковыми значениями атрибутов оно, увы, не работает. См. комментарий Howard Chu (http://www.openldap.org/lists/openldap-technical/201007/msg00185.html) (разработчика 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 (http://pro-ldap.ru/tr/man/ldapsearch.1.html). Перезапись вывода 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
Егор
-
Добрый день,
Спасибо огромное за оперативный ответ! Как знал что не в ту сторону копали.
Продолжим теперь в указанном..
Только почему-то (может, это в используемой версии slapd 2.4.40) этот бекэнд придумывает дополнительные символы к фильтру:
было (&(objectClass=user)(!(objectClass=Computer)), стало (&(?objectClass=user)(!(?objectClass=Computer)).
Ну и возвращаются только те атрибуты, которые известны OpenLDAP..
-
Здравствуйте! Проковырялся с Вашей проблемой довольно долго, но увы без особого успеха. Даже если включить в каталог схему microsoft.schema (после долгих причёсываний мне это удалось), записи возвращаются нормально (со всеми атрибутами), но фильтры всё-равно работают коряво: (samaccountname=*) срабатывает, а (samaccountname=ivan) или (samaccountname=i*) -- нет. Может быть, беда с какими-то специфическими правилами соответствия (matchingRules), ведь при работе с OpenLDAP в качестве удалённого сервера все фильтры отрабатывают нормально.
Тут некоторые в интернете предлагают написать своё наложение (http://www.openldap.org/lists/openldap-technical/201007/msg00197.html), но я пробовал посмотреть несколько исходников -- в логику разработчиков вникнуть на скорую руку не получилось, слишком всё путано.
Так что пока не знаю, что посоветовать. В зависимости от исходной задачи, можно попытаться сделать какой-нибудь клиент-обёртку для запросов и обработки результатов, но опять же, это нетривиальный подход, требующий программирования.
Простите, что не смог помочь. Егор
-
Егор, спасибо на этом! Нетривиальность и сложность задачи не сразу была понятна.
Насчёт доп. атрибутов было найдено решение использовать как куски схем AD, найденные в Интернете (кстати, ваша версия схемы в общем доступе?), так и оверлей allop наконец.
Фильтры же действительно работают странно.
Мы тоже корячили возможные варианты несколько дней.. в итоге тот сервис (Cisco CUCM), который мы хотели подключить к LDAP, совсем устал от привязок. Сегодня решили обойтись обходным путём (локальная база). Если вернёмся к теме и добьём таки - отпишемся.
-
Я взял схему с сайта apple (https://opensource.apple.com/source/OpenLDAP/OpenLDAP-491/OpenLDAP/servers/slapd/schema/microsoft.schema) и переделал её:
1. Переставил типы атрибутов перед объектными классами
2. Убрал из атрибутов NO-USER-MODIFICATION
3. "Левые" синтаксисы заменил на octetString
4. Убрал типы атрибутов и классы, дублирующиеся в других наборах схемы
5. Пересортировал объектные классы для нормальной поддержки иеархии
Подключать после core, cosine, inetorgperson