Как аутентифицировать пользователей во вложенных группах в Apache LDAP?
У меня работает аутентификация 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 для этого? Или есть проблема с возможной бесконечной рекурсией и, следовательно, не допускается?
4 ответа
Вам нужно установить AuthLDAPSubGroupDepth
чтобы сделать эту работу. Целое число, которое вы здесь указываете, указывает максимальную глубину вложенности подгруппы, которая будет оценена до прекращения поиска пользователя.
Добавьте это к вашей конфигурации:
AuthLDAPSubGroupDepth 1
Кроме того 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. Это специальный "расширенный" оператор сопоставления, который проходит цепочку предков в объектах вплоть до корня, пока не найдет совпадение.
Смотрите также:
Похоже, что ваша единственная возможность в 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
Это должно быть разумно, если ваши вложенные группы не слишком сложны.
Пересечение доменов AD (с использованием двух серверов LDAP)
Вы можете настроить 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-группы.
У меня работает следующий конфиг:
<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, аутентификация для подгрупп стала работать... по крайней мере, для меня и моей ситуации.