我正在尝试配置在 Centos 6.5 上运行的 SASL,以允许对企业活动目录服务器进行身份验证。最终目标是验证对该服务器上运行的一些 subversion 存储库的访问,但在此阶段,我只是尝试让 saslauthd 进行身份验证,并使用 testsaslauthd 对其进行测试。
每次验证都会失败,日志中会出现以下内容:
saslauthd[20843] :do_auth : auth failure: [user=MYUSER] [service=svn] [realm=MYREALM] [mech=ldap] [reason=Unknown]
saslauthd[20843] :do_request : response: NO
这是我的 /etc/saslauthd.conf:
ldap_auth_method: bind
ldap_servers: ldaps://ldap.ad.mycompany.com:3269/
ldap_bind_dn: MYBINDDN
ldap_password: xxxxxxxxxx
ldap_search_base: DC=mycompany,DC=xx
ldap_filter: (&(cn=%u)(objectClass=person))
ldap_referrals: yes
log_level: 10
请注意,我知道 ldap 服务器 URI、绑定 DN、密码、搜索库和过滤器是正确的,因为我有一个 perl 脚本,它使用这些来对网站执行身份验证,并且它运行良好。该 perl 脚本使用 Net::LDAP,绑定到 AD,使用搜索库和过滤器搜索用户,然后尝试使用用户的 DN 和密码进行绑定。据我所知,这正是 SASL 应该按照我配置的方式尝试执行的操作。
我的第一个观察结果是,尽管将 log_level 设置为 10,但我只收到一行,告诉我失败原因不明。我使用 -d(调试)选项从 shell 启动 saslauthd。我还能做什么来获得更多调试输出?
有什么方法可以记录 LDAP 交互吗?
最后,有人能看出我的配置有什么问题吗?也许是某些 AD 怪癖需要在 SASL 配置中进行特殊设置?
答案1
最后,我无法让 saslauthd 输出任何更好的调试信息,但如果它能帮助其他人,以下是我解决问题所遵循的过程。
首先我使用 strace 启动 saslauthd,如下所示:
# strace -f saslauthd -d -a ldap
然后我可以看到 saslauthd 进行的所有系统调用。看起来好像它在与 AD 服务器的初始交换期间失败了,可能是在 TLS 协商期间。
我决定看看是否可以使用 openldap 提供的命令行 ldapsearch 工具重现类似的行为。我给出了如下命令:
$ ldapsearch -d 9 -H ldaps://ldap.ad.mycompany.com:3269/ -D MYBINDDN -w xxxxxx \
-b DC=mycompany,DC=xx '(&(cn=myuser)(objectClass=person))'
-d 9 最终给了我一些有用的调试输出:
TLS: certificate [CN=VeriSign Class 3 Public Primary Certification Authority - G5,OU="(c) 2006 VeriSign, Inc. - For authorized use only",OU=VeriSign Trust Network,O="VeriSign, Inc.",C=US] is not valid - error -8179:Peer's Certificate issuer is not recognized..
阅读 ldap.conf 的手册页后,我发现应该设置 TLS_CACERT 和/或 TLS_CACERTDIR 以指向证书包和文件。我使用的是 Centos 6,它在 /etc/pki/tls/certs/ 中有这些内容,因此我进行了以下设置:
TLS_CACERT /etc/pki/tls/certs/ca-bundle.crt
TLS_CACERTDIR /etc/pki/tls/certs/
此后,ldapsearch 开始工作,并且重新启动 saslauthd 后,对 AD 服务器的身份验证成功。
答案2
即使使用-d
,saslauthd 也不会将调试信息记录到 stdout。相反,它会使用该AUTH
工具将调试信息记录到 syslog 中。