
Доброе утро;
После настройки прокси-сервера LDAP для репликации данных LDAP я постоянно получаю следующее сообщение:
52a0b5ca send_ldap_result: conn=-1 op=0 p=3
52a0b5ca send_ldap_result: err=32 совпало="" текст=""
52a0b5ca ==> ldap_back_add("dc=basecorp,dc=net")
52a0b5ca => ldap_back_getconn: conn 0x7f40ea0 извлечен refcnt=1.
/usr/libexec/slapd: ошибка поиска символа: /usr/libexec/openldap/back_ldap-2.4.so.2: неопределенный символ: ldap_add_ext
Это с OpenLDAP 2.4.37 на хосте Solaris 10 x86 и хосте RedHat 5.5. Оба установлены из источников, включая последний дистрибутив BDB. sourceserver — это машина, с которой я хочу извлечь данные и синхронизировать их с destserver (см. конфигурации ниже).
Итак, единственное, что есть общего у двух машин, на которых я пытался запустить прокси, это я (тьфу!). Проблема в том, что я настроил прокси наоборот? Возможно, мне не разрешено добавлять запись в бэкэнд LDAP? Надеюсь, кто-нибудь из вас сможет изучить мои конфигурации ниже и ответить на мой вопрос, а также на многие другие.
Мой slapd.conf для прокси:
database ldap
hidden on
suffix "dc=basecorp,dc=net"
rootdn "cn=Manager"
uri ldaps://destserver01.dest.net:636
lastmod on
acl-bind bindmethod=simple
binddn="cn=Manager"
credentials=mypassword
syncrepl rid=500
provider=ldaps://sourceserver01.dest.net:636
binddn="cn=Manager"
bindmethod=simple
credentials=mypassword
searchbase="dc=basecorp,dc=net"
filter="(objectClass=*)"
scope=sub
schemachecking=on
type=refreshAndPersist
retry="5 5 300 5"
overlay syncprov
Наконец, позвольте мне бросить грязь в воду:
Я использовал нм:
[root@buildtest01 ~]# nm /usr/libexec/openldap/back_ldap-2.4.so.2 | grep ldap_add
U ldap_add_ext
А вот и мой пропавший символ. Чт!?
решение1
Как и предполагал @c4f4t0r, у вас (пока) нет проблем с конфигурацией — у вас естьпроблемы, связанные со сборкой.
TL;DR:не используйте динамические бэкенды, они в основном сломаны, если вы не возитесь с процессом сборки. Перейдите к обновлению ниже, чтобы узнать ужасные подробности...
Вероятно, у вас есть старые или не-OpenLDAP библиотеки LDAP в системных расположениях по умолчанию. Я не верю, что скрипт configure
достаточно умен, чтобы проверить это условие, или что процесс сборки достаточно надежен, чтобы справиться с ним. Например, если старая библиотека libldap.so
найдена в системном расположении библиотеки, то она будет использоваться вместо правильной и свежеустановленной libldap.so
во время выполнения. Запуск ldd
против back_ldap-2.4.so
должен показать это.
Это можно исправить (без пересборки), добавив соответствующий каталог в переменную среды LD_LIBRARY_PATH
, чтобы в первую очередь выполнялся поиск каталога с новейшими библиотеками OpenLDAP (не забудьте указать export
переменную).
Или исправьте это (предпочтительнее) во время сборки, запустив configure
с LDFLAGS
переменной окружения, установленной сRPATH
который жестко закодирует путь поиска библиотеки в собираемых вами двоичных файлах.
Вы не указали свои configure
параметры или путь установки и т. д. В прошлом я использовал вариации на эту тему:
export LDFLAGS="-L/usr/local/ssl/lib -Wl,-rpath,/usr/local/ssl/lib"
в случае, когда я хочу использовать несистемный OpenSSL, то же самое применимо и к использованию несистемной версии BerkeleyDB. В Solaris вам может потребоваться использовать "-R" вместо "-rpath" (если вы используете gcc
компоновщик Sun, а не GNU):
export LDFLAGS="-L/usr/local/ssl/lib -R/usr/local/ssl/lib"
В вашем случае вам, вероятно, просто нужно задать rpath ( -Wl,-rpath
или -R
), а не -L
(хотя я рекомендую использовать оба в случаях OpenSSL и BerkeleyDB).
ОбновлятьВы строите с помощью:
/configure --prefix=/usr --sysconfdir=/etc --enable-slapd --enable-crypt \
--enable-modules --enable-bdb=mod --enable-hdb=mod --enable-ldap=yes \
--enable-perl=mod --enable-overlays=mod --with-tls --with-gnu-ld
Примечание " --enable-ldap=yes
",это статически встраивает LDAP-бэкэнд вslapd
, он не создает динамически загружаемый back_ldap.so
(т.е. --enable-ldap=mod
). Одна из возможностей заключается в том, что у вас есть бродяга back_ldap.so
, которую вы пытаетесь загрузить на свой сервер, и ненужный moduleload back_ldap
. Однако, slapd
не позволит вам загрузить динамический модуль, если существует статический модуль с тем же именем, поэтому ваш slapd
двоичный файл не выглядит так, как вы описали.
Запустите slapd -VVV
для подтверждения статических бэкэндов.
Если предположить, back_ldap
что данные статичны, вы сможете обойти эту проблему и удалить все ошибочные moduleload
и устаревшие данные .so
для надежности.
у меня естьсильныйподозрение, что здесь таится какая-то ошибка libtool, зависимость или проблема с компоновщиком. Я могу воспроизвести это с помощью динамического back_ldap. ldap_add_ext
действительно неразрешенный символ, который не обязательно является проблемой (из-за явного dlopen()
для модулей), но этот символ не экспортируется slapd
. Онявляетсяэкспортируется libldap.so
, но это не зависимость back_ldap.so
и ничто другое не приводит libldap
к загрузке. (Это также означает, что совет, который я дал выше, не решит проблему, поскольку она не так проста, как проблема с путями к библиотекам.)
Происходит (т. е. ошибка, которую вы видите) то, что символ ldap_add_ext
не разрешается, пока он не требуется (ленивая" привязка). Когда вы пытаетесь добавить объект LDAP, он, конечно же, требуется. Затем колеса сходят с ума. (Если вы чувствуете потребность, вы можете прервать его во время запуска, экспортировав , LD_BIND_NOW=1
который отключает ленивую привязку, затем start slapd
, хотя есть вероятность, что другой символ отключит его.)
Сейчас самый простой вариант — работать со статическим back_ldap
( --enable-ldap=yes
и, возможно, make clean && make depend && make install
убедиться, что slapd
он построен правильно). Менее простой вариант — использовать для обхода проблемы зависимости и скрестить пальцы, надеясь, что это не будет иметь каких-то странных побочных эффектов.LD_PRELOAD=/usr/lib/libldap.so
LD_PRELOAD=/usr/lib/libldap_r.so
Хорошо, это древнее письмо решает эту проблему:http://www.openldap.org/lists/openldap-software/200211/msg00469.html
slapd
libldap_r.a
по умолчанию связан со статикой ,это ограничивает символы, которые будут доступны тем, которые известны во время ссылкиПоскольку динамические модули загружаются во время выполнения, компоновщик dlopen()
не видит их требований (символов/библиотек).
Можно было бы сделать обоснованный вывод, что динамическая сборка (некоторых) бэкэндов уже некоторое время практически не работает.
Поэтому либо не используйте динамические бэкэнды (рекомендуется), либо подделывайте сборку (не рекомендуется) с помощью чего-то вроде:
make depend && make
rm servers/slapd/slapd
LTSTATIC="" make -e # alternative to editing the Makefile
make install
Это ссылается slapd
на libldap_r.so
только что созданный вами вместо .a
, поэтому все символы могут быть загружены при необходимости (это также делает slapd
диск меньше примерно на 15%). Я не запускал рабочий сервер LDAP с этим, YMMV. Должны быть какие-то похожие или альтернативные решения, используемые дистрибутивами...
решение2
Это не проблема конфигурации, ошибка очевидна и говорит о том, что openldap ищет функцию в библиотеке /usr/libexec/openldap/back_ldap-2.4.so.2, которой там нет.
Почему в RedHat 5 не используется стандартный ldap в формате rpm?