Назад | Перейти на главную страницу

Как аутентифицировать пользователей во вложенных группах в 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 для этого? Или существует проблема с возможной бесконечной рекурсией и, следовательно, недопустимой?

Кроме 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

Это должно быть разумно, если ваши вложенные группы не слишком сложные.


Пересечение доменов 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-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, авторизация против подгрупп начала работать ... по крайней мере, для меня и моей ситуации.