Вопрос или проблема
Я немного новичок в использовании LDAP, особенно в не-AD LDAP. Мы используем RedHat Directory Server и пытался выполнить LDAP-запрос (конкретно фильтр), который бы извлекал всех пользователей (и их атрибуты) из cn
, который использует атрибут nisNetgroupTriple
с определенными именами пользователей. Это то, как мы управляем “суперпользователями”, а потом все остальные попадают в конкретный cn
, исходя из их потребностей. Итак, мой вопрос: как вы ищете и фильтруете, используя ldapsearch
, чтобы получить пользователей И атрибуты (uid
, sn
, givenName
, mail
) из cn
? Вот пример вывода из ldapsearch
, который я сделал в качестве теста:
# ldapsearch -xLLL -h server-p 389 -D "cn=Directory Manager" -b "cn=linux,dc=example,dc=org" \* + -W
Введите LDAP-пароль:
dn: cn=linux,dc=example,dc=org
nisNetgroupTriple: (,user1,)
nisNetgroupTriple: (,user2,)
nisNetgroupTriple: (,user3,)
cn: linux
objectClass: top
objectClass: nisNetgroup
memberNisNetgroup: linux
description: Linux
Что мне нужно сделать, так это получить атрибуты для каждого пользователя: user1
, user2
, user3
, такие как:
# ldapsearch -xLLL -h server -p 389 -D "cn=Directory Manager" -b "dc=example,dc=org" -x '(&(objectClass=posixAccount)(uid=user1))' -W
Введите LDAP-пароль:
dn: uid=user1,ou=People,dc=example,dc=org
userPassword:: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
givenName: User
sn: One
loginShell: /bin/false
gidNumber: 1000
uidNumber: 10054
mail: user1@localhost
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetorgperson
objectClass: posixAccount
uid: user1
cn: User One
homeDirectory: /home/user1
Не могу найти ничего, что бы имело смысл в интернете по поводу того, как это сделать (если это возможно). Кроме того, у меня может не быть полного понимания этой части LDAP, что может быть причиной того, что 1) я не могу найти ничего и 2) я не знаю, как разобраться с этим самостоятельно.
Буду признателен за любую помощь.
Следующая команда поможет в поиске имени пользователя в зависимости от конфигурации.
ldapsearch -h localhost -D "cn=Directory Manager" -b "dc=example,dc=org" -W -x "(&(objectClass=nisnetgroup)(nisNetgroupTriple=\(,user1,\)))" cn | grep dn
Она отобразит только cn
. Вы можете сделать быстрый grep, и вывод будет коротким и точным. Будет полезнее добавить/изменить эту группу.
Пожалуйста, попробуйте этот LDAP-запрос и дайте знать, если у вас возникнут какие-либо проблемы.
Ответ или решение
Чтобы извлечь все атрибуты пользователей, указанных в атрибутах nisNetgroupTriple
группы, вы можете воспользоваться командой ldapsearch
. В общем случае вам нужно выполнить следующие шаги:
Пример запроса LDAP для извлечения членов группы
-
Сначала получите DN группы. Для этого выполните следующий запрос, чтобы найти CN (например,
linux
), в который включены ваши пользователи:ldapsearch -xLLL -h server -p 389 -D "cn=Directory Manager" -b "cn=linux,dc=example,dc=org" "(&(objectClass=nisNetgroup)(cn=linux))" nisNetgroupTriple
Этот запрос вернет
nisNetgroupTriple
, в котором будут указаны пользователи. -
Извлеките пользователей из
nisNetgroupTriple
. В результате выполнения предыдущего запроса вы получите что-то вроде:nisNetgroupTriple: (,user1,) nisNetgroupTriple: (,user2,) nisNetgroupTriple: (,user3,)
-
Соберите DN для каждого пользователя. Для каждого пользователя вам нужно будет выполнить отдельный поиск, чтобы получить полные атрибуты. Формат DN для пользователей обычно следующий:
uid=username,ou=People,dc=example,dc=org
. Например:ldapsearch -xLLL -h server -p 389 -D "cn=Directory Manager" -b "dc=example,dc=org" "(&(objectClass=posixAccount)(uid=user1))"
Вы можете адаптировать этот запрос для всех пользователей, полученных из предыдущего поиска:
for user in user1 user2 user3; do ldapsearch -xLLL -h server -p 389 -D "cn=Directory Manager" -b "dc=example,dc=org" "(&(objectClass=posixAccount)(uid=${user}))" done
Полный пример
Объединяя все вышесказанное, у вас может получиться скрипт на bash, который будет автоматически извлекать данные для всех пользователей:
# Получить nisNetgroupTriple
results=$(ldapsearch -xLLL -h server -p 389 -D "cn=Directory Manager" -b "cn=linux,dc=example,dc=org" "(&(objectClass=nisNetgroup)(cn=linux))" nisNetgroupTriple)
# Извлечь имена пользователей
users=()
while IFS= read -r line; do
if [[ $line =~ nisNetgroupTriple:\ \(,(.+),\) ]]; then
users+=("${BASH_REMATCH[1]}")
fi
done <<< "$results"
# Извлечь атрибуты для каждого пользователя
for user in "${users[@]}"; do
ldapsearch -xLLL -h server -p 389 -D "cn=Directory Manager" -b "dc=example,dc=org" "(&(objectClass=posixAccount)(uid=${user}))"
done
Заключение
Этот метод позволяет вам динамически получать членов группы nisNetgroupTriple
и извлекать их атрибуты. Убедитесь, что у вас есть необходимые разрешения для выполнения этих запросов на вашем сервере LDAP.
Если у вас возникнут дополнительные вопросы о работе с LDAP в RedHat Directory Server, пожалуйста, не стесняйтесь спрашивать.