Pull to refresh

ejabberd+AD+Shared Roster

Reading time10 min
Views4.7K
Доброго времени суток.

Для начала что мы имеем: небольшую сеть на ~150 машин, в основном с ОС Windows XP, домен, поднятый естественно на Windows 2k3 и нормальную машинку(или сервер) на которой установлен gentoo linux (опционально MySQL).

Задача: Установить jabber сервер, сделать общий ростер, с группами из AD, прикрепить к нему icq гейт и поставить jabber клиенты на рабочие машины.

Установка ejabberd

Прежде чем начать ставить ejabberd надо удостовериться, что у нас есть все то ему может потребоваться него, а именно:

  • GNU Make
  • GCC
  • libexpat 1.95 or higher
  • Erlang/OTP R10B-9 or higher
  • OpenSSL 0.9.6 or higher, for STARTTLS, SASL and SSL encryption. Optional, highly recommended.
  • Zlib 1.2.3 or higher, for Stream Compression support(XEP-0138). Optional.
  • GNU Iconv 1.8 or higher, for the IRC Transport(mod_irc). Optional. Not needed on systems with GNU Libc.


Сам ejabberd мы будем собирать из svn, так как в стабильной версии поставить shared roster у меня не получилось. Для этого делаем:

user$ svn checkout svn.process-one.net/ejabberd


Собираем его, только не забываем включить в параметр сборки --enable-odbc

user$ cd ejabberd/trunk/src/
user$ ./configure --enable-odbc
user$ make
user$ sudo make install


Если не каких ошибок не по выскакивало идем дальше, следующим шагом мы наверное соберем модуль для shared roster. Сами исходники модуля лежат пока здесь mod_shared_roster_ldap.erl

user$ wget -c www.ejabberd.im/files/contributions/mod_shared_roster_ldap.erl
user$ erlc -I ejabberd/trunk/src/ mod_shared_roster_ldap.erl


Если выпадут подобные сообщения, можно не беспокоиться

./mod_shared_roster_ldap.erl:19: Warning: behaviour gen_mod undefined
./mod_shared_roster_ldap.erl:289: Warning: variable 'User' is unused


Ну и копируем новый модуль в кучу к остальным

user$ sudo cp mod_shared_roster_ldap.beam /lib/ejabberd/ebin/


Настройка ejabberd

«Переходим» в рута (sudo -i || su) и лезем в /etc/ejabberd/, там нас интересует файл под названием ejabberd.cfg, открываем его своим любимым редактором и начинаем править. Привожу свой конфиг, с небольшими комментариями, которые будут экранированы %%:

override_global.
override_local.
override_acls.

{loglevel, 4}.

%% Вставляем логин админа, которому будут приходить все системные
сообщения, не забываем указывать логин в формате admin@domain %%
{watchdog_admins, ["admin@domain"]}.
%% Имя хоста, на котором поднят ejabberd, в моем случае я его обозвал
cartman. Для тех кто не знает как посмотреть имя своего хоста hostname %%
{hosts, ["cartman"]}.
{listen,
[
%% Порт на который будут подключаться клиенты %%
{5222, ejabberd_c2s, [
{access, c2s},
{shaper, c2s_shaper},
{max_stanza_size, 65536}
]},
%% Порт на который будут подключаться клиенты, но весь трфик будет шифроваться. SSL %%
{5223, ejabberd_c2s, [
{access, c2s},
{shaper, c2s_shaper},
%% Путь к нашему сертификату, который мы создадим позже %%
{certfile, "/etc/ejabberd/cert/ejabberd.pem"}, tls,
{max_stanza_size, 65536}
]},
%% Для обмена информацией с другими jabber серверами %%
{5269, ejabberd_s2s_in, [
{shaper, s2s_shaper},
{max_stanza_size, 131072}
]},
%% Порт к которому будут прикручены различные гейты, в моем случае это pyucq-t %%
{8888, ejabberd_service, [
{access, all},
{shaper_rule, fast},
{ip, {127, 0, 0, 1}},
%% Добовляем имя к хосту %%
{hosts, ["icq.cartman"],
%% Пароль, такой же какой и указан в конфиге pyicq-t %%
[{password, "123456"}]}
]},

%% Веб морда к ejabberd, хотя она мне что то не понравилась %%
{5280, ejabberd_http, [
http_poll,
web_admin
]}

]}.

