Настройка сервера IM (jabber)

Тут описывается нелёгкий путь настройки ОС FreeBSD, начиная с установки дистрибутива и заканчивая настройкой каждого сервиса
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Настройка сервера IM (jabber)

Сообщение RomA »

Про что разговор:
В этой статье будет рассказано как настроить сервер мгновенных сообщений. Грубо говоря делаем внутрекорпоративную аську.

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

Условия
Итог:
1) нам нужна программа обмена короткими сообщениями.
2) она должна быть по возможности свободной
3) не мешать работе сети

Настройка
Ну и вот. Сегодня мы с вами будем поднимать jabber, а что бы пользователям было удобнее - авторизация будет происходить через доменные аккаунты. Итак - у меня есть сервер на котором поднят контролер домена. на нем я и начинаю поднимать сервер jabber'а

Ставил ejabberd (это программа так называется)

Код: Выделить всё

arhiv# cd /usr/ports/net-im/ejabberd
arhiv# make install clean
Он меня о чем то спрашивал

Код: Выделить всё

                      ┌────────────────────────────────────────────────────────────────────┐
                      │                   Options for ejabberd 2.0.5_2                     │  
                      │ ┌────────────────────────────────────────────────────────────────┐ │  
                      │ │                 [X] ODBC  Enable ODBC support                  │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      ├─└────────────────────────────────────────────────────────────────┘─┤  
                      │                       [  OK  ]       Cancel                        │  
                      └────────────────────────────────────────────────────────────────────┘  
                                                                                              
                      ┌────────────────────────────────────────────────────────────────────┐
                      │               Options for diablo-jdk 1.6.0.07.02_7                 │  
                      │ ┌────────────────────────────────────────────────────────────────┐ │  
                      │ │   [ ] POLICY    Install the Unlimited Strength Policy Files    │ │  
                      │ │   [ ] TZUPDATE  Update the time zone data                      │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      │ │                                                                │ │  
                      ├─└────────────────────────────────────────────────────────────────┘─┤  
                      │                       [  OK  ]       Cancel                        │  
                      └────────────────────────────────────────────────────────────────────┘  
                                                                                             
Поставилось без особых проблем. единственное что яву он качать не захотел

Код: Выделить всё

===>  Vulnerability check disabled, database not found
===>  Found saved configuration for diablo-jdk-1.6.0.07.02_7

 Because of licensing restrictions, you must fetch the distribution
 manually.

 Please access

     http://www.FreeBSDFoundation.org/cgi-bin/download?download=diablo-caffe-freebsd7-amd64-1.6.0_07-b02.tar.bz2

 with a web browser and "Accept" the End User License Agreement for
 "Caffe Diablo 1.6.0".

 Please place the downloaded file(s) in /usr/ports/distfiles.

*** Error code 1

Stop in /usr/ports/java/diablo-jdk16.
*** Error code 1

Пришлось скачать руками, приняв эту чудную лицензию и положив как он просил в /usr/ports/distfiles

Приступим к настройкам

Код: Выделить всё

cd /usr/local/etc/ejabberd
cp ejabberd.cfg.example ejabberd.cfg
cp inetrc.example inetrc
Не знаю как сейчас, а вот раньше ejabber не удавалось настроить без поднятия нормального ДНС сервера. У меня apk.stniva.ru резольвился так что я пока ДНС не трогаю - авось так прокатит. Кста тут за обращения к ДНС отвечает файлик inetrc - когда то его не было и приходилось изобретать велосипеды...
Вторая проблема появилась значительно позже и называлась она сертификаты. При поднятии очередного сервера jabber столкнулся с тем, что долго не мог настроить линк меж серверами - после чтения инструкция оказалось что пока я не заведу сертификат ничего у меня не получится, даже если в конфиге я явно указал что ничего шифровать не хочу. Не будем испытывать судьбу - сертификат сделаем сразу - он нам будет нужен всеравно.

Код: Выделить всё

openssl req -newkey rsa:1024 -keyout server.pem -nodes -x509 -days 3650 -out server.cer
cat server.cer >> server.pem
rm server.cer
Теперь можно приступить к настройке самой жабки - то есть правим /usr/local/etc/ejabberd/ejabberd.cfg - я опишу только то, что я трогал - остальное по умолчанию оставил. Параметры и описания брал с оригинальной статьи на сайте разработчика http://www.process-one.net/en/ejabberd/guide_en#htoc38

Код: Выделить всё

{watchdog_admins, ["roma@apk.stniva.ru"]}
{hosts, ["apk.stniva.ru"]}
{certfile, "/usr/local/etc/ejabberd/server.pem"}, starttls,
%%{auth_method, internal} %% - это я закоментировал

{auth_method, ldap}
{ldap_servers, ["localhost"]}
{ldap_base, "ou=users,dc=apk,dc=stniva,dc=ru"}
{ldap_rootdn, "cn=admin,dc=apk,dc=stniva,dc=ru"}
{ldap_password, "000000"}

{acl, admin, {user, "roma", "apk.stniva.ru"}}
{access, register, [{deny, all}]}.
{language, "ru"}
На этом я успокоился. Добавляем в /etc/rc.conf разрешение запуска ejabberd_enable="YES" и пробуем запустить /usr/local/etc/rc.d/ejabberd start

У меня все запустилось с первого раза. Попробовал авторизоваться - не получилось. Посидел, подумал, почитал логи - жабка писала что не может прочесть мой пароль - понял что у меня пользователь совмещен с админом сервера, блин. Вспомнил пароль обычного пользователя - ура, прокатило!

Это была минимальная конфигурация с которой мы запустились. Теперь будем делать навороты. Первое что захотелось - это что бы выводилась информация о пользователе - кто он такой - для этого были проделаны следующие изменения конфига

Код: Выделить всё

  %%{mod_vcard,    []},
  {mod_vcard_ldap,
    [
    {ldap_rootdn, "cn=admin,dc=apk,dc=stniva,dc=ru"},
    {ldap_password, "000000"},
    {ldap_base, "ou=users,dc=apk,dc=stniva,dc=ru"},
    {ldap_vcard_map,
    [{"NICKNAME", "%u", []},
    {"GIVEN", "%s", ["givenName"]},
    {"FAMILY", "%s", ["sn"]},
    {"FN", "%s %s", ["givenName", "sn"]}]},
    {ldap_search_fields,
    [{"User", "%u"},
    {"Name", "givenName"},
    {"Family Name", "sn"}]},
    {ldap_search_reported,
    [{"Full Name", "FN"},
    {"Nickname", "NICKNAME"}]}
    ]},
Теперь у меня из домена берется имя и фамилия пользователя, а так же его ник. Жить стало проще :-)

Хочется обратить внимание:
1) Жаба не любит всякие комменты, тем более что раньше они были % а теперь стали %% - хотя прокатывает и % но сталкивался что только после удаления такой строки запускалась
2) Поиск происходит не по * а по минимум 3м символам ника - это можно отключить... я обычно отключаю, но когда ставишь первый раз надо иметь в виду
3) У пользователя, под которым ejabber идет в LDAP должны быть права на чтение пароля пользователя, пароль пользователя в лдапе не должен быть "приватным" и так далее - говоря другим словами я могу входить в домен через, но в жабе я могу и не авторизоваться - стоит это помнить
4) Жаба может очень долго запускаться. вот тут уже был случай что жаба запускалась час. На первый взгляд это выглядит как будто она не пускается и только вникнув понимаешь что она пытается пуститься и просто не надо её трогать - запустится
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Re: Настройка сервера IM (jabber)

Сообщение RomA »

ВВТ писал(а):erlang ставил? или нет? какая версия стоит?
какая версия стоит ejabberd?

про яву поподробнее! что откуда и как качал
1) ставил все что он просил. процесс описал
2) смотрим внимательно на скриншоты - там написано ejabberd 2.0.5_2, версия явы тоже на скриншоте есть
3) откуда качать была ссылка - скопировал в браузер и скачал как писал
ВВТ
Сообщения: 6
Зарегистрирован: 26 янв 2009, 11:17
Откуда: HH

Re: Настройка сервера IM (jabber)

Сообщение ВВТ »

через что проверял авторизацию? клиент какой?
если ты делаешь для людей свои статьи, то, думаю, есть смысл их писать правильно. Где точки в конфигурационном файле? У тебя только одна на все твои изменения в конфиге. Или ты хочешь сказать, что у тебя и без точек запустилось? Не верю.
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Re: Настройка сервера IM (jabber)

Сообщение RomA »

ВВТ писал(а):через что проверял авторизацию? клиент какой?
если ты делаешь для людей свои статьи, то, думаю, есть смысл их писать правильно. Где точки в конфигурационном файле? У тебя только одна на все твои изменения в конфиге. Или ты хочешь сказать, что у тебя и без точек запустилось? Не верю.
1) статья еще не дописана
2) представление что и как делать статья дает, а чтение конфигов самим никто пока не отменял.
3) если ты хочешь заниматься копипастом - говори где не так - будем править. я на точки внимание не обращят, так как правил существующие правила.

Теперь по существу. Про клиенты буду писать еще и много. Пробовал iChat, Adium, Pandion
ВВТ
Сообщения: 6
Зарегистрирован: 26 янв 2009, 11:17
Откуда: HH

Re: Настройка сервера IM (jabber)

Сообщение ВВТ »

статья дописана? точки не появились.

Код: Выделить всё

    {watchdog_admins, ["roma@apk.stniva.ru"]}
    {hosts, ["apk.stniva.ru"]}
    {certfile, "/usr/local/etc/ejabberd/server.pem"}, starttls,
    %%{auth_method, internal} %% - это я закоментировал

    {auth_method, ldap}
    {ldap_servers, ["localhost"]}
    {ldap_base, "ou=users,dc=apk,dc=stniva,dc=ru"}
    {ldap_rootdn, "cn=admin,dc=apk,dc=stniva,dc=ru"}
    {ldap_password, "000000"}

    {acl, admin, {user, "roma", "apk.stniva.ru"}}
    {access, register, [{deny, all}]}.
    {language, "ru"}


RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Re: Настройка сервера IM (jabber)

Сообщение RomA »

ВВТ писал(а):статья дописана? точки не появились.
Ну что же - для тех кто не может прочитать внимательно повторюсь:
RomA писал(а):я опишу только то, что я трогал - остальное по умолчанию оставил
Я не трога точки. Я описал те вещи в конфиге, которые трогал. описал так, что бы они были узнаваемы. Все эти строки находятся в разных частях конфига, а не друг за другам как у меня - просто надо их найти и поправить по аналогии.
Agafonov
Сообщения: 4
Зарегистрирован: 15 июн 2011, 08:57

Re: Настройка сервера IM (jabber)

Сообщение Agafonov »

Может кому будет интересно. Jabber сервер настроен и работает, пользователи успешо логинятся на нём, но друг друга должны добавлять в контакт-лист ручками...
Памятуя о том, что пользователи по своей природе достаточно ленивы, расшарим пользователей в контакт-листе. Для более приятного восприятия - отсортируем пользователей по группам LDAP.
Добавляем в ejabberd.cfg строки следующего содержания:

Код: Выделить всё

{mod_shared_roster_ldap,[
  {ldap_base,"dc=pechersky,dc=ru"},
  {ldap_rfilter,"(objectClass=posixGroup)"},
  {ldap_filter,""},
  {ldap_ufilter,"(uid=%u)"},
  {ldap_groupattr,"cn"},
  {ldap_groupdesc,"description"},
  {ldap_memberattr,"memberUid"},
  {ldap_memberattr_format,"%u"},
  {ldap_useruid,"uid"},
  {ldap_userdesc,"displayName"}
  ]},
Перезапускаем ejabberd, перезапускаем клиентов, смотрим результат...
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Re: Настройка сервера IM (jabber)

Сообщение RomA »

Agafonov писал(а):
Надо наверное в лдапе что то с паролями поправить... )) Подскажите что именно?
Привет. Правильно, надо поправить у пользователя Posix password в LDAP . Это можно сделать например утилиткой Ldap admin.
Дело в том, что USRMGR не всегда корректно прописывает этот пароль при создании пользователя.
Да, если заводить пользователя то не всегда пароль понимается жабкой. Но у нас по положению пользователь должен менять пароль при первом запуске, а вот когда он его сменил через винду - тогда жабка его опознаёт. Таким образом что бы жабка опознала пароль надо его поменять через стандартные средства винды
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Автоматическая установка клиентов

Сообщение RomA »

Данная статья актуальна тем, у кого компьютеры работают под управление контролера домена и кому жалко своё время.

Наша задача:
1) автоматически поставить всем на компьютере клинта jabber (pandion)
2) легко его потом обновлять
3) максимум заполнить за пользователя все данные
4) запускать каждое утро

Приступим. Для начала нам нужен дистрибутив. Как его подготовить выходит за рамки данной статьи - об этом я напишу отдельно. Вы можете либо создать свой дистрибутив, либо взять мой - что я вам советую. Скачать последний дистрибутив можно тут http://192.168.0.11/Pandion.tar.gz Вам будет требоваться исправить домен для подключения.

Во всех доменах есть скрытая сетевая шара netlogon - вот в неё и надо распаковать это файл - в моём случае это /home/samba/netlogon/Win - это я для примера, что бы в скрипте вы понимали что за пути.

Ну и теперь самое интересное. в конфиге самы есть вот такая строка

Код: Выделить всё

# путь к хомякам юзеров
    logon home = \\%L\%U
    logon drive = X:
    logon script = logon.bat
как видно по умолчанию (если в профиле пользователя не указано другое), при входе пользователя в домен отрабатывается скрипт logon.bat - с ним мы и будем играться. у меня он лежит в /home/samba/netlogo и самое интересное всей этой статьи - это его содержимое (я буду приводить только ту часть, которая касается запуска пандиона)

Код: Выделить всё

REM *********** JABBER *********************************************
SET jVersion=0.0.0.0
SET jPath=C:\Documents and Settings\%username%\Application Data

IF EXIST "%jPath%\Pandion\%jVersion%.txt" GOTO end

:install.
RMDIR /S /Q C:\"Program Files"\Pandion
RMDIR /S /Q C:\"Documents and Settings"\%username%\"Local Settings"\"Application Data"\Pandion
DEL /q "C:\Documents and Settings\All Users\Рабочий стол\Pandion.lnk"
RMDIR /S /Q "%jPath%\Pandion"
XCOPY \\192.168.0.11\netlogon\Win\Pandion "%jPath%\Pandion" /Y /E /I
COPY "\\192.168.0.11\netlogon\Win\Pandion\Служба Сообщений.lnk" "C:\Documents and Settings\%username%\Рабочий стол" /Y
echo ^<^?xml version="1.0" encoding="UTF-8"?^>^<^settings^>^<^aot^>^false^<^/aot^>^<^authentication^>^normal^<^/authentication^>^<^autologin^>^true^<^/autologin^>^<^encryption^>^optional^<^/encryption^>^<^installupdates^>^yes^<^/installupdates^>^<^language^>^ru^<^/language^>^<^last_address^>^%username%@apk.stniva.ru^<^/last_address^>^<^last_autoupdate^>^0^<^/last_autoupdate^>^<^last_password^>^<^/last_password^>^<^last_password_remember^>^true^<^/last_password_remember^>^<^lastheight^>^560^<^/lastheight^>^<^lastposx^>^400^<^/lastposx^>^<^lastposy^>^20^<^/lastposy^>^<^lastwidth^>^330^<^/lastwidth^>^<^serveraddress^>^<^/serveraddress^>^<^serverport^>^<^/serverport^>^<^softwaretrack^>^stable^<^/softwaretrack^>^<^welcomescreen^>^yes^<^/welcomescreen^>^<^welcomesettings^>^true^<^/welcomesettings^>^<^/settings^>^ > "%jPath%\Pandion\global.xml"

GOTO version

:version
cd /D "%jPath%\Pandion\"
echo pwouet > %jVersion%.txt

:end

:START
START /b C:\"Documents and Settings"\%username%\"Application Data"\Pandion\pandion.exe

Сам скрипт тоже доступен по адресу http://192.168.0.11/logon.bat - ну это для проверки.

Алгаритм его работы следующий:
1) проверяем, если ли нужная нам версия рандиона у клиента
2) если есть - запускаем, если нет - устанавливаем. При установки создаём конфиг жабки, куда вписываем данные клиента
3) всё ))))

Обратить внимание на этой схеме на переменную

Код: Выделить всё

SET jVersion=0.0.0.0
изменив эту переменную мы заставим скрипт установить жабку. То есть при обновлении исходиников на сервере, мы изменяем тут версию и всё :-)

Вот что у нас получается:
окно авторизации
1.jpg
1.jpg (62.78 КБ) 17601 просмотр
окно контактов
3.jpg
3.jpg (57.16 КБ) 17601 просмотр
Иконка в трее и клик по ней правой кнопкой мышки - наше меню
2.jpg
2.jpg (26.21 КБ) 17601 просмотр
asorochenkov
Сообщения: 14
Зарегистрирован: 11 мар 2011, 09:59

Re: Настройка сервера IM (jabber)

Сообщение asorochenkov »

RomA писал(а):
Agafonov писал(а):
Надо наверное в лдапе что то с паролями поправить... )) Подскажите что именно?
Привет. Правильно, надо поправить у пользователя Posix password в LDAP . Это можно сделать например утилиткой Ldap admin.
Дело в том, что USRMGR не всегда корректно прописывает этот пароль при создании пользователя.
Да, если заводить пользователя то не всегда пароль понимается жабкой. Но у нас по положению пользователь должен менять пароль при первом запуске, а вот когда он его сменил через винду - тогда жабка его опознаёт. Таким образом что бы жабка опознала пароль надо его поменять через стандартные средства винды
Столкнулись с проблемой, когда пользователь менят пароль в домене через Windows, не пускает в Jabber, а когда меняем через LAM (указав применить пароль к Unix и Samba) то все хорошо.
Путем коллективных изысканий дошли до следующего:

1. Jabber клиент ищет пароль в ldape в поле userPassword
2. Windows меняет пароль в поле sambaNTPassword

заставить смотреть jabber при ldap авторизации в другое поле не удалсь. проблему решили путем внешней аутентификации

в ejabberd.cfg прописываем

Код: Выделить всё

{auth_method, external}.
{extauth_program, "/usr/local/etc/ejabberd/check_pass_ldap_perl.pl"}.
файл check_pass_ldap_perl.pl был найден в интернете и немного модифицирован
листинг прилагаем

Код: Выделить всё

unix# cat check_pass_ldap_perl.pl
#!/usr/bin/perl

use Net::LDAP;
use Crypt::SmbHash qw(nthash);
use Digest::SHA;
use Encode;

my $ldapBind="cn=root,dc=zavod,dc=ru";  # под кем соединяемся с ldap
my $ldapPass="------------"; # Указываем здесь пароль для root
my $ldapBase="ou=users,dc=zavod,dc=ru";        
my $fieldUser="uid";   # где будем смотреть пользователя
my $fieldPass="sambaNTPassword";   # и поле для сравнения пароля

use Unix::Syslog qw(:macros :subs);


sub ldap_connect {
        do { sleep 2; $ldap = new Net::LDAP ( 'ldap://127.0.0.1', version=>3, verify=>'none') } while not $ldap;
        $ldap->bind ("$ldapBind", password => $ldapPass);
}

sub ldap_disconnect {
        $ldap->unbind;
        $ldap->disconnect;
}

ldap_connect;

while(1){
    my $buf = "";
    syslog LOG_INFO,"waiting for packet";
    my $nread = sysread STDIN,$buf,2;
    do { syslog LOG_INFO,"port closed"; exit; } unless $nread == 2;
    my $len = unpack "n",$buf;
    my $nread = sysread STDIN,$buf,$len;


    ($op,$user,$domain,$pass) = split (/:/,$buf,4);

    # Filter dangerous characters
    $user =~ s/[\n\r]//g;
    $pass =~ s/[\n\r]//g;
    $domain =~ s/[\n\r]//g;
    my $password = nthash($pass);

    my $jid = "$user\@$domain";
    my $result;
    my $res;

    syslog(LOG_INFO,"request (%s)", $op);
    if (length $user > 128 or length $user > 128 or length $domain > 128){
       my $out = pack "nn",2,0;
       syswrite STDOUT,$out;
       next;
    }
    SWITCH:
    {
      $op eq 'auth' and do
      {
         $res = $ldap->search (
           base => "$ldapBase",
           scope => "sub",
           filter => "(&($fieldUser=$user)($fieldPass=$password))"
         );
         $code=$res->code();

         if($code != 0){
              ldap_disconnect;
              ldap_connect;
              $res = $ldap->search (
              base => "$ldapBase",
                filter => "(&($fieldUser=$user)($fieldPass=$password))"
              );
         }
         $result = $res->count();

      },last SWITCH;

      $op eq 'setpass' and do
      {
         $result = 0;
      },last SWITCH;
      $op eq 'isuser' and do
      {
         # password is null. Return 1 if the user $user\@$domain exitst.
         $result = 0;
         $res = $ldap->search (
           base => "$ldapBase",
           filter => "($fieldUser=$user)"
         );
         $code=$res->code();
         if($code != 0){
           ldap_disconnect;
           ldap_connect;
           $res = $ldap->search (
             base => "$ldapBase",
             filter => "($fieldUser=$user)"
           );
         }
         $result = $res->count();
         #syslog(LOG_INFO,"ejabberd_mysql_ext_auth: Executing is_user: %s",$orden);
      },last SWITCH;
    };
    $result = 0 if $domain ne "smhlebopek.ru";

    my $out = pack "nn",2,$result ? 1 : 0;
    syswrite STDOUT,$out;

}

ldap_disconnect;

closelog;

p.s. пароль на русском языке не принимается, разбираться не стали.
Ответить