OpenLDAP 中的 LDAP 后端问题

OpenLDAP 中的 LDAP 后端问题

早上好;

在设置 LDAP 代理服务器以复制 LDAP 数据之后,我不断收到以下消息:

52a0b5ca send_ldap_result:conn=-1 op=0 p=3

52a0b5ca send_ldap_result:错误=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

这是在 Solaris 10 x86 主机和 RedHat 5.5 主机上使用 OpenLDAP 2.4.37 的情况。两者都是从源安装的,包括最新的 BDB 发行版。源服务器是我希望从中提取数据并同步到目标服务器的机器(请参阅下面的配置)。

所以,我尝试运行代理的两台机器唯一的共同点就是我(啊!)。问题是我设置代理时弄反了吗?也许我不允许向 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

最后,请允许我泼点脏水:

我使用了 nm:

[root@buildtest01 ~]# nm  /usr/libexec/openldap/back_ldap-2.4.so.2 | grep ldap_add
                 U ldap_add_ext

还有我丢失的符号。怎么回事?

答案1

正如 @c4f4t0r 所推测的,你(目前)还没有遇到配置问题——你遇到的是构建相关问题

总结:不要使用动态后端,除非你修改构建过程,否则它们大多会损坏。跳到下面的更新以了解可怕的细节...


您的默认系统位置中可能存在旧的或非 OpenLDAP LDAP 库。我不认为该 configure脚本足够智能,可以测试这种情况,或者构建过程足够强大,可以处理这种情况。例如,如果libldap.so在系统库位置中发现旧的,则在运行时将优先使用正确的和新安装的 LDAP 库libldap.so。运行 lddagainstback_ldap-2.4.so应该会显示这一点。

您可以通过将相关目录添加到环境变量来修复此问题(无需重建),LD_LIBRARY_PATH以便首先搜索具有最新 OpenLDAP 库的目录(确保export变量)。

或者,最好在构建时修复它,通过使用设置的环境变量configure运行LDFLAGSRPATH它会将库搜索路径硬编码到您构建的二进制文件中。

您没有提供您的configure选项或安装路径等。我过去曾使用过此类变体:

export LDFLAGS="-L/usr/local/ssl/lib -Wl,-rpath,/usr/local/ssl/lib"

如果我想使用非系统 OpenSSL,则使用非系统版本的 BerkeleyDB 也同样适用。在 Solaris 上,您可能需要使用“-R”而不是“-rpath”(如果您使用的是gccSun 链接器而不是 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这会关闭惰性绑定,然后启动slapd,尽管不同的符号很可能会绊倒它。)

目前最简单的选择是使用静态back_ldap( --enable-ldap=yes,也许make clean && make depend && make install可以确保slapd正确构建)。一个不太简单的选择是使用来解决依赖性问题,并祈祷它不会产生一些奇怪的副作用。LD_PRELOAD=/usr/lib/libldap.soLD_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

这将链接slapdlibldap_r.so您刚刚构建的而不是.a,因此可以在需要时加载所有符号(它还会使slapd磁盘占用减少约 15%)。我还没有用它运行过可操作的 LDAP 服务器,YMMV。发行版中一定有一些类似或替代的解决方案……

答案2

这不是配置问题,错误很明显,告诉您,openldap 正在 /usr/libexec/openldap/back_ldap-2.4.so.2 库中寻找一个不存在的函数。

在 redhat 5 上,为什么不使用 rpm 格式的标准 ldap?

相关内容