Ejabberd + Active Directory

ВАРНИНГ!!!: ЭТО МЕНЯЮЩИЙСЯ НЕЗАКОНЧЕННЫЙ ЧЕРНОВИК!

  По просьбам сетевой общественность решил описать свой скромный опыт по настройке и доведению ejabberd для комфортного сожительства оного с M$ Active Directory. По идее надо бы ещё и на английский перевести, ибо проблема общая для всей планетки, но это уже дело будущего :)


Задача и решение

  Необходимо было построить на базе ejabberd корпоративный jabber-сервер. База пользователей хранится в M$ Active Directory, оттуда же производится авторизация. Так же необходимо что бы все пользователи видели всех пользователей домена в своём ростере. В качестве дополнительного ограничения на пользовательские ростеры выдвигается требование разбиения контактов на группы по отделам.

  Для достижения этой светлой цели пришлось написать патчик, за основу которого огромное спасибо Алексею Горбаченко (agent_007). Ниже описвается процесс установки пропатченной версии ejabberd 1.0.0. Предполагается что вы в состоянии почитать документацию по установке на сайте проекта, посему это не освещается.


Что где взять
Патч для v1.0.0: http://realloc.spb.ru/files/ejabberd/ejabber_ad_001.patch.gz
Патч для v1.1.1: http://realloc.spb.ru/files/ejabberd/ejabber_ad_002.patch.gz
ejabberd: http://ejabberd.jabber.ru

Как настроить AD

  Для начала надо сделать некоторые вещи в AD. Необходимо создать группу, члены которой будут иметь доступ к jabber серверу и показываться в ростере. В нашем примере используется домен chloe.ku3 и группа Jabber Users. После внесения всех нужных пользователей в эту группу надо прописать им в поле департамента группу в общем ростере, которой они будут принадлежать. Например пользователь vasya@chloe.ku3 должен быть включен в группу Jabber Users и в поле департамента у него будет прописано Support. Это заставит его контакт появиться в группе Support в ростере. Путано, но надеюсь общий смысл ясен.



Настройка ejabberd

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


{auth_method, ad}.

В качестве метода аутентификации указываем AD. Из-за своеобразного видения стандартов одной маленькой и мягкой фирмой обычная ldap-авторизация с AD не работает.
{ad_servers, ["172.16.125.2"]}.
{ad_uidattr, "sAMAccountName"}.
{ad_group, "CN=Jabber Users,CN=Builtin,DC=chloe,DC=ku3"}.
{ad_base, "dc=chloe,dc=ku3"}.
{ad_rootdn, "CN=ejabberd,CN=Users,DC=chloe,DC=ku3"}.
{ad_password, "MegaPasswordSecret" }.

Тут всё просто.
ad_servers - IP или имя нашего домен-контроллера.
ad_uidattr - Атрибут, в котором хранится логин пользователя
ad_group - Группа, в которую входят правильные пользователи
ad_base - Собственно по какому домену ищем
ad_rootdn - Кем биндиться будем
ad_password - Пароль того, кем биндиться будем. Анонимное с AD не работает.

{modules,
 [
  {mod_roster,     []},
  {mod_shared_roster_ad,     []},
  {mod_privacy,    []},
  {mod_configure,  []},
  {mod_configure2, []},
  {mod_disco,      []},
  {mod_stats,      []},
  {mod_vcard_ad,      []},
  {mod_offline,    []},
  {mod_announce,   [{access, announce}]},
  {mod_echo,       [{host, "echo.localhost"}]},
  {mod_private,    []},
  {mod_irc,        []},
  {mod_muc,        [{access, muc},
                    {access_create, muc},
                    {access_admin, muc_admin}]},
  {mod_pubsub,     []},
  {mod_time,       []},
  {mod_last,       []},
  {mod_version,    []}
 ]}.

В списке модулей надо вместо mod_vcard использовать mod_vcard_ad, и вместо mod_shared_roster надо mod_shared_roster_ad соответственно. Это позволит использовать AD ещё и для поиска и для вытягивания юзеринфо. Так же надо отключить in-band регистрацию пользователей. Во-первых она всё-равно не будет работать, а во-вторых она на корпоративном сервере ни к чему. Cделать это можно убрав mod_register из списка модулей.

Настройка клиента

  Для авторизации нам необходимо иметь пароль в открытом виде. Поэтому надо в клиенте разрешить передачу пароля незашифрованным. Если использовать SSL, то ничего страшного в этой опции нету.


Итоги

  Ну вот вроде и всё. Теперь пользователи могут логиниться с привычными им именами и паролями, принадлежность группам контролируется централизовано, поиск по пользователям есть :). Надо заметить что предложенный патч не является законченным решением, а находится в процессе вялой разработки под собственные нужды. Ещё я не профессиональный программист на Erlang, поэтому код далёк от совершенства. Я по мере возможностей собираюсь допинать до более-менее приличного вида и патч и эту хаутушку, но пока некогда.