%% Выбираем метод авторизации ldap %%
{auth_method, ldap}.
%% Имя домена, в моем случаем это domain.local %%
{ldap_servers, ["domain.local"]}.
{ldap_uids, [{"sAMAccountName"}]}.
{ldap_base, "dc=domain,dc=local"}.
%% Прописываем путь к пользователю с администраторскими правами, в моем случае это пользователь root, который "лежит" в "папке" Users, по средствам ldap синтаксиса(или как это называется?) %%
{ldap_rootdn, "cn=root,cn=Users,dc=domain,dc=local"}.
%% Его пароль %%
{ldap_password, "123456"}.
%% Шайпер для левого трафика, который идет с других jabber сервером(как я понял) %%
{shaper, normal, {maxrate, 10000}}.
{shaper, fast, {maxrate, 500000}}.
%% Добавляем админа, в моем случае это admin %%
{acl, admin, {user, "admin", "cartman"}}.
%% И еще одно, коллеге например %%
{acl, admin, {user, "admin2", "cartman"}}.
{acl, local, {user_regexp, ""}}.
{access, max_user_sessions, [{10, all}]}.
{access, local, [{allow, local}]}.
%% Так как джаббер сервер внутрисетевой, и пока находиться только в тестовом режиме, мы запрещаем общение с другими jabber серверами %%
{access, c2s, [{deny, blocked},
{allow, all}]}.
{access, c2s_shaper, [{none, admin},
{normal, all}]}.
{access, s2s_shaper, [{fast, all}]}.
{access, announce, [{allow, admin}]}.
{access, configure, [{allow, admin}]}.
{access, muc_admin, [{allow, admin}]}.
{access, muc, [{allow, all}]}.
{access, pubsub_createnode, [{allow, all}]}.
%% Запрещаем регистрацию, так как регистрация происходить по средствам AD %%
{access, register, [{deny, all}]}.

{language, "ru"}.

{modules,
[
{mod_adhoc, []},
{mod_announce, [{access, announce}]}, % recommends mod_adhoc
{mod_caps, []},
{mod_configure,[]}, % requires mod_adhoc
{mod_disco, []},
{mod_echo, [{host, "echo.localhost"}]},
{mod_last, []},
{mod_muc, [
{access, muc},
{access_create, muc},
{access_persistent, muc},
{access_admin, muc_admin}
]},
%% Точно не помню, если этот модуль в обычной сборки, но если что, его можно выключить. %%
{mod_muc_log, [
{access, muc},
{access_create, muc},
{access_admin, muc_admin},
{access_log, muc},
{outdir, "/var/log/muc_log"},
{top_link, {"http://cartman/", "JABBER SERVER"}}
]},
{mod_offline, []},
{mod_privacy, []},
{mod_private, []},
{mod_pubsub, [ % requires mod_caps
{access_createnode, pubsub_createnode},
{plugins, ["default", "pep"]}
]},
{mod_register, [
{welcome_message, {"Welcome",
"Hi! Welcome to this Jabber server."}},
%% В принципе, так как мы закрыли регистрацию, это не нужно, но все же, в этой опции указывается пользователь, которому будут приходить извещения о новых зарегистрированных пользователей. %%
{registration_watchers, ["admin@cartman"]},
{access, register}
]},
{mod_roster, []},
{mod_stats, []},
{mod_time, []},
%% Типо поиск по vcard в AD, но у меня он чего то не заработал %%
{mod_vcard_ldap,
[{host, "users.cartman"},
{ldap_vcard_map,
[{"NICKNAME", "%u", []},
{"GIVEN", "%s", ["givenName"]},
{"MIDDLE", "%s", ["initials"]},
{"FAMILY", "%s", ["sn"]},
{"FN", "%s", ["displayName"]},
{"EMAIL", "%s", ["mail"]},
{"ORGNAME", "%s", ["company"]},
{"ORGUNIT", "%s", ["department"]},
{"CTRY", "%s", ["c"]},
{"LOCALITY", "%s", ["l"]},
{"STREET", "%s", ["streetAddress"]},
{"REGION", "%s", ["st"]},
{"PCODE", "%s", ["postalCode"]},
{"TITLE", "%s", ["title"]},
{"URL", "%s", ["wWWHomePage"]},
{"DESC", "%s", ["description"]},
{"TEL", "%s", ["telephoneNumber"]}]},
{ldap_search_fields,
[{"User", "%u"},
{"Name", "givenName"},
{"Family Name", "sn"},
{"Email", "mail"},
{"Phone", "telephoneNumber"}
]},
{ldap_search_reported,
[{"Full Name", "FN"},
{"Nickname", "NICKNAME"},
{"Email", "EMAIL"}]}
]},
%% Сам shared_roster. В общем группы он будет создавать по department, в профилях пользователя в AD %%
{mod_shared_roster_ldap,
[{ldap_groupattr,"department"},
{ldap_groupdesc,"department"},
%% Так как джаббер работает только в тестовом режиме, да и не всем пользователям нужен джаббер, мы создали в AD группу JabberUsers, которая находить в "папке" Users. И тех кому джаббер нужен, просто добавили их в группу JabberUsers %%
{ldap_rfilter, "(&(memberOf=CN=JabberUsers,CN=Users,DC=klondike,DC=local) (|(userAccountControl=66050)(userAccountControl=66048)))"},
{ldap_memberattr,"sAMAccountName"},
{ldap_userdesc,"cn"}
]
},
{mod_version, []}
]}.


В прицепи все готово, только давайте еще добавим ssl сертификаты(бац пригодиться)

mkdir /etc/ejabberd/cert
cd /etc/ejabberd/cert
openssl req -new -x509 -newkey rsa:1024 -days 3650 -keyout privkey.pem -out server.pem
openssl rsa -in privkey.pem -out privkey.pem
cat privkey.pem >> ejabberd.pem
rm privkey.pem


Установка и настройка pyicq-t

Его из snv||svc||git мы собирать не будем, так как в gentoo он есть в поратах, и довольно рабочий (главное не забыть включить USE=«webinterface», хотя кому как нравиться) просто делаем:

user$ sudo emerge net-im/pyicq-t


Все просто далее правим его(ее) конгфиг который у меня расположился в **/etc/jabber/pyicq-t.xml Вот как выглядит мой:

<pyicqt>
<jid>icq.cartman</jid>
<spooldir>/var/spool/jabber</spooldir>
<pid>/var/run/jabber/pyicq-t.pid</pid>
<mainServer>127.0.0.1</mainServer>
<mainServerJID>cartman</mainServerJID>
<website>http://cartman/</website>
<supportJid>admin@cartman</supportJid>
<port>8888</port>
<webport>12345</webport>
<secret>123456</secret>
<lang>ru</lang>
<encoding>cp-1251</encoding>
<icqServer>login.icq.com</icqServer>
<icqPort>5190</icqPort>
<usemd5auth/>
<sessionGreeting>Welcome to icq gate of Cartman server</sessionGreeting>
<enableShutdownMessage/>
<customShutdownMessage>Sorry but icq gete will be shutdown.</customShutdownMessage>
<registerMessage>You have succsefull registed</registerMessage>
<crossChat/>
<enableAutoInvite/>
<xstatusessupport/>
<detectunicode>1</detectunicode>
<admins>
<jid>admin@cartman</jid>
</admins>
<reactor>epoll</reactor>
<!--<xdbDriver>xmlfiles</xdbDriver>-->
<xdbDriver>mysql</xdbDriver>
<xdbDriver_mysql>
<username>pyicqt</username>
<password>12345678</password>
<database>pyicqt</database>
<server>localhost</server>
<format>encrypted</format>
</xdbDriver_mysql>
<avatarsOnlyOnChat/>
</pyicqt>


Комментировать его наверное не буду, в самом конфиге комментарии и так очень
хорошие, единственное, что замечу это, 8888 — это
порт по которому он прикручивается к джаберу, мы кстати его в
конфиге джаббера прописали, 123456 — это пароль для доступа гейта к джабберу, — мы убераем сохранение инфы из *.xml файлов и переносим ее в MySQL, ниже покажу как.

Как ставить MySQL и запускать его я рассказывать не буду, да и как создать пользователя и бд тоже. В общем, у нас уже есть рабочая MySQL с базой pyicqt, с полными правами у пользователя pyicqt, который логиниться по средствам пароля 12345678. Дальше, для гентуводов, лезем в папку /usr/lib/python2.5/site-packages/pyicq-t/tools/ и делаем слудующие

user$ mysql -u pyicqt -D pyicqt -p
mysql> \. db-setup.mysql


Ну что, попробуем запустить все это? Запускам сначала ejabberd, мы будем это делать через ejabberdctl и сразу запусткаем pyicq-t

user$ sudo ejabberdctl start
user$ sudo /etc/init.d/pyicq-t start


И начинаем смотреть логи джаббера:

user$ sudo tail -F /var/log/ejabberd/ejabberd.log


Если не каких ужасных ерроров не возникает — все гуд. Начинаем настраивать клиенты.

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

В принципе пощупал много гуишных клиентов(сам та давно пользуюсь mcabber'ом), и
решил, что на клиентовские машины, которые оборудованные ОС Windows XP буду
ставить либо PSI или Spark, так как PSI более развивающийся и это только
джаббер клиент а Spark единственный клиент, который имет MSI пакет. Какой
будете ставить вы, решайте сами, я лично покажу как я их ставил, естественно через политики в АД.

PSI

Что в принципе не есть хорошо, я воспользовался Python что бы перебить конфиги
на клиентовских машинах, так что он должен быть установлен у каждого
(делается это легко — MSI пакет он имеет, и ставить на ура, через AD). Далее просто ставим себе PSI, добавляем свою учетку, проверяем как все работает, как группы появились, в которых оффлайн пользователи висят, настраиваем PSI. Когда все сделаете, просто закройте его. Теперь лезем в *C:\Documents and Settings\%USERNAME%\PsiData\profiles\default\accounts.xml и правим его, ищем строку admin@cartman (где то в коце) (admin — это учетка под который ты вошел в джаббер, и твоя учетка в AD) и заменяем admin на QWERTYUIOP, сохраняем, и переименовываем его в accounts_old. Следующим шагом создаем шару, с правами на чтение у всех, у меня допустим она будет \\server4\psi_install и туда скидываем C:\Documents and Settings\%USERNAME%\PsiData и C:\Program Files\Psi (права на чтение должны быть у всех). Лезем в \\server4\psi_install\PsiData\profiles\default и копируем туда питоновский скрипт с именем psi_settings.py, а вот и он:

  1. #!/usr/env/bin python
  2. # -*- coding: utf-8 -*-
  3. import os
  4. import re
  5. import sys
  6. username = os.getenv('USERNAME')
  7. find_accountname = re.compile('^\s{0,3}<jid type="QString" >(.+)@cartman</jid>$')
  8. change_username = re.compile('QWERTYUIOP')
  9. fr = open('accounts_old', 'r')
  10. fw = open('accounts.xml', 'w+')
  11. for i in fr.readlines():
  12.   if find_accountname.search(i):
  13.     i = change_username.sub(username, i)
  14.   fw.write(i)
  15. fr.close()
  16. fw.close()


скрипт убогий, писал на скорую руку

Так, как большинство наших юзверей работают с ограниченными правами, решил что запускать PSI они будут из своей директории которая C:\Documents and Settings\%USERNAME%*. Лезем в оснастку в Group Policy -> Конфигурация Пользователя -> Конфигурация Windows -> Сценарии (вход/выход из системы) и выбираем Вход в Систему. Нажимаем показать файлы и создаем файлик с названием *copy_psi.cmd и изменяем его, содержимое:

@Echo off
IF EXIST "C:\Python25\python.exe" (
IF NOT EXIST "C:\Documents and Settings\%USERNAME%\Psi\psi.exe" (
xcopy \dc\Soft\ezotrank\psi_ad\* "C:\Documents and Settings\%USERNAME%" /E /C
cd "C:\Documents and Settings\%USERNAME%\PsiData\profiles\default"
python psi_settings.py
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v psi_run /d "C:\Documents and Settings\%USERNAME%\Psi\psi.exe"
)
)


Ну вроде и все, закрываем, добавляем в GP и идем курить.

Spark.

Что сразу не понравилось, так это то что он написан на Java, которая очень любит ОЗУ, зато очень нацелен на корпоративный сегмент рынка, и наверное очень хорошо работает с OpenFire(в принципе и то и то детище одних людей), особенно с платной версией. Что мне больше всего понравилась так это встроенная фича со скриншотом. Ставить ее вообще легко качаем с spark и по средствам AD ставим.

Некторые примечания:

Веб морда у Ежа будет располагаться по адресу cartman:5280/admin логин
и пароль — это admin которого мы прописали в ejabberd.cfg тоесть admin@cartman


Веб морда pyicq-t cartman:12345
Tags:
Hubs:
Total votes 12: ↑12 and ↓0+12
Comments6

Articles