Устанавливаем 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