Установка сервера Openfire на Debian в домене AD2008 с прозрачной авторизацией пользователей

Здравствуйте!

Хочу поделиться опытом установки сервера Openfire на Debian в домене AD Windows Server 2008 с использованием SSO клиентом Spark.

Сама установка проста и занимает немного времени, основные сложности для меня возникли при настройке kerberos-авторизации всей связки ПО.

Инфраструктура:
Openfire 3.8.2 устанавливаем на Debian 7.0 «Wheezy» x64 с использованием СУБД MySQL.
Имя Debian-сервера: openfireserver.
Служба Active Directory развернута на Windows 2008 Server Standard (Kerberos использует шифрование RC4-HMAC-NT по умолчанию).
Домен realm.local.
Рабочие станции Windows XP Pro и Windows 7 Pro x32/x64 с установленным клиентом Spark 2.6.3.


Инсталляция по шагам (на Debian уже предустановлены MySQL, Samba, Sun/Oracle Java):

1) Логинимся под root-ом.

2) Проверяем предустановленный софт:
# cat /etc/issue

Debian GNU/Linux 7.0 \n \l

# smbd -V

Version 3.6.6

# mysql -V

mysql Ver 14.14 Distrib 5.5.31, for debian-linux-gnu (x86_64) using readline 6.2

# java -version

java version «1.7.0_21»
Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)

3) Создаем базу данных «openfire» и пользователя MySQL «openfire»:
# mysql -p

Enter password: [набираем пароль пользователя root в MySQL]
Welcome to the MySQL monitor. Commands end with; or \g.
Your MySQL connection id is 49
Server version: 5.5.31-0+wheezy1 (Debian)
Copyright 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE DATABASE openfire;

Query OK, 1 row affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON openfire.* TO 'openfire'@'localhost' IDENTIFIED BY 'PasswordGoldFish' WITH GRANT OPTION;

Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;

Query OK, 0 rows affected (0.00 sec)

mysql> exit

Bye

4) Загружаем и устанавливаем Openfire сервер.
# cd /tmp
# wget http://www.igniterealtime.org/downloadServlet?filename=openfire/openfire_3.8.2_all.deb

100%[==================================>] 12 838 026 2,92M/s за 7,6s
2013-05-28 12:58:04 (1,62 MB/s) — «downloadServlet?filename=openfire%2Fopenfire_3.8.2_all.deb» saved [12838026/12838026]
/tmp# cp downloadServlet\?filename\=openfire%2Fopenfire_3.8.1_all.deb openfire_3.8.2_all.deb
/tmp# rm downloadServlet\?filename\=openfire%2Fopenfire_3.8.2_all.deb
/tmp# dpkg -i openfire_3.8.2_all.deb

Warning: /var/lib/openfire
Starting openfire: openfire

# /etc/init.d/openfire stop

Stopping openfire: openfire.

Меняем владельца:
# chown -R openfire:openfire /var/lib/openfire

# /etc/init.d/openfire start

Starting openfire: openfire.

5) Переходим в браузере по адресу (я использую Mozilla Firefox):
http://openfireserver:9090
Выбираем язык (русский перевод кривой, я оставил English)
Набираем Domain name: openfireserver.realm.local
Далее выбираем «Standard Database Conncection»
Выбираем Preset MySQL
Исправляем [hostname] на localhost и [database-name] на openfire
Набираем Username: openfire
Набираем Password: PasswordGoldFish
Нажимаем «Continue»
Настройка Profile, Step 1:
Выбираем «Directory Server (LDAP)»
Выбираем Server Type: Active Directory
Набираем Host: realm.local
Набираем Base DN: ou=Jabber,ou=Company_Users,dc=realm,dc=local
Набираем Administrator DN: cn=LDAP,cn=Users,dc=realm,dc=local
Набираем Password: Password_LDAP
Для этого шага я предварительно создал пользователя в AD с именем LDAP и вечным паролем: Password_LDAP
Сохраняем и продолжаем.
Шаги 2 и 3 сохраняем без изменений.
Добавляем администраторов Openfire, это могут быть любые пользователи из Base DN.
Просто набираем их логины и нажимаем «Add».
Если пользователи успешно добавились, жмем «Continue».

На этом установка Openfire закончена, можно зайти в консоль администратора.
Если зайти в раздел Users можно увидеть, что все пользователи из Base DN уже есть.
Все уже работает и пользователь могут авторизовываться обычным способом, но моя цель SSO (главная проблема — блокировка учетных записей в AD после смены пароля).
Для этого идем дальше…

6) Настраиваем Samba:
# nano /etc/samba/smb.conf

[global]
   workgroup = REALM
   realm =REALM.LOCAL
   security = ADS
   encrypt passwords = true
   dns proxy = no
   socket options = TCP_NODELAY
   kerberos method = secrets and keytab
   winbind refresh tickets = yes
   password server = realm.local
   domain master = no
   local master = no
   preferred master = no
   os level = 0
   domain logons = no
   load printers = no
   show add printer wizard = no
   printcap name = /dev/null
   disable spoolss = yes


7) Настраиваем Kerberos:
# nano /etc/krb5.conf

[libdefaults]
        default_realm = REALM.LOCAL
        kdc_timesync = 1
        forwardable = true
        proxiable = true
        default_tkt_enctypes = rc4-hmac des3-cbc-sha1 des-cbc-crc des-cbc-md5
        default_tgs_enctypes = rc4-hmac des3-cbc-sha1 des-cbc-crc des-cbc-md5
        permitted_enctypes = rc4-hmac des3-cbc-sha1 des-cbc-crc des-cbc-md5
[realms]
        REALM.LOCAL = {
                kdc = realm.local
                admin_server = realm.local
                default_domain = REALM.LOCAL
        }
[domain_realm]
        .realm.local = REALM.LOCAL
        realm.local = REALM.LOCAL


8) Перезапускаем Samba
# /etc/init.d/samba restart


9) Присоединяем Debian сервер к AD:
# net ads join -U DomainAdminAccount -D REALM.LOCAL

или

# net rpc join -U DomainAdminAccount


10) Проверяем как присоединилось:
# net ads testjoin

Join is OK

# net rpc testjoin

Join to 'REALM' is OK

11) Проверка DNS:
# nslookup
> openfireserver

Server: 192.168.1.1
Address: 192.168.1.1#53
Name: openfireserver.realm.local
Address: 192.168.1.22

> 192.168.1.22

Server: 192.168.1.1
Address: 192.168.1.1#53
22.1.168.192.in-addr.arpa name = openfireserver.realm.local.

> exit


Следующие пять шагов выполняем на контроллере домена Windows Server 2008:

12) Создаем в AD пользователя xmpp-openfire с вечным паролем и включенной опцией «Do not require Kerberos preauthentication» (Без предварительной проверки подлинности Kerberos).

13) Создаем SPN и связываем ее с пользователем xmpp-openfire:
Запускаем командную строку с привилегиями Администратора.
>setspn -A xmpp/openfireserver.realm.local@REALM.LOCAL xmpp-openfire
>ktpass -princ xmpp/openfireserver.realm.local@REALM.LOCAL -mapuser xmpp-openfire@realm.local -pass * -ptype KRB5_NT_PRINCIPAL

Вводим пароль пользователя xmpp-openfire.

14) Если для генерации keytab-файла будем использовать JRE, тогда создаем файл C:\Windows\krb5.ini с содержимым:
[libdefaults]
    default_realm = REALM.LOCAL
[realms]
    REALM.LOCAL = {
        kdc = realm.local
        admin_server = realm.local
        default_domain = REALM.LOCAL
    }
[domain_realm]
    .realm.local = REALM.LOCAL
    realm.local = REALM.LOCAL


15) Создаем keytab-файл (должно быть установлено Sun/Oracle JRE6):
cd C:\Program Files (x86)\Java\jre6\bin>
C:\Program Files (x86)\Java\jre6\bin>ktab -k xmpp.keytab -a xmpp/openfireserver.realm.local@REALM.LOCAL

Вводим пароль пользователя xmpp-openfire.

Или можно воспользоваться другим способом, без JRE
>ktpass -princ xmpp/openfireserver.realm.local@REALM.LOCAL -mapuser xmpp-openfire@realm.local -pass * -ptype KRB5_NT_PRINCIPAL -out xmpp.keytab

Вводим пароль пользователя xmpp-openfire.

16) Проверяем созданный keytab-файл (нужно JRE):
C:\Program Files (x86)\Java\jre6\bin>kinit -k -t xmpp.keytab xmpp/openfireserver.realm.local@REALM.LOCAL


17) Переносим проверенный файл xmpp.keytab на Debian сервер в /usr/share/openfire/resources
Меняем владельца:
# chown openfire:openfire xmpp.keytab


18) Проверяем файл xmpp.keytab на Debian сервере:
# kinit -V -k -t /usr/share/openfire/resources/xmpp.keytab xmpp/openfireserver.realm.local@REALM.LOCAL


19) Создаем на Debian сервере файл \etc\openfire\gss.conf с содержимым:
com.sun.security.jgss.accept {
    com.sun.security.auth.module.Krb5LoginModule
    required
    storeKey=true
    keyTab="/usr/share/openfire/resources/xmpp.keytab"
    doNotPrompt=true
    useKeyTab=true
    realm="REALM.LOCAL"
    principal="xmpp/openfireserver.realm.local@REALM.LOCAL"
    isInitiator=false
    debug=true;
};


20) Заходим браузером в консоль администратора Openfire и в разделе System properties добавляем параметры:
sasl.gssapi.config = /etc/openfire/gss.conf
sasl.gssapi.debug = false
sasl.gssapi.useSubjectCredsOnly = false
sasl.mechs = GSSAPI
sasl.realm = REALM.LOCAL
xmpp.fqdn = openfireserver.realm.local

21) Перезапуск Openfire
# /etc/init.d/openfire restart


22) Устанавливаем на рабочие станции Jabber-клиента Spark 2.6.3 with JRE.

23) Правим реестр:
В раздел
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters
(For XP: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos)
добавляем параметр типа DWORD
AllowTGTSessionKey со значением 1.

24) Создаем в C:\Windows файл kbd5.ini с содержимым:
[libdefaults]
    default_realm = REALM.LOCAL
    default_tkt_enctypes = rc4-hmac
    default_tgs_enctypes = rc4-hmac
[realms]
    REALM.LOCAL = {
        kdc = realm.local
        admin_server = realm.local
        default_domain = REALM.LOCAL
    }
[domain_realm]
    .realm.local = REALM.LOCAL
    realm.local = REALM.LOCAL


25) Перезагружаем рабочую станцию.

26) В Spark выбираем опцию «Use Single Sign-On (SSO) via GSSAPI», набираем openfireserver в поле «Сервер» и подключаемся.

В Windows XP нет проблем, но в Windows 7 SSO в Spark работает из коробки только с непривилегированными пользователями.
Если вы работаете под учетной записью администратора — запускайте Spark от имени Администратора или отключите UAC.

Удачи!

