Устанавливаем ejabberd Community Server 19.02 в операционных системах Ubuntu 16 и CentOS 7


Весь процесс будет состоять из следующих этапов:

установка

базовая настройка

интеграция с Active Directory (аутентификация и информация о пользователях)

настройка в качестве хранилища данных СУБД MySQL

создание SRV-записи на DNS-сервере


Установка


устанавливаем необходимые пакеты

CentOS

yum install glibc

Ubuntu

apt-get install inotify-tools

скачиваем установочный пакет

CentOS

curl -L https://www.process-one.net/downloads/downloads-action.php?file=/ejabberd/19.02/ejabberd-19.02-0.x86_64.rpm -o /tmp/ejabberd-19.02-0.x86_64.rpm

Ubuntu

curl -L https://www.process-one.net/downloads/downloads-action.php?file=/ejabberd/19.02/ejabberd_19.02-0_amd64.deb -o /tmp/ejabberd_19.02-0_amd64.deb

выполняем установку ejabberd

CentOS

yum localinstall /tmp/ejabberd-19.02-0.x86_64.rpm

Ubuntu

apt install /tmp/ejabberd_19.02-0_amd64.deb

запрещаем доступ к папкам /opt/bitrock, /opt/ejabberd, /opt/ejabberd-19.02 и их содержимому всем, кроме владельца

