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

ldap запрашивает сервер Active Directory для пользователей, принадлежащих к группе с именем X

Когда я делаю это в командной строке bash на CentOS 6.4

ldapsearch -LLL -H ldap://adserver.example.com -x -D someuser@example.com -w somepass -b 'OU=Users,DC=example,DC=com' '(&(objectClass=person)(sAMAccountName=testuser))'

я получил

dn: CN=TestUser Surname,OU=Area,OU=Users,DC=example,DC=com
...
objectClass: person
...
cn: TestUser Surname
sn: Surname
...
distinguishedName: CN=TestUser Surname,OU=Area,OU=Users,DC=example,DC=com
...
memberOf: CN=Group1,OU=Area,OU=Users,DC=example,DC=com
memberOf: CN=Gropu2,OU=Users,DC=example,DC=com
...
sAMAccountName: testuser

Я хочу получить ответ только в том случае, если тестовый пользователь принадлежит к группе с именем X, независимо от того, где находится группа X в иерархии AD. Например: мне нужны данные пользователя с именем testuser, который является членом группы с именем Group1.

Я попытался изменить фильтры на:

  1. (& (objectClass = person) (sAMAccountName = testuser) (memberOf = CN = Group1 *))
  2. (& (objectClass = человек) (sAMAccountName = testuser) (memberOf = * Группа1 *))

но безрезультатно.

Как видно из вывода выше, testuser принадлежит к группам

  1. CN = Group1, OU = Area, OU = Users, DC = example, DC = com
  2. CN = Gropu2, OU = Users, DC = example, DC = com.

Когда я использую фильтр '(& (objectClass = person) (sAMAccountName = testuser) (memberOf = CN = Group1, OU = Area, OU = Users, DC = example, DC = com))' он работает, но мне нужен запрос только с именем группы (без использования полного «пути»).

Есть ли способ это сделать?

Я пытаюсь сделать это, потому что мне нужно использовать группы, определенные в Active Directory, как списки управления доступом squid (прокси-сервер Linux). Для этого мне нужно определить внешний тип ACL, например

external_acl_type ADGroup %LOGIN /usr/lib64/squid/squid_ldap_group -R -b "OU=Users,DC=example,DC=com" -D someuser@example.com -w somepass -f "(&(objectclass=person)(sAMAccountName=%u)(memberof=CN=%g,OU=Users,DC=example,DC=com))" -h adserver.example.com

а затем используйте тип для определения списков управления доступом, таких как этот

acl ADGroup_Group1 external ADGroup Group1
acl ADGroup_Group2 external ADGroup Group2
...
http_access allow ADGroup_Group1;
http_access deny ADGroup_Group2;

Когда squid проверяет это «разрешить», он заменяет% u именем входа пользователя и% g именем группы, определенным в ACL (Group1, Group2), а затем выполняет запрос LDAP выше.

Как видно из вышесказанного, «http_access allow ADGroup_Group1;» будет работать по назначению, но «http_access deny ADGroup_Group2;» не будет работать, потому что родительские подразделения Group1 и Group2 отличаются.

Итак, у меня есть 3 альтернативы:

  1. Найдите фильтр, который работает для любого имени группы, независимо от пути (этот вопрос)
  2. Двигайтесь (потенциально) ВСЕ Группы AD в одно и то же OU (тьфу ... перемещение объекта в другое OU принесет мне больше работы, так как тогда мне придется перенастроить GPO или, по крайней мере, проверить уже определенные GPO на предмет любых изменений, которые может принести этот ход короля)
  3. Определите (потенциально) external_acl_type для каждого OU с группами. (В этом случае у меня будет N внешних процессов, чтобы проверить изменение пути в фильтре LDAP)

К сожалению нет. Общее имя объекта LDAP не является уникальным в глобальном масштабе; он уникален только относительно своего родительского OU. Итак, если вы могли бы спросить, был ли пользователь членом группы, на основе CN группы, вы потенциально могли бы получить несколько результатов.

По этой причине атрибут memberOf объекта пользователя представляет собой список DN (отличительных имен или полных путей X.500).