По мере освоения продукта следует продолжение…
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 36

    +1
    Откуда и зачем такой адовый конфиг krb5.conf? Достаточно указания только своего домена.
      0
      Конфиг был развернут Debian-ом, решил не кромсать, а просто добавил свое, нужное.
        +1
        Я бы выпилил лишнее, совершенно не за чем. Имхо, оставлять в конфиге нужно только то, что реально необходимо.
        Но в любом случае, ваша статья довольно полезна, спасибо. Хотя, стоило бы упомянуть, что она подходит для «продвинутых использователей» (ишь как загнул)) опенфаер и AD, т.к. многие нюансы в статье опущены и установка с нуля по этому хауту не пройдет. Взять хотя бы то, что корневой DN для поиска аккаунтов и групп уж точно может отличаться. Кстати, за одним, я бы порекомендовал создавать отдельные группы для опенфаер и дополнительно включать туда пользователей, а не использовать группы безопасности. В общем, если статью как следует дополнить, то выйдет очень хорошая инструкция от и до.
          0
          Выпилил, работает :)
          0
          На этом установка Openfire закончена, можно зайти в консоль администратора.

          И еще, хочу добавить, т.к. иногда этот глюк всплывает из версии к версии (про 3.8.х сказать не могу): после завершения настройки рекомендуется перезапустить сервис с опенфаером, т.к. иногда он отказывается пускать под доменным аккаунтом после настройки, что вызывает батхерт на ровном месте.

            0
            кстати небольшое дополнение, в случае настройки по этому руководство в первый раз, думаю легко запутаться, ибо как я понял имя kdc у вас совпадает с именем домена. И если в файле krb5.conf поле kdc можно интуитивно догадаться, то остальные — admin_server и password server в samba.conf — можно не додумать и долго биться головой об стенку. И еще заметил опечатку «AllofTGTSessionKey» — AllowTGTSessionKey конечно же.
              0
              Спасибо, исправил.
          0
          23) Правим реестр:
          24) Создаем в C:\Windows файл kbd5.ini с содержимым:

          Раз уж речь идёт о Active Directory, то можно и через GPP настроить.
          А вообще: спасибо за статью — сам одно время хотел настроить.
            0
            Набираем Base DN: ou=Jabber,ou=Company_Users,dc=realm,dc=local

            Я так понимаю, что этим Вы пытались дать доступ к jabber только пользователям из ou=Jabber, ou=Company_Users?
            Можно сделать изящнее:
            1. Создать доменную группу распространения (группа безопасности будет излишей)
            2. В параметре Openfire «ldap.searchFilter» указать: (memberOf=<dn созданной группы>)

            Тогда доступ к серверу получат только члены заданной группы.
            Если группа будет группой распространения — она не увеличит размер TGT пользователей.
              0
              Да, доступ из этой OU. С группами еще не разбирался, очевидно будет удобнее, спасибо.
              0
              Спасибо, в скором времени планирую тоже все это настроить. Раньше пробовал, не получилось. С вашей статьей будет легче)
                0
                На здоровье. Сам бился несколько дней, пока все не сошлось. )))
                  0
                  У меня уже вторая волна энтузиазма настроить эту связку. Openfire установленный на windows настроил на NTLM аутентификацию, но вот почему то хочу его держать на выделенной виртуалке с центосом. Уже второй раз прихожу к стадии: OpenFire авторизует пользователей из AD по логин/пароль, kerberos вроде настроен исправно, но через SSO никак не пускает :( Есть одна вещь подозрительная, у всех в руководствах klist выдает, что тикет хранится в кэше, а у меня кэш пустой, может в этом дело. Вообще Kerberos и его диагностика — для меня какой-то темный лес. Сейчас еще по вашей статье попробую все с нуля поднять.
                    0
                    Ну вот и результат. Все получилось по этому руководству. Почему с другим не получалось не пойму. Немного другой порядок действий тут был, нежели во всех других рекомендациях. Везде пишут выполнить kinit под нужным пользователем и подрезать лишнее в файле krb5.keytab а тут же наоборот сначала кейтаб и с помощью него kinit. И еще заметил у себя странный глюк, но он касается OpenFire, а не Kerberos. В веб панели, когда добавляю параметры (sasl например) не обрабатывается положение радиобокса «Do not encrypt property value» и значение всегда добавляется в режиме Encrypt, после чего его надо отредактировать и оно станет decrypt при еще одном редактировании снова encrypt и так циклично. Положение радиобокса ни на что не влияет.
                  0
                  Настройка samba тут вообще лишняя достаточно настройки kerberos
                    0
                    то есть в домен Debian вводить не надо?
                      0
                      Да. никакого смысла нет.
                    –1
                    Ставил опенфайр с сайта в виртуалку. Легким движением руки все ввелось в домен и заработало без всяких плясок как тут.
                      0
                      SSO на линухе завелось без GSSAPI? Расскажите, пожалуйста, как?
                        0
                        Если оставить Openfire сервисом на Windows-сервере, то с помощью Миранды, тройки файлов для NTML авторизации и правки конфига в 4 строчки можно добиться такого же успеха.
                          0
                          Читал про это, хотелось Kerberos. NTLM не хотелось.
                            0
                            Позвольте поинтересоваться мотивами?
                            0
                            Кстати, у NTLM есть преимущество. SSO будет работать на компьютерах вне домена, естественно при условии, что учетная запись на компе и в домене совпадают. Работает даже с вин хоум.
                              0
                              Кстати, у NTLM есть преимущество. SSO будет работать на компьютерах вне домена, естественно при условии, что учетная запись на компе и в домене совпадают. Работает даже с вин хоум.

                              Вы не находите, что в корпоративной среде это будет скорее недостатком? С компьютера вне домена потенциально проще получить пароль пользователя, а если он будет совпадать с корпоративным… и логин будет совпадать…
                                0
                                Не нахожу. Безопасность рабочих станций вне домена так же лежит на плечах ИТ-персонала и в принципе не так важно, в домене или нет. В конкретно моем случае, я использовал эту фишку для сквозной аутентификации офисов в других городах, и опять же, конкретно в моем случае удаленным юзерам по сути и можно было только логиниться в опенфаер, да адресуную книгу из AD забирать. Сразу же скажу, что осведомлен, что надо было там КД ставить и пр и пр. но тогда было сделано именно так как сделано, в том числе ввиду доставшихся вин хоум.
                          0
                          Честно говоря, мне непонятна цель вводить linux машину в домен? В чем профит?

                          Работает все без samba и kerbios.

                          P.S. Буду сползать с openfire :D
                            0
                            Работает все без samba и kerbios.

                            Поделитесь пожалуйста секретом, как у вас работает SSO в openfire без samba и kerberos? Интересно же!
                              0
                              проморгал, тогда нужен только kerbios. Samba не нужна.
                                0
                                Сначала подумал что опечатка, но два раза… — не бывает. Что такое:
                                kerbios

                                ?
                                  0
                                  да извиняюсь, тяжкий день сегодня.

                                  Попало в автодополнение откуда то.

                                  kerberos конечно же.
                            0
                            спустя 3 года сделаю важное добавление (OF — 4.0.1):
                            Опенфаер базу MySQL фигачит в кодировке latin1_swedish_ci (в моем случае) т.е. надо в UTF8 ее перебить, в противном случае мясо с группами и контактами в ростере, фактически неработоспсобная версия для русского языка.
                            Требуется до развертывания опенфаера сделать (взято отсюда):

                            mysql -u user -p
                            use your_base
                            alter database character set utf8;
                            alter database collate utf8_general_ci;

                            Во время установки, когда будете выбирать драйвер MySQL укажите URL к базе вида:
                            jdbc:mysql://localhost:3306/your_base?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8

                            Если openfire уже установлен, то переконвертируйте базу в utf8, затем файле конфигурации openfire.xml допишите после jdbc:mysql://localhost:3306/your_base

                            ?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8

                            Здесь нужно ОБЯЗАТЕЛЬНО! заменить & на & иначе вместо входа в админку увидите страницу установки openfire.

                            Я просто дропнул базу, создал в верной кодировке и перенастроил опенфаер.

                            К слову, миранда-NG прекрасно работает через SSO по GSSAPI из коробки.
                              0
                              я уже себе документ сделал по опенфайру — по результатам первых блинов, которые комом. В UTF пришлось и на 3ей версии переделывать, иначе оффлайн сообщения на русском не доходили. После все заработало. Про Miranda-NG новость порадовала. Можете расписать плюсы/минусы в сравнении со спарком? как дела с авторизацией в Windows 7/8 (те что с UAC)? В особенности у локальных админов?
                                0
                                Миранду сравнивать со спраком… :) Ну спарк просто убогий по сравнению с ней. А с UAC все хорошо, что под админом, что под обычным юзером. Т.е. UAC вообще не запрашивается, как и должно быть. Миранде-NG даже krb5.ini и правка реестра не требуется.
                                  0
                                  Мирандой никогда не пользовался, сейчас попробовал — порадовал очень быстрый запуск и шустрый интерфейс. Без krb5.ini вроде и впрямь работает. Но есть и пара вопросов. Есть ли какой плагин для рассылки по базе контактов {All|Online|offline}? В спарке этот функционал использовался для оповещений. И если таки заводить интеграцию OpenFire с Asterisk в Spark есть плагин для превращения в Sip Phone. По WiKi справке плагинов миранды такого не увидел :(
                                    0
                                    Сам спросил — сам ответил. Нашел функционал рассылок. Осталось только Sip Phone, хотя нам он пока не актуален. Похоже пора делать MSI миранды.

                              Only users with full accounts can post comments. Log in, please.