OpenLDAP中LDAP后端的问题

早上好;

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

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

52a0b5ca send_ldap_result:err = 32 matched =“”text =“”

52a0b5ca ==> ldap_back_add(“dc = basecorp,dc = net”)

52a0b5ca => ldap_back_getconn:conn 0x7f40ea0 fetched refcnt = 1。

/ usr / libexec / slapd:符号查找错误:/usr/libexec/openldap/back_ldap-2.4.so.2:undefined symbol:ldap_add_ext

在Solaris 10 x86主机以及RedHat 5.5主机上,这都与OpenLDAP 2.4.37兼容。 两者都从源头安装,包括最新的BDB发行版。 sourceserver是我希望从中提取数据并同步到destserver的机器(请参阅下面的configuration)。

所以,我尝试运行代理的两台机器的唯一共同之处就是我(呃!)。 是我反向设置代理的问题? 也许我不允许向LDAP后端添加条目? 希望你们都可以在下面检查我的configuration,并回答我的问题以及其他许多问题。

我的代理的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 

还有我失踪的象征。 问心无愧!?

正如@ c4f4t0r推测的那样,你还没有(configuration)问题 – 你正在构build相关的问题

TL; DR:不要使用dynamic后端,它们大部分都会被破坏,除非你在构build过程中进行操作。 跳到下面的更新为可怕的细节…


您可能在默认的系统位置中有旧的或非OpenLDAP LDAP库。 我不相信configure脚本足够聪明来testing这种情况,或者说构build过程足够健壮以处理它。 例如,如果在系统库位置中find旧的libldap.so ,那么在运行时将优先使用正确的和新安装的libldap.so 。 对back_ldap-2.4.so运行ldd应该显示这个。

您可以通过将相关目录添加到环境variablesLD_LIBRARY_PATH来解决此问题(无需重build),以便首先search带有最新OpenLDAP库的目录(确保exportvariables)。

或者,在构build时,通过运行configure使用设置了一个RPATHLDFLAGS环境variables(将把库searchpath硬编码到您构build的二进制文件中)来修复(最好)。

你还没有给出你的configure选项或安装path等。我在过去使用过这种变化:

 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 (尽pipe我build议同时使用OpenSSL和BerkeleyDB的情况)。


更新您正在build设:

 /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后端静态地构build到slapd ,而不会创build一个dynamic加载的back_ldap.so (即--enable-ldap=mod )。 一种可能是你有一个你正试图加载到你的服务器的moduleload back_ldap和一个不需要的moduleload back_ldap 。 但是, slapd将不允许您在存在相同名称的静态模块时加载dynamic模块,因此您的slapd二进制文件看起来不像您所描述的那样。

运行slapd -VVV来确认静态后端。

假设back_ldap是静态的,你应该能够解决这个问题,并删除任何错误的moduleload和陈旧的.so好的措施。

我有一个强烈的怀疑有一些libtool,依赖错误或链接器问题潜伏在这里。 我可以用dynamic的back_ldap重现这一点。 ldap_add_ext确实是一个未解决的符号,不一定是问题(由于模块的显式dlopen() ),但是这个符号不是由slapd导出的。 它libldap.so导出的,但这不是back_ldap.so的依赖关系,没有其他任何事情导致libldap被加载。 (这也意味着我上面给出的build议不会解决问题,因为它不像图书馆path问题那么简单。)

发生了什么事(即你所看到的错误)是符号ldap_add_ext在需要(“懒惰”绑定)之前没有被parsing。 当你尝试添加一个LDAP对象时,它当然是最终需要的。 然后车轮脱落。 (你应该感受到这种冲动,你可以在开始时通过导出LD_BIND_NOW=1来closures延迟绑定,然后启动slapd ,虽然赔率是一个不同的符号将会跳过它)。

现在最简单的select是使用静态的back_ldap--enable-ldap=yes back_ldap --enable-ldap=yes ,也许make clean && make depend && make install确保slapd被正确构build)。 一个不那么简单的select是使用LD_PRELOAD=/usr/lib/libldap.so LD_PRELOAD=/usr/lib/libldap_r.so来解决依赖问题,并且交叉手指希望没有一些奇怪的副作用。


好吧,这个古老的电子邮件覆盖了这个问题: http : libldap_r.a默认情况下slapd与静态libldap_r.a链接, 这限制了可用的符号对那些已知的链接时间 。 由于dynamic模块在运行时使用dlopen()加载,链接器不具有其需求(符号/库)的可见性。

有人可能会合理地得出结论:(一些)后端的dynamicbuild设已经有一段时间了。

所以,要么不要使用dynamic后端(推荐),要么使用类似下面这样的方式来构build(不太推荐):

 make depend && make rm servers/slapd/slapd LTSTATIC="" make -e # alternative to editing the Makefile make install 

这将slapd与您刚刚构build的libldap_r.so链接libldap_r.so ,而不是.a ,所以所有符号都可以在需要的时候加载(这也使slapd在磁盘上减less了大约15%)。 我没有运行一个运行的LDAP服务器,YMMV。 必须有一些类似的或替代解决scheme使用的发行版…

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

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