OpenLDAP의 LDAP 백엔드 관련 문제

OpenLDAP의 LDAP 백엔드 관련 문제

좋은 아침이에요;

LDAP 데이터를 복제하기 위해 LDAP 프록시 서버를 설정한 후 다음 메시지가 계속 나타납니다.

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

52a0b5ca send_ldap_result: err=32 match="" text=""

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 배포판을 포함한 소스에서 설치됩니다. 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

마지막으로 물에 진흙을 던져 보겠습니다.

나는 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새로 설치된 올바른 항목보다 우선적으로 사용됩니다 . libldap.so실행하면 lddback_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에서는 "-rpath" 대신 "-R"을 사용해야 할 수도 있습니다( gccGNU 링커가 아닌 Sun 링커와 함께 사용하는 경우).

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 백엔드를 정적으로 구축합니다.slapdback_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.soLD_PRELOAD=/usr/lib/libldap_r.so


좋습니다. 이 오래된 이메일은 문제를 다룹니다.http://www.openldap.org/lists/openldap-software/200211/msg00469.html slapdlibldap_r.a기본적으로 정적에 연결되어 있습니다 .이는 링크 타임에 알려진 기호가 사용할 수 있는 기호를 제한합니다.. 동적 모듈은 링커를 사용하여 런타임에 로드되므로 dlopen()요구 사항(기호/라이브러리)이 표시되지 않습니다.

(일부) 백엔드의 동적 구축이 한동안 거의 중단되었다고 합리적으로 결론을 내릴 수도 있습니다.

따라서 동적 백엔드를 사용하지 않거나(권장) 다음과 같이 빌드를 퍼지(권장하지 않음)하세요.

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

이 링크는 대신 방금 구축한 에 slapd대한 링크 이므로 필요할 때 모든 기호를 로드할 수 있습니다( 디스크 용량도 약 15% 더 작아집니다). 저는 YMMV를 사용하여 LDAP 서버를 운영하지 않았습니다. 배포판에서 사용하는 유사하거나 대체 솔루션이 있어야 합니다.libldap_r.so.aslapd

답변2

이것은 구성 문제가 아니며 오류는 분명하며 openldap이 /usr/libexec/openldap/back_ldap-2.4.so.2 라이브러리에서 존재하지 않는 함수를 찾고 있음을 알려줍니다.

Redhat 5에서 표준 LDAP를 rpm 형식으로 사용하지 않는 이유는 무엇입니까?

관련 정보