Как аутентифицировать пользователей во вложенных группах в Apache LDAP?

21

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

отметка
источник

Ответы:

19

Вы должны установить, AuthLDAPSubGroupDepthчтобы сделать эту работу. Целое число, которое вы здесь указываете, указывает максимальную глубину вложенности подгруппы, которая будет оценена до прекращения поиска пользователя.

Добавьте это к вашей конфигурации:

AuthLDAPSubGroupDepth 1

Больше информации: здесь и здесь .

Барт Де Вос
источник
Я использую Apache 2.2, его mod_authnz_ldap не имеет директивы AuthLDAPSubGroupDepth
Селиванов Павел
Так почему бы не обновить?
Барт Де Вос
2
Я использую Debian Squeeze и предпочитаю использовать пакеты из стабильного дистрибутива: проверенные, регулярные обновления безопасности. Apache 2.3 все еще бета, он появится в стабильных или стабильных бэкпортах не скоро. Я решил эту проблему, используя AuthnProviderAliasсейчас. Если никто не предложит решение для Apache 2.2, щедрость ваша :)
Селиванов Павел
учитывая новую информацию о группах, находящихся на разных серверах, я не думаю, что этот метод все еще будет работать.
Джефф Странк
3
AuthLDAPSubGroupDepth не существует в Apache HTTPd 2.4. AuthLDAPMaxSubGroupDepth - это правильная директива для использования.
Крис Харрис
33

Кроме того 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. Это специальный «расширенный» оператор сопоставления, который проходит цепочку предков в объектах вплоть до корня, пока не найдет совпадение.

Смотрите также:

Мирча Вуцовичи
источник
Я бы проголосовал за это 10 раз, если бы мог. Для тех, кто работает с RHEL 5, это отличное решение. Компиляция исходного кода поставщика для получения новейших функций не всегда является желательным решением!
Аарон Копли
Я рад, что это помогло. Я думаю, что это было первое документированное использование LDAP_MATCHING_RULE_IN_CHAIN ​​в apache.
Мирча Вутцовичи
Есть ли способ использовать LDAP_MATCHING_RULE_IN_CHAINдля получения рекурсивного членства в группе и передать его в качестве заголовка на внутренний сервер (используя Apache в качестве обратного прокси-сервера) ??
Гершон Папи
mod_authnz_ldapне обеспечивает это. Однако вы можете использовать LDAP_MATCHING_RULE_IN_CHAINфильтр LDAP в вашем приложении. См .: stackoverflow.com/a/34075052/290087
Мирча Вутцовичи
6

Похоже, что ваша единственная возможность в 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

Это потребует некоторого массажа, чтобы заставить его работать, но я думаю, что это общая идея.

Джефф Странк
источник
1
К сожалению, это не работает, когда группы находятся в разных доменах AD (Domain1_DomainLocal_Group включает Domain2_Global_Group). Это было первое, что я попробовал :)
Селиванов Павел
Значит ли это, что одна из групп находится на другом сервере? Если это правда, я подозреваю, что AuthLDAPSubGroupDepth не будет работать для вас.
Джефф Странк
Да, два сервера, два домена. Я рассмотрел вопрос об интеграции Linux box в AD и использовании аутентификации PAM, но mod-auth-pam не поддерживается, поскольку apache 2.0, mod-authnz-external + pwauth не поддерживает группы. Это все печально :(
Селиванов Павел
1
О, я не заметил, что вы обновили ответ. Использование OpenLDAP slapd_meta может быть решением, но оно убивает главный смысл этой конфигурации: управление правами пользователей в одной точке (Active Directory) путем добавления / удаления пользователей из групп и включения групп друг в друга. Вот мое аналоговое решение с AuthnProviderAlias ​​без дополнительного сервиса OpenLDAP: <AuthnProviderAlias ​​ldap first-ldap> AuthLDAPURL ... </ AuthnProviderAlias> <AuthnProviderAlias ​​ldap second-ldap> AuthLDAPURL ... </ AuthnProviderAliasd-second-lasaph> -ldap
Селиванов Павел
1
Я решил дать щедрость Барту Де Восу: это не мой вопрос; на оригинальный вопрос (без моей конкретной) его решение простое и будет работать
Селиванов Павел
4

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

Крис Харрис
источник