使用元数据库后端结合活动目录数据库和 openldap 本地数据库

使用元数据库后端结合活动目录数据库和 openldap 本地数据库

我正在尝试使用 openldap 元后端在单个查询中完成以下操作:

  1. 查询本地 openldap 数据库中的帐户。(我控制此资源,只有少数帐户会存储在这里。)

  2. 如果本地找不到该帐户,则接下来查询活动目录(我无法在其中创建帐户)

用户只能在其中一个中找到,但不能同时在两个中找到。

我尝试按照许多教程来完成此操作,但没有一个符合我的具体情况,而且我无法对其中任何一个进行调整以使其正常工作。

为了测试,我创建了一个简单的 LDIF 后端来允许匿名绑定:

    database   ldif
    suffix     "ou=local,dc=proxy,dc=ldap"
    directory  "/var/lib/ldap/"

我的元配置如下:

    database             meta
    suffix               "dc=example,dc=com"

    uri                  "ldaps://ad.my.edu/ou=org-1,dc=example,dc=com"
    suffixmassage        "dc=org-1,dc=example,dc=com" "ou=axxxx,dc=sxxxx,dc=xxx,dc=xx,dc=xxx"
    idassert-authzFrom   "dn:*"
    idassert-bind        bindmethod=simple
                 binddn="cn=XXXX,ou=it,ou=services,ou=axxxx,dc=sxxxx,dc=nxx,dc=xx,dc=xxx"
                 credentials="XXXX"
                 mode=none

    overlay              rwm
    rwm-map              attribute uid sAMAccountName
    rwm-map              objectClass posixAccount person

    uri                  "ldap://127.0.0.1/ou=org-2,dc=example,dc=com"
    suffixmassage        "ou=org-2,dc=example,dc=com" "ou=local,dc=proxy,dc=ldap"

以下是我从命令行搜索的结果:

    ldapsearch -x -H 'ldap://127.0.0.1' -b dc=example,dc=com -s sub '(sAMAccountNAme=xxxxxx*)' -LLL

    slapd[1949]: conn=1014 op=2 UNBIND
    slapd[1949]: conn=1014 fd=9 closed
    slapd[1949]: conn=1015 fd=9 ACCEPT from IP=127.0.0.1:59624 (IP=127.0.0.1:389)
    slapd[1949]: conn=1015 op=0 BIND dn="" method=128
    slapd[1949]: conn=1015 op=0 RESULT tag=97 err=0 text=
    slapd[1949]: conn=1015 op=1 SRCH base="dc=example,dc=com" scope=2 deref=0 filter="(?sAMAccountName=xxxxxxxx*)"
    slapd[1949]: conn=1015 op=1 meta_search_dobind_init[0]: retrying URI="ldaps://ad.my.edu" DN="cn=xxxx,ou=it,ou=services,ou=axxxx,dc=sxxxx,dc=nxx,dc=xx,dc=xxx"
    slapd[1949]: conn=1002 op=9 SRCH base="ou=local,dc=proxy,dc=ldap" scope=2 deref=0 filter="(?sAMAccountName=xxxxxxx*)"
    slapd[1949]: conn=1002 op=9 SEARCH RESULT tag=101 err=32 nentries=0 text=
    slapd[1949]: conn=1015 op=1 meta_back_search[1] match="" err=32 (No such object) text="".
    slapd[1949]: conn=1015 op=1 SEARCH RESULT tag=101 err=32 nentries=0 text=
    ldapsearch[2054]: DIGEST-MD5 common mech free
    slapd[1949]: conn=1015 op=2 UNBIND
    slapd[1949]: conn=1015 fd=9 closed

我取得了一些进展。如果本地找不到用户信息,我现在可以从 Active Directory 中检索用户信息,但无法重新绑定为用户以完成身份验证。