chmod -R go-rwx /opt/bitrock/*
chmod -R go-rwx /opt/ejabberd/*
chmod -R go-rwx /opt/ejabberd-19.02/*

включаем запуск ejabberd при старте системы

systemctl enable ejabberd


Базовая настройка


изменяем имя создаваемого при установке файла конфигурации /opt/ejabberd/conf/ejabberd.yml на ejabberd.yml.sample

mv /opt/ejabberd/conf/ejabberd.yml /opt/ejabberd/conf/ejabberd.yml.sample

создаем новый файл конфигурации /opt/ejabberd/conf/ejabberd.yml следующего содержания

## сохраняем в журнал предупреждения
loglevel: 3
 
## создаем новые файлы логов каждый день в полночь и храним их в течение 30 дней
log_rotate_size: 0
log_rotate_date: "$D0"
log_rotate_count: 30
 
## не сохраняем в журналах конфиденциальную информацию (ip-адреса и т.д.)
hide_sensitive_log_data: true
 
## FQDN сервера
fqdn: "domain.com"
 
## имя XMPP-домена
hosts: ["domain.com"]
 
## сертификат сервера
certfiles: ["/opt/ejabberd/conf/server.pem"]
 
## параметры прослушиваемых портов
listen: 
  - 
    port: 5222
    module: ejabberd_c2s
    access: c2s
    starttls_required: true
    protocol_options:
      - "no_sslv2"
      - "no_sslv3"
      - "no_tlsv1"
      - "no_tlsv1_1"
    ciphers: "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA"
    dhfile: "/opt/ejabberd/conf/dhparams.pem"
    zlib: true
    max_stanza_size: 65536
  -
    port: 5280
    module: ejabberd_http
    tls: true
    tls_compression: true
    dhfile: "/opt/ejabberd/conf/dhparams.pem"
    web_admin: true

## при попытке подключения ресурса с уже используемым другим ресурсом именем генерируем ему новое имя
resource_conflict: setresource
 
## используем внутреннюю аутентификацию
auth_method: internal
 
## списки контроля доступа
acl:
 
  admins:
    - user: "[email protected]"
 
  users:
    - user_regexp: ""
 
## правила доступа
access_rules:
 
  c2s:
    - allow: users
 
  configure:
    - allow: admins
 
## модули
modules: 
  mod_disco: {}
  mod_caps: {}
  mod_stream_mgmt:
    ack_timeout: 30
    resend_on_timeout: true
    resume_timeout: 60
  mod_ping:
    send_pings: true
    ping_interval: 5
    ping_ack_timeout: 15
    timeout_action: kill
  mod_carboncopy: {}
  mod_offline: {}
  mod_roster: {}
  mod_shared_roster: {}

Замечание 1: правило доступа "configure" используется для контроля доступа к веб-интерфейсу администрирования

Замечание 2: конфигурация включает минимальное количество модулей, необходимых для нормальной работы клиентов: модули mod_disco и mod_caps обеспечивают клиентам возможность получать от сервера информацию об опубликованных сервисах и поддерживаемого им функционала; mod_stream_mgmt и mod_ping осуществляют мониторинг активности соединений; mod_carboncopy выполняет рассылку копий сообщений всем приложениям пользователя (в случае, когда вход выполнен под одной учетной записью на нескольких устройствах); mod_offline отвечает за доставку оффлайн-сообщений; mod_roster и mod_shared_roster необходимы для работы списка контактов

удаляем создаваемые при установке файлы с сертификатом сервера, сертификатами публичных ЦС и DH-параметрами

rm /opt/ejabberd/conf/*.pem

создаем закрытый ключ и сертификат сервера (как это сделать, рассказывается здесь и здесь) и сохраняем их в файле /opt/ejabberd/server.pem

Замечание: при создании запроса на сертификат в качестве FQDN сервера указываем domain.com

создаем файл c DH-параметрами

openssl dhparam -out /opt/ejabberd/conf/dhparams.pem 4096

удаляем создаваемую при установке базу данных ejabberd

rm -r /opt/ejabberd/database/* -f

запускаем ejabberd

systemctl start ejabberd

регистрируем пользователей

/opt/ejabberd/bin/ejabberdctl register admin domain.com admin_password
/opt/ejabberd/bin/ejabberdctl register user1 domain.com user_password_1
/opt/ejabberd/bin/ejabberdctl register user2 domain.com user_password_2

используя учетные данные администратора проходим в веб-браузере по ссылке https://xmpp.domain.com:5280/admin, открываем раздел "Виртуальные хосты - domain.com - Группы общих контактов" и добавляем новую группу контактов с именем "All contacts"

щелкаем по группе контактов "All contacts" и указываем следующее

"Название" - "All Contacts"

"Члены" - "@all@"

"Видимые группы" - "All Contacts"

редактируем файл конфигурации для исключения пользователя admin из списка администраторов

acl:
  admins:
    - user: {}

удаляем учетную запись администратора

/opt/ejabberd/bin/ejabberdctl unregister admin domain.com

перезапускаем ejabberd

systemctl restart ejabberd

запускаем два XMPP-клиента, подключаемся к серверу с использованием учетных записей пользователей и пробуем отправить сообщения


Настройка интеграции с Active Directory


отключаем внутреннюю аутентификацию, для чего из файла конфигурации удаляем строки

## используем внутреннюю аутентификацию
auth_method: ldap

включаем аутентификацию Active Directory, для чего в файл конфигурации добавляем следующее

## используем аутентификацию Active Directory
auth_method: [ldap]
ldap_servers: ["dc.domain.com"]
ldap_port: 389
ldap_encrypt: none
ldap_rootdn: "cn=ejabberd,ou=special users,dc=domain,dc=com"
ldap_password: "ejabberd"
ldap_base: "ou=employees,dc=domain,dc=com"
ldap_filter: "(&(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(memberOf:1.2.840.113556.1.4.1941:=cn=ejabberd users,ou=local groups,dc=domain,dc=com))"
ldap_uids: ["sAMAccountName": "%u"]

Замечание 1: указанный LDAP-фильтр отбирает включенные учетные записи пользователей, входящих в группу "Ejabberd Users" и все дочерние подгруппы

Замечание 2: для выполнения проверки подлинности с использованием LDAPS необходимо включить его поддержку на контроллере домена (как это сделать, рассказывается здесь), а также выпустить для сервера сертификат, содержащий в альтернативном имени субъекта IP-адрес сервера

для заполнения карточек пользователей на основании данных каталога Active Directory добавляем в файл конфигурации

modules:
  mod_vcard:
    db_type: ldap
    ldap_vcard_map:
      "NICKNAME": {"%s": ["displayName"]}
      "FAMILY": {"%s": ["sn"]}
      "GIVEN": {"%s": ["givenName"]}
      "EMAIL": {"%s": ["mail"]}

перезапускаем ejabberd

systemctl restart ejabberd


Настройка в качестве хранилища данных СУБД MySQL


на MySQL-сервере создаем базу данных «ejabberd» и пользователя «ejabberd» с правами полного доступа к ней (как это сделать, можно прочитать здесь)

скачиваем необходимую ejabberd SQL-схему

curl -L https://raw.githubusercontent.com/processone/ejabberd/master/sql/mysql.new.sql -o /tmp/mysql.new.sql

загружаем SQL-схему в базу данных ejabberd

mysql -u root -p ejabberd < /tmp/mysql.new.sql

на ejabberd-сервере добавляем в файл конфигурации

## настройка MySQL
default_db: sql
sm_db_type: sql
sql_type: mysql
new_sql_schema: true
sql_server: "mysql.domain.com"
sql_port: 3306
sql_database: "ejabberd"
sql_username: "ejabberd"
sql_password: "some_password"

Замечание 1: в результате в базе данных MySQL будут храниться данные модулей, которые поддерживают MySQL, и информация о c2s-подключениях, однако, Mnesia все равно будет использоваться для некоторых задач

Замечание 2: после перехода с Mnesia на MySQL потребуется снова создать группу контактов "All Contacts"

перезапускаем ejabberd

systemctl restart ejabberd


Создание SRV-записи на DNS-сервере


на DNS-сервере провайдера услуги DNS-хостинга добавляем в зону «domain.com» запись со следующими параметрами

Name – _xmpp-client._tcp

Type – srv

Priority – 0

Weight – 5

Port – 5222

Target – xmpp

TTL – 3600

Замечание 1: в результате в настройках клиентов можно будет указывать только имя XMPP-домена, а сервер и порт подключения (в данном случае xmpp.domain.com и 5222 соответственно) будут определяться на основании данных в соответствующей DNS-зоне

Замечание 2: несмотря на то, что в такой конфигурации подключение будет выполняться к серверу xmpp.domain.com, в качестве субъекта сертификата сервера должно использоваться значение domain.com

Добавить комментарий