Я работаю с аутентификацией LDAP со следующей настройкой
AuthName "whatever"
AuthType Basic
AuthBasicProvider ldap
AuthLDAPUrl "ldap://server/OU=SBSUsers,OU=Users,OU=MyBusiness,DC=company,DC=local?sAMAccountName?sub?(objectClass=*)"
Require ldap-group CN=MySpecificGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local
Это работает, однако я должен поместить всех пользователей, которых хочу аутентифицировать, в MySpecificGroup
. Но на сервере LDAP я настроил это MySpecificGroup
также содержит группу MyOtherGroup
с другим списком пользователей.
Но эти пользователи в MyOtherGroup
не аутентифицированы, мне нужно вручную добавить их все в MySpecificGroup
и в принципе не может использовать вложенную группировку. Я использую Windows SBS 2003.
Есть ли способ настроить Apache LDAP для этого? Или существует проблема с возможной бесконечной рекурсией и, следовательно, недопустимой?
Кроме AuthLDAPSubGroupDepth
, который доступен только в apache 2.4, при использовании Microsoft AD LDAP можно выполнять авторизацию с использованием вложенных групп с помощью правила сопоставления LDAP_MATCHING_RULE_IN_CHAIN. Это намного быстрее, чем поиск в подгруппах на клиенте, потому что он выполняется на сервере DC с меньшим количеством запросов по сети.
Require ldap-filter memberof:1.2.840.113556.1.4.1941:=CN=Access to Apache,OU=My Organization Unit,DC=company,DC=com
Строка 1.2.840.113556.1.4.1941
является OID называется LDAP_MATCHING_RULE_IN_CHAIN
. Этот OID назначается Microsoft для использования с его реализацией LDAP (часть Active Directory). Вы не можете использовать его с другими серверами LDAP. Формат, который можно использовать для человека: iso(1).member_body(2).us(840).microsoft(113556).ad(1).as_schema(4).LDAP_MATCHING_RULE_IN_CHAIN(1941)
Из документации Microsoft:
Это правило ограничено фильтрами, которые применяются к DN. Это специальный «расширенный» оператор сопоставления, который просматривает цепочку предков в объектах вплоть до корня, пока не найдет совпадение.
Смотрите также:
Вам нужно установить AuthLDAPSubGroupDepth
чтобы заставить эту работу. Целое число, которое вы здесь указываете, определяет максимальную глубину вложенности подгрупп, которая будет оценена до того, как пользовательский поиск будет прекращен.
Добавьте это в свою конфигурацию:
AuthLDAPSubGroupDepth 1
Похоже, что ваш единственный вариант в Apache 2.2 - перечислить все группы, которые включены в вашу основную авторизованную группу.
Require ldap-group CN=MySpecificGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local
Require ldap-group CN=MyOtherGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local
Это должно быть разумно, если ваши вложенные группы не слишком сложные.
Вы можете настроить OpenLDAP с помощью slapd_meta оверлей, запущенный на вашем веб-сервере для прокси вашей аутентификации.
/etc/ldap/slapd.conf должен выглядеть примерно так:
database meta
suffix "DC=company,DC=local"
uri "ldap://a.foo.com/OU=MyBusiness,DC=company,DC=local"
uri "ldap://b.foo.com/OU=otherdomainsuffix,DC=company,DC=local"
Тогда ваша строфа mod_authnz_ldap будет выглядеть примерно так:
AuthName "whatever"
AuthType Basic
AuthBasicProvider ldap
AuthLDAPUrl "ldapi:///DC=company,DC=local?sAMAccountName?sub?(objectClass=*)"
Require ldap-group CN=MySpecificGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local
Require ldap-group CN=MyOtherGroup,OU=Security Groups,OU=otherdomainsuffix,DC=company,DC=local
Это потребует некоторого массажа, чтобы заставить его работать, но я думаю, что это общая идея.
Хотя решение, предоставленное @Mircea_Vutcovici, сработало для меня, моя единственная критика заключается в том, что люди могут проявлять брезгливость, когда видят, что используются побитовые операторы.
Например, я передам установку Apache Bloodhound, которая использует Apache HTTPd в качестве интерфейса с авторизацией группы AD, группе других разработчиков. У них будут проблемы с побитовыми операторами. Админы, конечно, не будут такими брезгливыми ... Надеюсь.
При этом у меня есть решение, которое не использует побитовый оператор и не использует несколько определений ldap-group.
У меня работает следующая конфигурация:
<Location /protected>
# Using this to bind
AuthLDAPURL "ldap://<MY_SERVER>:3268/<MY_SEARCH_BASE>?sAMAccountName?sub?(objectClass=user)"
AuthLDAPBindDN "<MY_BIND_DN>"
AuthLDAPBindPassword "<MY_PASSWORD>"
LDAPReferrals Off
AuthType Basic
AuthName "USE YOUR AD ACCOUNT"
AuthBasicProvider ldap
Require ldap-group <MY_PARENT_GROUP>
AuthLDAPMaxSubGroupDepth 1
AuthLDAPSubgroupAttribute member
AuthLDAPSubGroupClass group
AuthLDAPGroupAttribute member
AuthLDAPGroupAttributeIsDN on
</Location>
Критической частью был следующий конфиг:
AuthLDAPSubGroupClass group
AuthLDAPMaxSubGroupDepth не работает ни сам по себе, ни в сочетании с AuthLDAPSubgroupAttribute. Только когда я использовал AuthLDAPSubGroupClass, авторизация против подгрупп начала работать ... по крайней мере, для меня и моей ситуации.