Як автентифікувати користувачів у вкладених групах у 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, щедрість - це ваш :)
Селіванов Павло

з огляду на нову інформацію про групи, які знаходяться на різних серверах, я не думаю, що цей метод все ще буде працювати.
Jeff Strunk

3
AuthLDAPSubGroupDepth не існує в Apache HTTPd 2.4. AuthLDAPMaxSubGroupDepth - правильна інструкція для використання.
Кріс Харріс

33

Крім того AuthLDAPSubGroupDepth, що доступно лише в апаш-версії 2.4, при використанні Microsoft AD LDAP можна зробити авторизацію за допомогою вкладених груп за допомогою правила відповідності LDAP_MATCHING_RULE_IN_CHAIN. Це набагато швидше, ніж пошук підгруп на клієнті, оскільки це робиться на сервері постійного струму з меншою кількістю запитів по мережі.

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 призначений корпорацією Майкрософт для використання при його реалізації 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 ​​в апачі.
Мірча Вутковичі

Чи є спосіб використовувати LDAP_MATCHING_RULE_IN_CHAINдля отримання рекурсивного членства в групі і передавати його як заголовок на сервер бекенда (використовуючи Apache як зворотний проксі) ??
Гершон Папі

mod_authnz_ldapне надає цього. Однак ви можете використовувати LDAP_MATCHING_RULE_IN_CHAINфільтр LDAP у вашій програмі. Див: stackoverflow.com/a/34075052/290087
Мірча Vutcovici

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 ... </AuthnProviderAA ... -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, аутентифікація проти підгруп почала працювати ... принаймні для мене та моєї ситуації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.