我收到“代理操作重试失败”错误:

    slapd[22555]: conn=1000 fd=8 ACCEPT from IP=127.0.0.1:35848 (IP=127.0.0.1:389)
    slapd[22555]: conn=1001 fd=9 ACCEPT from IP=127.0.0.1:35850 (IP=127.0.0.1:389)
    slapd[22555]: conn=1000 op=0 BIND dn="cn=xxxx,ou=local" method=128
    slapd[22555]: conn=1000 op=0 BIND dn="cn=xxxx,ou=local" mech=SIMPLE ssf=0
    slapd[22555]: conn=1000 op=0 RESULT tag=97 err=0 text=
    slapd[22555]: conn=1000 op=1 SRCH base="dc=example,dc=com" scope=2 deref=0 filter="(uid=xxxxxx)"
    slapd[22555]: conn=1002 fd=11 ACCEPT from IP=127.0.0.1:35852 (IP=127.0.0.1:389)
    slapd[22555]: conn=1002 op=0 BIND dn="cn=xxxx,ou=local" method=128
    slapd[22555]: conn=1002 op=0 BIND dn="cn=xxxx,ou=local" mech=SIMPLE ssf=0
    slapd[22555]: conn=1002 op=0 RESULT tag=97 err=0 text=
    slapd[22555]: conn=1003 fd=13 ACCEPT from IP=127.0.0.1:35854 (IP=127.0.0.1:389)
    slapd[22555]: conn=1003 op=0 BIND dn="cn=xxxx,ou=local" method=128
    slapd[22555]: conn=1003 op=0 BIND dn="cn=xxxx,ou=local" mech=SIMPLE ssf=0
    slapd[22555]: conn=1003 op=0 RESULT tag=97 err=0 text=
    slapd[22555]: conn=1002 op=1 SRCH base="ou=xxxx,dc=sxxxx,dc=nxx,dc=xx,dc=xxx" scope=2 deref=0 filter="(uid=xxxxxx)"
    slapd[22555]: conn=1003 op=1 SRCH base="ou=local" scope=2 deref=0 filter="(uid=xxxxxx)"
    slapd[22555]: conn=1003 op=1 SEARCH RESULT tag=101 err=32 nentries=0 text=
    slapd[22555]: conn=1000 op=1 meta_back_search[1] match="" err=32 (No such object) text="".
    slapd[22555]: conn=1002 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=
    slapd[22555]: conn=1000 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=
    slapd[22555]: conn=1001 op=0 BIND dn="cn=xxxxxx,ou=xxxx,dc=a,dc=example,dc=com" method=128
    slapd[22555]: conn=1004 fd=16 ACCEPT from IP=127.0.0.1:35858 (IP=127.0.0.1:389)
    slapd[22555]: conn=1004 op=0 BIND dn="cn=xxxxxx,ou=General,ou=xxxx,dc=sxxxx,dc=nxx,dc=xx,dc=xxx" method=128
    slapd[22555]: conn=1004 op=0 ldap_back_retry: retrying URI="ldaps://active.directory" DN=""
    slapd[22555]: conn=1004 op=0 RESULT tag=97 err=52 text=Proxy operation retry failed
    slapd[22555]: conn=1004 op=1 UNBIND
    slapd[22555]: conn=1001 op=0 RESULT tag=97 err=52 text=
    slapd[22555]: conn=1004 fd=16 closed

这是我修改后的元配置:

    database meta
    suffix dc=example,dc=com
    # The last rwm-map line maps all other attributes to nothing.
    overlay rwm
    rwm-map attribute uid sAMAccountname
    rwm-map attribute *
    #rwm-map objectclass posixGroup group
    #rwm-map objectclass posixAccount person
    #rwm-map objectclass memberUid member

    ##
    uri "ldap://127.0.0.1/dc=a,dc=example,dc=com"
    suffixmassage "dc=a,dc=example,dc=com" "ou=xxxx,dc=sxxxx,dc=nxx,dc=xx,dc=xxx"
    rebind-as-user true
    idassert-bind
      bindmethod=simple
      binddn="cn=XXXX,ou=local"
      credentials=XXXX
      mode=none
    idassert-authzFrom "dn.regex:.*"

    ##
    uri "ldap://127.0.0.1/dc=b,dc=example,dc=com"
    suffixmassage "dc=b,dc=example,dc=com" "ou=local"
    rebind-as-user true
    idassert-bind
      bindmethod=simple
      binddn="cn=XXXX,ou=local"
      credentials=XXXX
      mode=none
    idassert-authzFrom "dn.regex:.*"

    ##
    database ldap
    uri ldaps://active.directory
    suffix ou=xxxx,dc=sxxxx,dc=nxx,dc=xx,dc=xxx
    rebind-as-user true
    idassert-bind
      bindmethod=simple
      binddn="cn=XXXX,ou=xxxx,ou=sxxxx,ou=axxxx,dc=sxxxx,dc=nxx,dc=xx,dc=xxx"
      credentials=XXXX
      tls_reqcert=allow
      tls_cacert=/etc/letsencrypt/live/xxxx/fullchain.pem
      tls_cert=/etc/letsencrypt/live/xxxx/cert.pem
      tls_key=/etc/letsencrypt/live/xxxx/privkey.pem
      mode=none
    idassert-authzFrom "dn.regex:.*"

答案1

我搜索这个解决方案大约一个月,最终在看到与我的问题间接相关的 openldap 线程中的示例配置后,在 slapd 手册页中偶然找到了答案。

我的解决方案的关键是 ldap 后端的 idassert-bind 标志部分。我添加了

flags=override

来自 slapd 手册页:

旗帜可以是

覆盖,[非]规定性,代理授权[非]关键

当使用覆盖标志时,即使数据库正在授权客户端的身份,也会发生身份断言,即在与提供的身份绑定并对其进行身份验证之后,代理会使用配置的身份和身份验证方法执行身份断言。

