Python LDAP и проблема Active Directory
Я постараюсь включить как можно больше подробностей, но рассмотрим следующую ситуацию:
Из соображений конфиденциальности, скажем, у меня есть инфраструктура Active Directory, такая как:
microsoft.com
и некоторые дочерние домены:
csharp.microsoft.com
vb.microsoft.com
Все учетные записи пользователей хранятся на microsoft.com.
Я начинаю свой код со следующего:
import ldap
ldap.set_option(ldap.OPT_REFERRALS,0)
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT,ldap.OPT_X_TLS_NEVER)
(Я знаю, что, вероятно, у меня должен быть сертификат для домена, но что вы можете сделать)
Затем я устанавливаю соединение следующим образом:
conn = ldap.initialize("ldaps://microsoft.com:636")
conn.simple_bind_s("user","pass")
В моем скрипте я ищу учетную запись пользователя и использую следующий поиск:
result_id = conn.search("DC=microsoft,DC=com",
ldap.SCOPE_SUBTREE,
"(&(CN=gates)(!(objectClass=contact)))",
None)
result_type,result_data = conn.result(result_id,0)
Хорошо, отлично, так что это работает.... большую часть времени.
Когда это работает, я получаю что-то такое:
[("CN=gates,OU=Users,DC=microsoft,DC=com", {'sAMAccountName':['gates']}])
Тем не менее, кажется случайным, что я получу результаты, подобные следующим:
[(None, ['ldaps://csharp.microsoft.com/DC=csharp,DC=microsoft,DC=com'])]
Хотя результат имеет смысл - gates не существует на csharp.microsoft.com, он существует на microsoft.com DC - он все еще очень озадачивает, потому что у меня сложилось впечатление, что использование параметра OPT_REFERRALS в 0 скажет модулю LDAP Python НЕ использовать рефералов. Чтобы сделать вещи более интересными, я также иногда получаю следующие результаты:
[(None, ['ldaps://ForestDnsZones.microsoft.com/DC=ForestDnsZones,DC=microsoft,DC=com'])]
Итак, мой вопрос - что-то я делаю не так?
Кроме того, было предложено, чтобы, если бы я использовал путь поиска, такой как "OU=Users,DC=microsoft,DC=com" вместо простого поиска в корне ( "DC=microsoft,DC=com"), клиентский модуль LDAP не будет пытаться использовать рефералов - это точно?
редактировать
Проблема оказалась не в LDAP, а в неправильной конфигурации WSGI. Использование WSGIDaemonProcess решило проблему перекрестного загрязнения, с которой мы столкнулись.
1 ответ
Установка ldap.OPT_REFERRALS в 0 указывает серверу не "преследовать" рефералов, то есть не разрешать их.
Результаты с None в качестве первого элемента - это способ сервера сказать вам: "Это реферал, но вы сказали, чтобы я его не преследовал". По крайней мере, это мое понимание.
Если вы не хотите рефералов, просто проигнорируйте результаты с первым элементом None.