Настройка интеграции ejabberd 18.12.1 с Active Directory на Debian 9. Настройка SSO (Single Sign On) авторизации.

Продолжаю свое знакомство с XMPP-сервером, на базе ejabberd и реализацию задачи по организации достойного корпоративного мессенджера.

 

Рассмотрим как интегрировать ejabberd с Active Directory на базе (Windows Server 2012 R2), в частности возможность входа на XMPP-сервер по доменным учетным данным, формирование списка контактов (ростера) на основе пользовательских данных с Active Directory, загрузка пользовательских сведений в vCard из Active Directory, а так же рассмотрим вариант настройки SSO (Single Sign On) авторизации в ejabberd.

 

Исходные данные:

  • XMPP-сервер ejabberd 18.12.1 на Debian 9 (установленный по этой статье).
  • Домен (example.com) развернут на Windows Server 2012 R2 (развернутый по этой статье).

 

Настройка домена

В конфигурационном файле (/etc/ejabberd/ejabberd.yml), указываем обслуживаемый виртуальный домен, в моем примере это example.com:

hosts:
  - "example.com"

 

Создание сертификата

Для использования SSL, генерируем самоподписной сертификат, для обслуживаемого домена:

openssl req -new -x509 -nodes -newkey rsa:1024 -days 1825 -keyout private.key -out ejabberd.pem


## Common Name (e.g. server FQDN or YOUR name) []:example.com
Важно в процессе генерации сертификата, в поле Common Name, указать FQDN домена, для которого генерируется сертификат.

 

Далее добавляем приватный ключ к сертификату, назначает права на сертификат и перемещаем его для удобства в каталог установки ejabberd:

cat private.key >> ejabberd.pem 
chown root:ejabberd ejabberd.pem 
chmod 640 ejabberd.pem

mv ejabberd.pem /etc/ejabberd/ejabberd.pem
Приватный ключ private.key, можно удалить, так как мы его добавили к сертификату и надобности в нем больше нет

 

В конфигурационном файле (/etc/ejabberd/ejabberd.yml), указываем использование сгенерированного сертификата:

certfiles:
    - "/etc/ejabberd/ejabberd.pem"

 

Настройка LDAP соединения

В конфигурационном файле (/etc/ejabberd/ejabberd.yml), добавляем следующие строки:

ldap_servers:
  - "dc1.example.com"
ldap_port: 389
ldap_rootdn: "CN=ejabberd,OU=SystemUsers,DC=example,DC=com"
ldap_password: "Aa1234567"
ldap_base: "ou=ActiveUsers,dc=example,dc=com"
ldap_uids: ["sAMAccountName"]

auth_method:
  - ldap

Пояснения по строкам:

  • ldap_servers — указываем FQDN домен контроллера
  • ldap_port — используемый порт подключатся к Active Directory
  • ldap_rootdn — учетная запись пользователя через которого будет выполнятся просмотр Active Directory
  • ldap_password — пароль от учетной записи, указанной выше
  • ldap_base — указываем область поиска учетных записей
  • ldap_uids — указываем какие данные использовать в качестве JID идентификатора
  • auth_method — указываем какой метод аутентификации использовать

 

Так же в секции ACL, укажем учетную запись администратора:

acl:
  admin:
    user:
     - "superadmin"

 

Теперь можно подключится к домену @example.com, используя доменные учетные записи (прим. superadmin@example.com).

 

Настройка списка контактов LDAP

С авторизацией по доменным учетным записям разобрались, теперь для удобной работы нужно прокинуть всем пользователям контакты, всех сотрудников компании.

 

Для структурирования списка контактов по отделам, необходимо чтобы в свойствах пользователей были заполнены поля (Отдел). Для примера, приведу свойства одного из пользователей домена:

 

 

В конфигурационном файле (/etc/ejabberd/ejabberd.yml), в секции modules, добавляем описание модуля mod_shared_roster_ldap::

modules:
  mod_shared_roster_ldap:
    ldap_base: "ou=ActiveUsers,dc=example,dc=com"
    ldap_rfilter: "(objectClass=user)"
    ldap_groupattr: "department"
    ldap_groupdesc: "department"
    ldap_memberattr: "sAMAccountName"
    ldap_userdesc: "displayName"