最终工作的后端 LDAP 配置:

database meta
suffix dc=example,dc=com

##
uri "ldaps://127.0.0.1/dc=a,dc=example,dc=com"
suffixmassage "dc=a,dc=example,dc=com" "ou=local"
rebind-as-user yes
idassert-bind 
   bindmethod=simple 
   binddn="cn=admin,ou=local" 
   credentials=XXXXXXXX 
   starttls=yes 
   tls_reqcert=allow 
   tls_cacert=/etc/letsencrypt/live/my.site.com/fullchain.pem 
   tls_cert=/etc/letsencrypt/live/my.site.com/cert.pem 
   tls_key=/etc/letsencrypt/live/my.site.com/privkey.pem 
   mode=none
idassert-authzFrom "dn.regex:.*"

##
uri "ldaps://127.0.0.1/dc=b,dc=example,dc=com"
suffixmassage "dc=b,dc=example,dc=com" "ou=axxxx,dc=sxxxx,dc=nxx,dc=xx,dc=xxx"
rebind-as-user yes
idassert-bind 
   bindmethod=simple 
   binddn="cn=admin,ou=local" 
   credentials=XXXXXXXX 
   starttls=yes 
   tls_reqcert=allow 
   tls_cacert=/etc/letsencrypt/live/my.site.com/fullchain.pem 
   tls_cert=/etc/letsencrypt/live/my.site.com/cert.pem 
   tls_key=/etc/letsencrypt/live/my.site.com/privkey.pem mode=none
   mode=none
idassert-authzFrom "dn.regex:.*"

##
database ldap
uri ldaps://ldaps.my.site.com/
suffix "OU=AXXXX,DC=sxxxx,DC=nxx,DC=xx,DC=xxx"
rebind-as-user yes
chase-referrals yes
readonly yes
idassert-bind
   bindmethod=simple
   binddn="CN=IXXXX,OU=IX,OU=SXXXX,OU=AXXXX,DC=sxxxx,DC=nxx,DC=xx,DC=xxx"
   credentials=XXXXXXXX
   flags=override
   mode=none
idassert-authzFrom "dn.regex:.*"

# The last rwm-map line maps all other attributes to nothing.
overlay rwm
rwm-map attribute uid sAMAccountname
rwm-map attribute cn cn
rwm-map attribute sn sn
rwm-map attribute givenName givenName
rwm-map attribute employeeID employeeID
rwm-map attribute employeeNumber employeeNumber
rwm-map attribute uidNumber uidNumber
rwm-map attribute gidNumber gidNumber
rwm-map attribute mail mail
rwm-map attribute departmentNumber departmentNumber
rwm-map attribute department department
rwm-map attribute home extensionAttribute12
rwm-map attribute *

答案2

为了与任何后端服务器(Active Directory 或其他 ldap 目录)建立 ssl 代理连接,openldap 服务器应该使用 SSL/TLS 进行编译。

要检查你的 ldap 服务器是否使用 ssl/TLS 编译,请运行以下命令

# ldd /usr/local/openldap/libexec/slapd | grep ssl
        libssl.so.10 => /lib64/libssl.so.10 (0x00007f561c08d000)

它应该返回 libssl,然后它才会与后端 ldap 服务器建立 ssl 连接。如果您的服务器没有提供上述输出,请再次编译 openldap 包并尝试。

为了进行编译,首先安装 rpm - openldap-devel

# yum install openldap-devel  libtool-ltdl-devel gcc -y 

然后使用以下选项编译 openldap - --with-tls=openssl

./configure --enable-bdb --enable-meta --enable-overlays --enable-ldap --prefix=/usr/local/openldap  --with-tls=openssl 

我使用以下选项从源代码安装 openldap-server,

# export CPPFLAGS="-I/usr/local/openldap/berkeleydb/include"
# export LDFLAGS="-L/usr/local/openldap/berkeleydb/lib -L/lib64 -Wl,-R,/usr/local/openldap/berkeleydb/lib -Wl,--enable-new-dtags"
# CFLAGS="-I/usr/local/openldap/berkeleydb/include/ -I/usr/local/include -I/usr/include"
# export CFLAGS
#export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/openldap/berkeleydb/lib:/lib64/"

# ../dist/configure --prefix=/usr/local/openldap/berkeleydb
# make 
# make install 

# ./configure --enable-bdb --enable-meta --enable-overlays --enable-ldap --prefix=/usr/local/openldap --with-tls=openssl 
# make depend 
# make 
# make install

还要在文件 ldap.conf 中添加一行 TLS_REQCERT never。

echo "TLS_REQCERT never" >> /usr/local/openldap/etc/openldap/ldap.conf

然后配置您的 slapd.conf 文件。

相关内容