SCROLL
Среднее время на прочтение: 3 мин.

Настройка интеграции 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:

/etc/ejabberd/ejabberd.yml
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, указываем использование сгенерированного сертификата:

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

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

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

/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, укажем учетную запись администратора:

/etc/ejabberd/ejabberd.yml
acl:
  admin:
    user:
     - "superadmin"

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

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

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

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

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

/etc/ejabberd/ejabberd.yml
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:

/etc/ejabberd/ejabberd.yml
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, добавляем следующие строки:

/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 комментариев
  • Спасибо большое! Только после указания на рутовом уровне вот этого я смог зайти по 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

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

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

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

  • Здравствуйте, пробовал по вашей статье настроить 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

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

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

    • Это ответ на комментарий Александр

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

      • Это ответ на комментарий Жаконда

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

        • Это ответ на комментарий Александр

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

        • Это ответ на комментарий Жаконда

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

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

    • Это ответ на комментарий Максим

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