Содержание статьи:
Продолжаю свое знакомство с 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
Далее добавляем приватный ключ к сертификату, назначает права на сертификат и перемещаем его для удобства в каталог установки ejabberd:
cat private.key >> ejabberd.pem chown root:ejabberd ejabberd.pem chmod 640 ejabberd.pem mv ejabberd.pem /etc/ejabberd/ejabberd.pem
В конфигурационном файле (/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 и в поле «Домен/Сервер», указываем название домена, отмечает галочкой пункт «Доменный логин». Если все сделали правильно по инструкции, то авторизация будет осуществлена, без ввода имени пользователя и пароля.
ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОДДЕРЖИ АВТОРА ДОНАТОМ
Добрый день! Все получилось, кроме SSO. У ejabberd крутится на винде, собственно, какие манипуляции надо произвести, чтобы заработало SSO?
Добрый день, не знаю, т.к. не разбирал такую связку на Windows
Спасибо за статью, скажите а можно ли реализовать на ejabberd чат для корпоративной сети, а не месссенджер? Просто в данный момоент используется чат V-talking, но он имеет проблемы и недостатки, ищу ему алтернативу. А т.к. в сети больше половины машин по операционной системой Windows XP, то выбор не сильно большой.
Конечно можно, я собственно и делал для корпоративного общения. Единственный минус это отсутствие клиентов должных под него, если на ПК можно какой то единый найти, то вот для мобильных устройств все печальней, у тех кто использует Android, там есть замечательно приложение XABBER, а вот у кого Apple, то там все печально, имеющиеся приложения с поддержкой XMPP мало и все они ущербны..
Я имел ввиду именно чат. Т.к. по умолчанию jabber сделан как мессенджер. У меня же пользователи привыкли к варианту когда есть общее поле общения и список контактов сбоку от окна.
Все верно, можно создавать Chatroom, с доступами и т.д. и т.д., в этом плане XMPP (ejabberd) хорош.
Благодарю за быстрый ответ. Значит буду ставить и разбираться.
Добрый день!
Всё настроил как тут описано, всё работает. Вопрос: как сделать чтобы vcard брался ТОЛЬКО из LDAP? Чтобы пользователи не могли изменить свои данные в vcard.
Здравствуйте, пробовал по вашей статье настроить 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
Доброго времени суток, я в администрировании новичок, поставили задачу персональный корпоративный мессенджер поднять, сразу наткнулся на Ejabberd с его ерлангом и не понимаю куда все эти строчки вставлять в начало=середину или конец, Также воспользовался вашим гайдом по настройке и никак не могу дойти до конца:D, зачем нужен ssl(можете принцип объяснить, я уже не пойму когда сертификаты нужно на другие машины перекидывать, а когда нет), достаточно ли будет того чтобы debian и AD были в одной подсети или необходимо Debian в домен вводить. Спасибо.
Здравствуйте. Аналогичная ситуация. Где то что то недосказано. Для gssapi есть патчи, но они старые. А авторизация типа SSO проходит скорей всего по anonymous.
Добрый день.
Кто-нибудь сталкивался с тем, когда включаешь SSO, перестает формироваться список Общих контактов из LDAP.
auth_method:
# — ldap
— anonymous
anonymous_protocol: both.
Когда указано вот так:
auth_method:
— ldap
— anonymous
anonymous_protocol: both
То LDAP Общая книга формируется. Но не работает SSO, только LDAP.
Как можно гранулировано настроить SSO для авторизации пользователей, а LDAP для формирования книги контактов.
Спасибо большое! Только после указания на рутовом уровне вот этого я смог зайти по 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