LINUX.ORG.RU
ФорумAdmin

Помогите в LDAP найти пользователей в гурппе

 ,


0

1

У меня есть LDAP сервер, а именно slapd. К нему подключена JIRA, она там насоздавала пользователей и группы.

Вот такие группы

dn: cn=jira-users,dc=my-domain,dc=ru
objectClass: groupOfUniqueNames
uniqueMember:
uniqueMember: cn=user1,dc=my-domain,dc=ru
uniqueMember: cn=user2,dc=my-domain,dc=ru
uniqueMember: cn=user3,dc=my-domain,dc=ru
cn: jira-users

и вот таких пользователей:

dn: cn=user1,dc=my-domain,dc=ru
mail: n.shaplov@my-domain.ru
userPassword:: exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx89
givenName: Nikolay
objectClass: inetOrgPerson
cn: user1
sn: Shaplov
displayName: Nikolay Shaplov

Соответсвенно пытаюсь искать пользователей в гуппе:

(&(objectcategory=inetOrgPerson)(memberof=cn=jira-users,dc=my-domain,dc=ru))

Но ничего не получается...

В большинстве примеров которые есть в сети, в строке поиска еще присутвует ou=:

(&(objectcategory=inetOrgPerson)(memberof=cn=jira-users,ou=Groups,dc=my-domain,dc=ru))

Но jira никаких ou объектов не создала, и естественно ничего не находится...

Вопрос: возможно ли с имеющейся схемой таки написать фильтр ищущий пользователя в группе? Как этот запрос должен выглядеть? Или надо как-то доконфигурировать JIRA чтобы там еще и Organization Unit создавалиь? Или вообще как? Не очень с этими ou понимаю тему...

Update: Благодоря коменту Ivan_qrt выяснил, что для того чтобы все это работало, надо подгрузить определенный оверлей, и правильно его настроить... Что-то вроде этого https://tech.cbjck.de/2012/05/08/enabling-the-memberof-overlay-for-openldap/

Соберусь с духом, попробую...

★★★

Последнее исправление: shaplov (всего исправлений: 2)

ou - это просто контейнер в иерархии. Он может быть, может быть контейнер в контейнере, а может быть просто запись (например группа) в dc (dc=my-domain,dc=ru). Это не важно.

Ivan_qrt ★★★★★
()
Ответ на: комментарий от Ivan_qrt

Чтобы искать по атрибуту memberof должен быть настроен соответствующий overlay.

Добавил в ldap.conf

include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema

Однако обещанная по ссылке команда

ldapsearch -v -H ldap://192.168.xx.yy/ -D cn=admin,dc=my-domain,dc=ru -W -x -b dc=my-domain,dc=ru  memberOf

Все равно выдает записи без групп

# user2, my-domain.ru
dn: cn=user2,dc=my-domain,dc=ru

# user1, my-domain.ru
dn: cn=user1,dc=my-domain,dc=ru

как выдавала до того как я эти инклюды в конфиг добавил.

А дока обещает, что должна быть еще строчка с атрибутом memberOf

dn: uid=test1,ou=People,dc=example,dc=com
 memberOf: cn=testgroup,ou=Group,dc=example,dc=com
shaplov ★★★
() автор топика
Ответ на: комментарий от shaplov

А дока обещает, что должна быть еще строчка с атрибутом memberOf

А дока не говорит, что тебе надо заполнять атрибут memberof так же, как ты заполняешь uniqueMemeber ?

no-dashi ★★★★★
()

Товарищ дорогой, внимательно посмотри какие атрибуты у тебя заполнены и какие ты ищешь.

zgen ★★★★★
()
Ответ на: комментарий от Ivan_qrt

Чтобы искать по атрибуту memberof должен быть настроен соответствующий overlay.

Понял свою ошибку. См. Update.

shaplov ★★★
() автор топика

Ищешь чем: программа, API?

Опишу для C API, как наиболее универсальный:

/* вот тут наши группы */
char base[] = "dc=my-domain,dc=ru"; 
/* ишем только группы в которых есть юзеры */
char filter[] = "(& (objectClass=groupOfUniqueNames) (uniqueMember=*))";
/* нам нужен только uniqueMember */
char uniqMembr[] = "uniqueMember";
char *attrs[] = { uniqMembr, NULL };
/* результат */
LDAPMessage *res;

int err = ldap_search_s(ld, /* = ldap_init(...) */
                      base, 
                      LDAP_SCOPE_ONELEVEL, /* полагаю вложенных групп нет? */
                      filter, attrs, 0, &res);
if (err && err != LDAP_SIZELIMIT_EXCEEDED) {
    fprintf(stderr, "ldap error: %s", ldap_err2string(err));
    exit(EXIT_FAILURE);
}

LDAPMessage *msg = ldap_first_entry(ld, res);
while (msg) {
    char **values = ldap_get_values(ld, msg, uniqMembr);
    for (char **i = values; *i; i++) {
        printf("member: %s\n", *i);
    }
    ldap_value_free(values);

    msg = ldap_next_entry(ld, msg);
}

ldap_msgfee(res);

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 4)
Ответ на: комментарий от KennyMinigun

А, если тебе еще нужно название группы, то между while .. ldap_get_values нужно еще:

char *dn = ldap_get_dn(ld, msg);
print("group: %s\n", dn);
ldap_memfree(dn);

А по поводу консольной ldapsearch, то это будет выглядеть так:

ldapsearch ... -b "dc=my-domain,dc=ru" -s one "(&(objectClass=groupOfUniqueNames)(uniqueMember=*))" dn uniqueMember

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 3)
Ответ на: комментарий от KennyMinigun

Ищешь чем: программа, API?

В итоге искать собираюсь внутри pam_ldap. Для тестов использую ldapsearch из командной строки.

(& (objectClass=groupOfUniqueNames) (uniqueMember=*))

Ну это найдет имена людей входящих в группу. А мне по факту для pam_ldap автогризации надо получить записи людей входящих в группу...

shaplov ★★★
() автор топика
Ответ на: комментарий от pztrn

А почему objectCategory? objectClass жи надо, не?

Твоя правда... Что-то я не оттуда скопировал... но и objectClass — не работает....

Как я понимаю правильный отвер живет в Update абзаце... Я просто никак не попробую...

shaplov ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.