klink0v (klink0v) wrote,
klink0v
klink0v

Jabber (XMPP) + Windows + SSO, часть 2

Продолжение предыдущего поста. Под катом чисто технический текст про формирование списка контактов и групп (ростера) для Jabber-сервера Prosody на основании информации, содержащейся в Active Directory LDAP.

За так называемый "shared roster" в Prosody отвечает специальный модуль "mod_groups", который по умолчанию выключен. Он имеет единственную настройку: путь к текстовому файлу, где содержится список пользователей (JID-ов и их имён), разбитый на секции. Кроме того, после перезаписи этого файла нам понадобится каким-то образом объяснить этому модулю, что неплохо бы перечитать конфиги. К сожалению, это можно сделать только посредством management-интерфейса, слушающего TCP-сокет. И этот интерфейс также представлен отдельным модулем "mod_admin_telnet" и по умолчанию выключен.

Мой заказчик сформировал следующее техническое задание. Все пользователи Jabber-а будут созданы в отдельном OU (Organization Unit) под названием "CLIENTS". Группироваться пользователи будут путём добавления в соответствующие Security Groups. Такие группы носят имена, начинающиеся с символов "IM_" (например, "IM_IT_Dept") и также находятся в отельном OU под названием "SECURITY_GROUPS". JID пользователя будем брать из атрибута "userPrincipalName", его имя — из атрибута "displayName". Название группы будем брать из атрибута "name".

Итак, поехали. Прежде всего создадим в AD какого-нибудь пользователя (всё равно какого) с минимальными привилегиями, лишь бы имел доступ на чтение к LDAP-каталогу. Для примера назовём его "ldap_agent" и поместим его в OU с именем "AGENTS". От его имени мы будем обращаться к контроллеру домену за необходимой информацией.

А дальше придётся накатать скрипт на любимом скриптовом языке. В интернете есть примеры на PHP. Но по мне так, для решения данной задачи и Bash-а будет вполне достаточно. У меня получилось что-то вроде того.

Немного комментариев. В константах "HOST", "DOMAIN" указываем где искать контроллер домена и LDAP-корень этого домена. "AGENT", "PASS" — Distinguished Name и пароль предварительно созданного нами в AD пользователя-агента для чтения каталога (см. выше). "CONFTMP", "OLDCONF" — путь к временному файлу листинга пользователей (придумываем произвольно) и "боевому" аналогичному файлу. Последний должен совпадать с директивой "groups_file" в конфиге "prosody.cfg.lua".

Вся магия совершается утилитой "ldapsearch" из пакета "ldap-utils". Сперва находим список групп с подходящими нам именами, потом в цикле для каждой группы ищем принадлежащих ей пользователей и заполняем таким образом строчка за строчкой временный файл с листингом. Потом проверяем что у нас получилось и получилось ли. Если всё хорошо, то сравниваем побайтно старый и новый файл. Если они ничем не отличаются, то ничего и не делаем. Если же отличаются, то прицепляемся к TCP-сокету на localhost:5582 и произносим туда заклинания module:reload("groups"), module:reload("roster"), quit. Это заставит сервер перечитать сгенерированный нами список пользователей.

Этот скрипт подвешиваем на выполнение по cron-у, например, раз в час. А для особо нетерпеливых можно рядышком поднять какой-нибудь Apache и наколдовать простейший CGI-скрипт для принудительного отвешивания пинка со стимуляцией через веб-морду.

Не забываем, что данный скрипт будет выполнятся от имени "www-data", а посему для успешного повышения привилегий придётся настроить также sudoers типа того:

Ага, вот такой я извращенец.

Tags: bash, kerberos, linux, sso, windows, xmpp, администрирование
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments