По просьбам сетевой общественность решил описать свой скромный опыт по настройке и доведению ejabberd для комфортного сожительства оного с M$ Active Directory. По идее надо бы ещё и на английский перевести, ибо проблема общая для всей планетки, но это уже дело будущего :)
Необходимо было построить на базе ejabberd корпоративный jabber-сервер. База пользователей хранится в M$ Active Directory, оттуда же производится авторизация. Так же необходимо что бы все пользователи видели всех пользователей домена в своём ростере. В качестве дополнительного ограничения на пользовательские ростеры выдвигается требование разбиения контактов на группы по отделам.
Для достижения этой светлой цели пришлось написать патчик, за основу которого огромное спасибо Алексею Горбаченко (agent_007). Ниже описвается процесс установки пропатченной версии ejabberd 1.0.0. Предполагается что вы в состоянии почитать документацию по установке на сайте проекта, посему это не освещается.
Для начала надо сделать некоторые вещи в AD. Необходимо создать группу, члены которой будут иметь доступ к jabber серверу и показываться в ростере. В нашем примере используется домен chloe.ku3 и группа Jabber Users. После внесения всех нужных пользователей в эту группу надо прописать им в поле департамента группу в общем ростере, которой они будут принадлежать. Например пользователь vasya@chloe.ku3 должен быть включен в группу Jabber Users и в поле департамента у него будет прописано Support. Это заставит его контакт появиться в группе Support в ростере. Путано, но надеюсь общий смысл ясен.
Тут просто опишу какие изменения необходимы в конфигурационном файле.
{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" }.
Тут всё просто.
{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, поэтому код далёк от совершенства. Я по мере возможностей собираюсь допинать до более-менее приличного вида и патч и эту хаутушку, но пока некогда.