Skip to content

Instantly share code, notes, and snippets.

@flisky
Created July 9, 2014 10:13
Show Gist options
  • Save flisky/2f8a1084a3e80d2f8f20 to your computer and use it in GitHub Desktop.
Save flisky/2f8a1084a3e80d2f8f20 to your computer and use it in GitHub Desktop.
LDAP Chase Referrals

记一次LDAP调试之旅

说明: 公司LDAP服务器 M$的ActiveDirectory

现象:

命令行使用正常返回

ldapsearch -x -H ldap://ldap.$$$$.com -b "DC=$$$$,DC=com" -s sub -D '...@$$$$.com' -W '(sAMAccountName=...)'

参数说明:

-x:简单认证(相对SASL认证)
-H: 请求服务地地址URL
-b: 查找的起始点
-s: 查找域(scope)方式 - base|one|sub|children
-D: 绑定识别名(bind dn)
-W: 提示输入密码
‘(sAMAccountName=...)’: 过滤条件

注明:

上面我们绑定的DN是directory object里的userPrincipalName字段。 只所以不肯老实用distinguishedName,是因为公司隔三差五调整DN(F**K)。 而这种方式网上有人说只用AD支持,慎用。

调用库函数始终blocking

import ldap
l = ldap.initialize("ldap://ldap.$$$$.com")
l.simple_bind_s('...', '...')
l.search_s('dn=$$$,dn=com', '....')

经多方调试,最终发现是Referral Chasing造成的。 ldapsearch加上-C 参数重现了这个问题 - 已有相关记录返回,但请求仍未结束, 阻塞到了对DomainDnsZones和ForestDnsZones域的查询上了, 而我们的线上DNS对这两个域不解析。

解决方案:

l.set_option(ldap.OPT_REFERRALS, ldap.OPT_OFF)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment