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

в 10:56, , рубрики: active directory, Debian, jabber, kerberos, ldap, openfire, SSO, windows, Песочница, метки: , , , , , , ,

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

Хочу поделиться опытом установки сервера 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.
Меняем владельца:

# chown -R openfire:openfire /var/lib/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
        krb4_config = /etc/krb.conf
        krb4_realms = /etc/krb.realms
        kdc_timesync = 1
        ccache_type = 4
        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
        v4_instance_resolve = false
        v4_name_convert = {
                host = {
                        rcmd = host
                        ftp = ftp
                }
                plain = {
                        something = something-else
                }
        }
        fcc-mit-ticketflags = true
[realms]
        REALM.LOCAL = {
                kdc = realm.local
                admin_server = realm.local
                default_domain = REALM.LOCAL
        }
        ATHENA.MIT.EDU = {
                kdc = kerberos.mit.edu:88
                kdc = kerberos-1.mit.edu:88
                kdc = kerberos-2.mit.edu:88
                admin_server = kerberos.mit.edu
                default_domain = mit.edu
        }
        MEDIA-LAB.MIT.EDU = {
                kdc = kerberos.media.mit.edu
                admin_server = kerberos.media.mit.edu
        }
        ZONE.MIT.EDU = {
                kdc = casio.mit.edu
                kdc = seiko.mit.edu
                admin_server = casio.mit.edu
        }
        MOOF.MIT.EDU = {
                kdc = three-headed-dogcow.mit.edu:88
                kdc = three-headed-dogcow-1.mit.edu:88
                admin_server = three-headed-dogcow.mit.edu
        }
        CSAIL.MIT.EDU = {
                kdc = kerberos-1.csail.mit.edu
                kdc = kerberos-2.csail.mit.edu
                admin_server = kerberos.csail.mit.edu
                default_domain = csail.mit.edu
                krb524_server = krb524.csail.mit.edu
        }
        IHTFP.ORG = {
                kdc = kerberos.ihtfp.org
                admin_server = kerberos.ihtfp.org
        }
        GNU.ORG = {
                kdc = kerberos.gnu.org
                kdc = kerberos-2.gnu.org
                kdc = kerberos-3.gnu.org
                admin_server = kerberos.gnu.org
        }
        1TS.ORG = {
                kdc = kerberos.1ts.org
                admin_server = kerberos.1ts.org
        }
        GRATUITOUS.ORG = {
                kdc = kerberos.gratuitous.org
                admin_server = kerberos.gratuitous.org
        }
        DOOMCOM.ORG = {
                kdc = kerberos.doomcom.org
                admin_server = kerberos.doomcom.org
        }
        ANDREW.CMU.EDU = {
                kdc = kerberos.andrew.cmu.edu
                kdc = kerberos2.andrew.cmu.edu
                kdc = kerberos3.andrew.cmu.edu
                admin_server = kerberos.andrew.cmu.edu
                default_domain = andrew.cmu.edu
        }
        CS.CMU.EDU = {
                kdc = kerberos.cs.cmu.edu
                kdc = kerberos-2.srv.cs.cmu.edu
                admin_server = kerberos.cs.cmu.edu
        }
        DEMENTIA.ORG = {
                kdc = kerberos.dementix.org
                kdc = kerberos2.dementix.org
                admin_server = kerberos.dementix.org
        }
        stanford.edu = {
                kdc = krb5auth1.stanford.edu
                kdc = krb5auth2.stanford.edu
                kdc = krb5auth3.stanford.edu
                master_kdc = krb5auth1.stanford.edu
                admin_server = krb5-admin.stanford.edu
                default_domain = stanford.edu
        }
        UTORONTO.CA = {
                kdc = kerberos1.utoronto.ca
                kdc = kerberos2.utoronto.ca
                kdc = kerberos3.utoronto.ca
                admin_server = kerberos1.utoronto.ca
                default_domain = utoronto.ca
        }
[domain_realm]
        .mit.edu = ATHENA.MIT.EDU
        mit.edu = ATHENA.MIT.EDU
        .media.mit.edu = MEDIA-LAB.MIT.EDU
        media.mit.edu = MEDIA-LAB.MIT.EDU
        .csail.mit.edu = CSAIL.MIT.EDU
        csail.mit.edu = CSAIL.MIT.EDU
        .whoi.edu = ATHENA.MIT.EDU
        whoi.edu = ATHENA.MIT.EDU
        .stanford.edu = stanford.edu
        .slac.stanford.edu = SLAC.STANFORD.EDU
        .toronto.edu = UTORONTO.CA
        .utoronto.ca = UTORONTO.CA
        .realm.local = REALM.LOCAL
        realm.local = REALM.LOCAL
[login]
        krb4_convert = true
        krb4_get_tickets = false

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:Windowskrb5.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)Javajre6bin>
C:Program Files (x86)Javajre6bin>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)Javajre6bin>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 сервере файл etcopenfiregss.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_MACHINESystemCurrentControlSetControlLsaKerberosParameters
(For XP: HKEY_LOCAL_MACHINESystemCurrentControlSetControlLsaKerberos)
добавляем параметр типа DWORD
AllofTGTSessionKey со значением 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.

Удачи!

По мере освоения продукта следует продолжение…

Автор: zseed

Источник

  1. obtim:

    В 13-ом пункте у меня выдает ошибку при выполнении
    ktpass -princ xmpp/svr-im.clinica.local@CLINICA.LOCAL -mapuser xmpp-openfire@clinica.local -pass * -ptype KRB5_NT_PRINCIPAL

    Выдает
    Password set failed! 0x00000020
    Aborted.

    У меня домен clinica.local

    В чем может быть ошибка?

  2. obtim:

    Где должен лежать файл etcopenfiregss.conf на Дебиане?

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js