我正在尝试使用 openldap 元后端在单个查询中完成以下操作:
查询本地 openldap 数据库中的帐户。(我控制此资源,只有少数帐户会存储在这里。)
如果本地找不到该帐户,则接下来查询活动目录(我无法在其中创建帐户)
用户只能在其中一个中找到,但不能同时在两个中找到。
我尝试按照许多教程来完成此操作,但没有一个符合我的具体情况,而且我无法对其中任何一个进行调整以使其正常工作。
为了测试,我创建了一个简单的 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 文件。