Пояснения по строкам:

  • ldap_base — в какой области искать учетные записи пользователей
  • ldap_rfilter — фильтруем просмотр только в пользователях
  • ldap_groupattr — по какому параметру группировать контакты
  • ldap_groupdesc — из какого параметра брать название группы
  • ldap_memberattr — по какому параметру добавлять пользовательский контакт
  • ldap_userdesc — из какого параметра брать название контакта

 

В итоге после авторизации, список контактов предстанет в таком виде:

 

В списке контактов, все сотрудники компании будут находится в своих отделах, что заметно упростит поиск того или иного контакта для переписки.

 

Загрузка пользовательских сведений в vCard из LDAP

Последним шагом в интеграции ejabberd в корпоративную среду, у меня будет заполнение пользовательских данные vCard из данных Active Directory. Из свойств пользовательских учетных записей, будем брать нужную нам информацию и импортировать ее в vCard каждого пользователя.

 

В конфигурационном файле (/etc/ejabberd/ejabberd.yml), в секции modules, добавляем описание модуля mod_vcard:

modules:
  mod_vcard:
    db_type: ldap
    ldap_vcard_map:
      "NICKNAME": {"%s": ["displayName"]}
      "FAMILY": {"%s": ["sn"]}
      "GIVEN": {"%s": ["givenName"]}
      "FN": {"%s": ["displayName"]}
      "EMAIL": {"%s": ["mail"]}
      "ORGNAME": {"%s": ["company"]}
      "ORGUNIT": {"%s": ["department"]}
      "TITLE": {"%s": ["title"]}
      "TEL": {"%s": ["telephoneNumber"]}
    ldap_search_fields:
      "User": "%u"
      "Full Name": "displayName"
      "Given Name": "givenName"
      "Family Name": "sn"
      "Email": "mail"
      "Organization Name": "company"
      "Organization Unit": "department"
      "Title": "title"
      "Telephone": "telephoneNumber"
    ldap_search_reported:
      "Full Name": "FN"
      "Nickname": "NICKNAME"

Пояснения по строкам:

  • db_type — указываем какой тип данных будем использовать
  • ldap_vcard_map — сопоставляем поля в vCard и Active Directory
  • ldap_search_fields — определяем форму поиска и атрибуты Active Directory
  • ldap_search_reported — отображение контакта

 

В итоге в сведения о пользователе, будут автоматически взяты из Active Directory и будут выглядеть вот так:

 

Настройка SSO (Single Sign On) авторизации

Сервер ejabberd поддерживает SSO (Single Sign On) авторизацию, но к сожалению далеко не на все XMPP-клиентах можно воспользоваться данной функцией.

 

Я использую в качестве XMPP-клиента Miranda NG v0.95.10, она поддерживает SSO авторизацию.

 

Настройку SSO на Debian системе, я уже описывал в ЭТОЙ статье и они идентичны под текущую задачу. Выполняем все шаги в указанной статье (само собой изменяя такие данные как имя системы, имя служебного пользователя, доменное имя) до пункта «Настройка Apache (Debian 8 Jessie)».

 

Выставляем права на KEYTAB-файл:

chown root:ejabberd /etc/ejabberd/ejabberd.keytab
chmod 640 /etc/ejabberd/ejabberd.keytab

 

В конфигурационном файле (/etc/ejabberd/ejabberd.yml), добавляем следующие строки:

auth_method:
  - anonymous
  - ldap

allow_multiple_connections: true
anonymous_protocol: both

Пояснения по строкам:

  • auth_method — обязательно указываем несколько методов авторизации (anonymous, ldap), на случай если клиент не поддерживает SSO, чтобы всегда можно было авторизоваться обычным способом.
  • allow_multiple_connections — данная опция используется только когда включен anonymous режим. Она позволяет использовать одно и то же имя пользователя несколько раз в режиме anonymous входа, если для подключения используются разные ресурсы.
  • anonymous_protocol — указываем использование SASL Anonymous и Login anonymous для авторизации.

 

Перезапускаем eJabberd сервер:

service ejabberd restart

 

На примере XMPP-клиента Miranda NG v0.95.10, добавляем учетную запись XMPP и в поле «Домен/Сервер», указываем название домена, отмечает галочкой пункт «Доменный логин». Если все сделали правильно по инструкции, то авторизация будет осуществлена, без ввода имени пользователя и пароля.

 

ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОБЛАГОДАРИ АВТОРА

БесполезноСлабоватоПриемлемоОтличноПревосходно (Еще нет оценок)
Загрузка...

