Вопрос или проблема
Я использую ldapsearch на Debian 9 Linux, чтобы делать запросы к MS Active Directory. Я хотел бы найти всех пользователей в моей группе “mygroupname”.
Команда
ldapsearch -o ldif-wrap=no -xWLLL -D "myaccount" -h mydomain -b "ou=user,dc=mydc,dc=com" "cn=mygroupname" member
выдает следующий результат:
dn: CN=mygroupname,OU=user,DC=mydc,DC=com
member: CN=Paula Normal,OU=whatever,OU=...,OU=...,OU=...,DC=mydc,DC=com
member:: Q049QmV0dGluYSBUw7Zs...................9nbmUsT1U9RGV1dHNjwdGEsREM9Y29t
member: CN=Peter Testman,OU=whatever2,OU=...,OU=...,OU=...,DC=mydc,DC=com
...
Я сравнил этот вывод с AD-GUI. Второй элемент должен быть валидным пользователем, но вывод неожиданный и нечитаемый. Информация о CN,OU,DC отсутствует. Я выяснил, что странные элементы валидны, но закодированы в base64.
В чем ошибка? Может ли быть повреждение в AD? Неправильная ли моя команда запроса? Почему некоторые элементы закодированы в base64? Как получить правильный вывод?
Ваша команда
ldapsearch -o ldif-wrap=no -xWLLL -D "myaccount" -h mydomain -b "ou=user,dc=mydc,dc=com" "cn=mygroupname" member
явно ограничивает атрибуты, запрашиваемые в ходе поиска, до member.
Просто попробуйте добавить нужные имена атрибутов в качестве дополнительных аргументов команды:
ldapsearch -o ldif-wrap=no -xWLLL -D "myaccount" -h mydomain -b "ou=user,dc=mydc,dc=com" "cn=mygroupname" cn ou o member
См. также: ldapsearch(1)
Кроме того, вам следует ознакомиться с синтаксисом LDIF (см. RFC 2849), который должен быть ASCII-чистым. Двойные двоеточия после имени типа атрибута означают, что значение было закодировано в base64, например, из-за наличия не-ASCII символа в имени. Используйте подходящий модуль LDIF для декодирования вывода ldapsearch или лучше используйте LDAP-модуль для вашего любимого языка программирования.
Причиной неожиданного вывода является не-ASCII символ в cn-name.
Строка, начинающаяся с “member:: “, указывает на закодированное в base64 значение, которое можно декодировать (например, echo "$value" | base64 -d -
)
Результаты поиска ldapsearch отображаются с использованием расширенной версии LDIF.
Синтаксис LDIF (см. RFC 2849) должен быть ASCII-чистым.
Быстрое решение для получения читаемого вывода может заключаться в использовании оболочки, такой как
myldapsearch() { ldapsearch $* | perl -MMIME::Base64 -n -00 -e 's/\n +//g;s/(?<=:: )(\S+)/decode_base64($1)/eg;print'; }
См. в данном вопросе.
Ответ или решение
Для выполнения успешного поиска пользователей в группе Active Directory с помощью утилиты ldapsearch
на Debian 9, важным шагом является понимание и корректировка параметров командной строки, а также разбирание выводимых данных.
Проблема
Используемая команда:
ldapsearch -o ldif-wrap=no -xWLLL -D "myaccount" -h mydomain -b "ou=user,dc=mydc,dc=com" "cn=mygroupname" member
выводит данные о членах группы, среди которых присутствуют base64-закодированные значения, такие как:
member:: Q049QmV0dGluYSBUw7Zs...
Причины и решение проблемы
-
Base64-кодирование значений:
Немного неожиданный вывод с двойными двоеточиями::
обусловлен тем, что содержимое значения(я) содержит не-ASCII символы, из-за чего оно закодировано в base64. Это стандартная практика для формата LDIF, который требует ASCII-совместимости. -
Отсутствие информации в CN, OU, DC:
Base64-кодировка не влияет на полноту, но делает информацию нечитаемой для пользователя. Возможной причиной этого может быть наличие спецсимволов, например, в имени пользователя, что требует кодирования. -
Решение:
- Чтобы декодировать эти значения, используйте встроенные команды, например,
echo "кодировка" | base64 -d
, чтобы гарантировать понимание и коррекцию данных вручную.
- Чтобы декодировать эти значения, используйте встроенные команды, например,
-
Оптимизация команды
ldapsearch
:
Для более полной информации о каждом пользователе, предложено добавление нескольких атрибутов в команду поиска:ldapsearch -o ldif-wrap=no -xWLLL -D "myaccount" -h mydomain -b "ou=user,dc=mydc,dc=com" "cn=mygroupname" cn ou o member
Это обеспечит вывод дополнительных атрибутов, таких как CN, OU и O, которые могут быть полезны.
-
Автоматизация процесса:
Написание пользовательской функции может упростить задачу по расшифровке base64-закодированных значений:myldapsearch() { ldapsearch "$@" | perl -MMIME::Base64 -n -00 -e 's/\n +//g;s/(?<=:: )(\S+)/decode_base64($1)/eg;print'; }
Заключение
Хотя base64-кодирование и может показаться проблемой, оно является следствием спецификаций LDIF для защиты данных. Используя грамотную настройку ldapsearch
, и применив описанные подходы декодирования, можно получить полноценный вывод данных о пользователях в группе Active Directory. Избегайте стандартных решений, адаптируя команды под свои нужды, что приведет к изменению вашего опыта работы с LDAP.