我有一台 Linux (4.1.12-61.1.34.el6uek.x86_64) 机器,上面有一个 slapd 服务 (slapd 2.4.40)。我想要实现的是将所有客户端 ldap 相关流量通过此 slapd 实例透明地代理到 Active Directory 服务器。我需要这样做的原因是流量需要通过 TLS 1.2 进行隧道传输,而我的客户端应用程序不支持它。不幸的是,我无法控制客户端,这是理所当然的。
客户端需要使用用户提供的用户名和密码对 AD 进行身份验证。然后获取此用户所属的组列表,相当简单。服务器需要使用绑定用户和纯文本密码进行简单绑定。当我尝试通过 slapd 实例查询 AD 服务器时,我总是得到以下错误(运行时slapd -f slapd.conf -d 4 -d 16 -d 32
)
send_ldap_result:错误=49 匹配=“”文本=“”
这实际上意味着身份验证失败。当我绕过 slapd 代理并使用 ldapsearch 直接连接到 AD 时,一切都运行正常。
通过 slapd 进行 ldapsearch(出现错误):
ldapsearch -H ldap://localhost -x -D cn=user,ou=bind,dc=domain,dc=com -W -s sub "(cn=VNA-*)" -v
ldapsearch direct(无错误,返回来自 AD 的结果):
ldapsearch -H ldaps://ad.domain.com:636 -x -D cn=user,ou=bind,dc=domain,dc=com -W -s sub "(cn=VNA-*)" -v
我尝试了各种选项,主要是 idassert-bind,但似乎都没有什么效果。如果能帮助我实现这个功能,我将不胜感激。
我的 slapd.conf
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/inetorgperson.schema
# Global options
loglevel 256
sizelimit unlimited
idletimeout 3600
writetimeout 600
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
allow bind_v2
# Modules
modulepath /usr/lib/openldap
modulepath /usr/lib64/openldap
moduleload back_ldap
TLSCACertificateFile /etc/openldap/cacerts/cacert.pem
database ldap
readonly yes
uri "ldaps://ad.domain.com:636"
suffix "dc=domain,dc=com"
idassert-bind bindmethod=simple
mode=self
binddn="cn=user,ou=bind,dc=domain,dc=com"
credentials=secret
tls_reqcert=never
tls_cacert=/etc/openldap/cacerts/cacert.pem
idassert-authzFrom "*"
答案1
我最终放弃了这个,改用了 stunnel,效果很好。