Всего комментариев: 13 Комментировать

  1. Максим /

    Добрый день! Все получилось, кроме SSO. У ejabberd крутится на винде, собственно, какие манипуляции надо произвести, чтобы заработало SSO?

    1. Жаконда / Автор записи

      Добрый день, не знаю, т.к. не разбирал такую связку на Windows

  2. Александр /

    Спасибо за статью, скажите а можно ли реализовать на ejabberd чат для корпоративной сети, а не месссенджер? Просто в данный момоент используется чат V-talking, но он имеет проблемы и недостатки, ищу ему алтернативу. А т.к. в сети больше половины машин по операционной системой Windows XP, то выбор не сильно большой.

    1. Жаконда / Автор записи

      Конечно можно, я собственно и делал для корпоративного общения. Единственный минус это отсутствие клиентов должных под него, если на ПК можно какой то единый найти, то вот для мобильных устройств все печальней, у тех кто использует Android, там есть замечательно приложение XABBER, а вот у кого Apple, то там все печально, имеющиеся приложения с поддержкой XMPP мало и все они ущербны..

      1. Александр /

        Я имел ввиду именно чат. Т.к. по умолчанию jabber сделан как мессенджер. У меня же пользователи привыкли к варианту когда есть общее поле общения и список контактов сбоку от окна.

        1. Жаконда / Автор записи

          Все верно, можно создавать Chatroom, с доступами и т.д. и т.д., в этом плане XMPP (ejabberd) хорош.

          1. Александр /

            Благодарю за быстрый ответ. Значит буду ставить и разбираться.

  3. Александр /

    Добрый день!
    Всё настроил как тут описано, всё работает. Вопрос: как сделать чтобы vcard брался ТОЛЬКО из LDAP? Чтобы пользователи не могли изменить свои данные в vcard.

  4. Akila /

    Здравствуйте, пробовал по вашей статье настроить SSO, но что-то никак не авторизуются клиенты при включенной галочке «доменный логин». В логе записи: @ejabberd_c2s:process_auth_result:276 (tls|) Failed c2s PLAIN authentication for user.u@domain.local from 192.168.x.54: Invalid username or password
    Без галочки все отлично работает
    Билет керберос
    kinit -kV -p ejabberd/server.domain.local
    Using default cache: /tmp/krb5cc_0
    Using principal: ejabberd/server.domain.local@DOMAIN.LOCAL
    Authenticated to Kerberos v5

  5. Алексей /

    Доброго времени суток, я в администрировании новичок, поставили задачу персональный корпоративный мессенджер поднять, сразу наткнулся на Ejabberd с его ерлангом и не понимаю куда все эти строчки вставлять в начало=середину или конец, Также воспользовался вашим гайдом по настройке и никак не могу дойти до конца:D, зачем нужен ssl(можете принцип объяснить, я уже не пойму когда сертификаты нужно на другие машины перекидывать, а когда нет), достаточно ли будет того чтобы debian и AD были в одной подсети или необходимо Debian в домен вводить. Спасибо.

  6. Иван /

    Здравствуйте. Аналогичная ситуация. Где то что то недосказано. Для gssapi есть патчи, но они старые. А авторизация типа SSO проходит скорей всего по anonymous.

  7. Denis /

    Добрый день.
    Кто-нибудь сталкивался с тем, когда включаешь SSO, перестает формироваться список Общих контактов из LDAP.
    auth_method:
    # — ldap
    — anonymous
    anonymous_protocol: both.
    Когда указано вот так:
    auth_method:
    — ldap
    — anonymous
    anonymous_protocol: both
    То LDAP Общая книга формируется. Но не работает SSO, только LDAP.
    Как можно гранулировано настроить SSO для авторизации пользователей, а LDAP для формирования книги контактов.

  8. emoxam /

    Спасибо большое! Только после указания на рутовом уровне вот этого я смог зайти по LDAP, но что самое главное я смогу видеть все свои LDAP контакты! До этого не видел!
    Если бы ещё СБП я б перевёл, ух перевёл бы!)

    ldap_servers:
    — «dc1.example.com»
    ldap_port: 389
    ldap_rootdn: «CN=ejabberd,OU=SystemUsers,DC=example,DC=com»
    ldap_password: «Aa1234567»
    ldap_base: «ou=ActiveUsers,dc=example,dc=com»
    ldap_uids: [«sAMAccountName»]

    auth_method:
    — ldap

Оставить ответ

одиннадцать − один =

© IT-блог Жаконды All Rights Reserved.
Яндекс.Метрика