Site icon 8HOST.COM

Установка Prosody в Ubuntu 18.04

Prosody – это чат-сервер XMPP, который поддерживает индивидуальные и групповые чаты, зашифрованные по TLS. XMPP (Extensible Messaging and Presence Protocol) – это открытый протокол обмена сообщениями, также известный как Jabber. Чаты XMPP позволяют любому клиенту подключиться к серверу Prosody и начать общение.

XMPP – зрелый открытый стандарт, поддерживаемый Internet Engineering Task Force (IETF). Он активно развертывается во многих приложениях (например Google Talk, которым пользуются миллионы пользователей). Серверы XMPP, такие как Prosody – это гибкие чат-серверы, которые существуют уже более двух десятилетий.

В этом мануале мы установим и настроим сервер Prosody, который поддерживает индивидуальные и групповые сеансы, а также предоставляет возможность загружать файлы в панель чата. Все сеансы чата будут защищены криптографическим сертификатом TLS, поэтому ваши личные данные будут под защитой.

Требования

Войдите на свой сервер как пользователь sudo и приступайте к работе.

1: Установка Prosody

Сейчас мы добавим пользовательский APT репозиторий Prosody на свой сервер, а затем установите из него пакет Prosody. Репозиторий Prosody обеспечивает установку самых последних версий пакетов.

Сначала создайте и откройте новый файл репозитория в текстовом редакторе. Этот файл содержит информацию о репозитории Prosody для менеджера пакетов APT:

sudo nano /etc/apt/sources.list.d/prosody.list

Добавьте в файл следующую строку:

deb https://packages.prosody.im/debian bionic main

Теперь нужно загрузить и установить открытый APT ключ Prosody. Ваш сервер будет использовать его, чтобы подтвердить, что пакет Prosody создан командой Prosody и не был подделан.

Следующая команда использует утилиту wget для загрузки ключа в текущий каталог:

wget https://prosody.im/files/prosody-debian-packages.key

Используйте команду apt-key add, чтобы добавить ключ Prosody в связку ключей APT:

sudo apt-key add prosody-debian-packages.key

Теперь вы можете удалить ключ, поскольку он больше не нужен:

rm prosody-debian-packages.key

Обновите базу пакетов вашего сервера, чтобы она включила более новые версии из репозитория Prosody:

sudo apt update

Теперь вы готовы к установке серверного пакета Prosody и некоторых дополнительных опциональных пакетов:

sudo apt install prosody prosody-modules lua-dbi-sqlite3 lua-event

Мы установили следующие пакеты:

Итак, мы завершили установку Prosody. На следующем этапе мы получим два сертификата TLS, которые Prosody будет использовать для шифрования данных при передаче через интернет на сервер Prosody и обратно.

2: Получение TLS-сертификатов

Prosody использует сертификаты TLS для шифрования соединений между сервером и клиентами. Это те же сертификаты, которые вы используете каждый раз, когда посещаете веб-сайт с URL-адресом HTTPS. Let’s Encrypt – это некоммерческая организация, которая бесплатно предоставляет сертификаты TLS. Этот центр сертификации создал служебную программу certbot для получения сертификатов и управления ими. Давайте установим утилиту certbot и воспользуемся ею для получения пары сертификатов (для двух имен хостов, которые вы указали согласно требованиям к мануалу).

Установите certbot из Ubuntu PPA репозитория Let’s Encrypt, чтобы получить самые свежие пакеты.

Сначала выполните следующую команду, чтобы добавить нужный репозиторий:

sudo add-apt-repository ppa:certbot/certbot

Теперь установите certbot:

sudo apt install certbot

Затем откройте HTTP-трафик в брандмауэре UFW, чтобы certbot мог проверить ваши права на сертификаты:

sudo ufw allow http

Выполните следующую команду certbot, которая получит сертификат для одного из ваших имен хоста:

sudo certbot certonly --standalone --agree-tos --email your_email -d chat.your-domain

Мы использовали в команде такие опции:

Когда вы запустите эту команду, клиент спросит вас, хотите ли вы поделиться своим адресом электронной почты с Electronic Frontier Foundation (это опционально). После этого регистрация сертификата продолжится, а на экране появится такой вывод:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/chat.your-domain/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/chat.your-domain/privkey.pem
Your cert will expire on 2020-07-26. To obtain a new or tweaked
version of this certificate in the future, simply  run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
Donating to EFF:                    https://eff.org/donate-le

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

Теперь у вас есть два каталога:

Они содержат файлы сертификатов и ключей для ваших имен хостов.

Поскольку сервер Prosody не запускается от имени пользователя root, права собственности и права доступа к каталогам и ключам необходимо изменить, чтобы сервер Prosody мог их читать и использовать.

Права доступа к файлам и каталогам в Linux позволяют контролировать, какие пользователи и процессы могут читать, писать и выполнять каталоги и папки. Этот аспект управления защищает систему от несанкционированных изменений, а конфиденциальные файлы (к которым относится и закрытый ключ TLS) – от прочтения неавторизованными пользователями.

Читайте также: Привилегии в Linux: что это и как с этим работать

Первый шаг – изменить владельца группы закрытых ключей; передайте эти права группе сервера Prosody с помощью следующих команд:

sudo chgrp prosody /etc/letsencrypt/live/room.your-domain/privkey.pem
sudo chgrp prosody /etc/letsencrypt/live/chat.your-domain/privkey.pem

Утилита chgrp изменяет группу-владельца файлов и каталогов. Только что вы отняли права на группу у root (по умолчанию) и передали их группе prosody.

Затем измените права на каталоги, содержащие файлы сертификатов TLS, на 0755. Эти каталоги принадлежат пользователю и группе root. Следующая команда изменит права доступа к этим каталогам:

sudo chmod 0755 /etc/letsencrypt/archive
sudo chmod 0755 /etc/letsencrypt/live

Новые права (0755) сообщают, что пользователь root может читать, изменять и выполнять эти каталоги. Члены группы root имеют права на чтение и выполнение. Все остальные пользователи и группы в системе имеют права на чтение и выполнение.

Теперь измените права закрытых ключей TLS:

sudo chmod 0640 /etc/letsencrypt/live/room.your-domain/privkey.pem
sudo chmod 0640 /etc/letsencrypt/live/chat.your-domain/privkey.pem

Значение 0640 для этих файлов сообщает, что пользователь root имеет права на чтение и запись; а члены группы prosody имеют права на чтение. В группе prosody есть один член – пользователь prosody. Это пользователь, от имени которого работает сервер Prosody, и от его же имени сервер будет обращаться к файлу. У всех остальных пользователей системы нет разрешения на доступ к файлу.

Эти две команды используют утилиту chmod, которая определяет, какие пользователи и группы имеют права на чтение, запись и выполнение файлов и каталогов.

Вы можете проверить, может ли Prosody читать файлы закрытых ключей, используя cat:

sudo -u prosody cat /etc/letsencrypt/live/chat.your-domain/privkey.pem

Если все прошло успешно, вы увидите содержимое ключа на вашем экране.

Для шифрования соединений загрузки и скачивания файлов Prosody использует один файл, содержащий сертификат и закрытый ключ. Этот файл не создается клиентом certbot автоматически, поэтому вы должны создать его вручную.

Сначала перейдите в каталог, содержащий файлы ключей и сертификатов, а затем с помощью cat объедините их содержимое в новый файл key-and-cert.pem:

cd /etc/letsencrypt/live/chat.your-domain/
sudo sh -c 'cat privkey.pem fullchain.pem >key-and-cert.pem'

Начало этой команды, sudo sh -c, открывает новую подоболочку, которая имеет права пользователя root и поэтому может записать новый файл в /etc/letsencrypt/live/chat.your-domain/.

Теперь передайте права на этот файл, чтобы они совпадали с правами, которые вы установили для другого файла закрытого ключа. Это делается с помощью следующей команды:

sudo chmod 0640 key-and-cert.pem
sudo chgrp prosody key-and-cert.pem

Перейдите в домашний каталог вашего пользователя:

cd

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

Клиент certbot использует хуки; это механизм, который позволяет запускать сценарий до или после обновления сертификата. Вы можете использовать его после каждого обновления сертификата для запуска сценария, который воссоздает запущенную вами команду.

Откройте новый скрипт /etc/letsencrypt/renewal-hooks/post/key-and-cert-combiner.sh в текстовом редакторе:

sudo nano /etc/letsencrypt/renewal-hooks/post/key-and-cert-combiner.sh

Затем добавьте в редактор следующее:

#!/usr/bin/env bash
set -e
# combines the certificate and key into a single file with cat
cat /etc/letsencrypt/live/chat.your-domain/privkey.pem \
/etc/letsencrypt/live/chat.your-domain/fullchain.pem \
>/etc/letsencrypt/live/chat.your-domain/key-and-cert.pem

Этот сценарий Bash состоит из таких частей:

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

sudo chmod +x /etc/letsencrypt/renewal-hooks/post/key-and-cert-combiner.sh

Опция +X дает скрипту права на выполнение.

Затем проверьте, правильно ли установлены сертификаты и работает ли хук после обновления. Для этого выполните следующую команду certbot:

sudo certbot renew --dry-run

Эта команда сообщает certbot о необходимости обновления сертификатов, но параметр –dry-run запрещает certbot вносить какие-либо изменения. Если все прошло успешно, вы увидите следующий результат:

Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/chat.your-domain/fullchain.pem (success)
/etc/letsencrypt/live/room.your-domain/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Running post-hook command: /etc/letsencrypt/renewal-hooks/post/key-and-cert-combiner.sh

Теперь у вас есть сертификаты TLS для вашего сервера Prosody. На следующем шаге вы отредактируете основной файл конфигурации Prosody.

3: Настройка Prosody

Prosody имеет множество параметров конфигурации, и это отражается в на размере основного конфигурационного файла /etc/prosody/prosody.cfg.lua. Чтобы разобраться было проще, рекомендуем работать с начала файла и постепенно опускаться ниже, внося в него правки.

Перед тем как вы начнете редактировать этот большой файл, рекомендуем также сделать его резервную копию, чтобы у вас был оригинал, который поможет в случае ошибки восстановить исходные настройки. Сделайте копию файла с помощью команды cp:

sudo cp /etc/prosody/prosody.cfg.lua /etc/prosody/prosody.cfg.lua.original

Теперь у вас есть копия исходного файла в /etc/prosody/prosody.cfg.lua.original.

Затем откройте конфигурационный файл в текстовом редакторе:

sudo nano /etc/prosody/prosody.cfg.lua

В следующих разделах мы последовательно описали изменения конфигурации.

Создание администратора

Администраторы Prosody – это пользователи, которые могут вносить изменения в сервер Prosody из своего чата, отправлять сообщения всем пользователям и выполнять другие действия, требующие повышенных привилегий.

Администраторы сервера Prosody устанавливаются при помощи следующей строки:

...
admins = { }
...

В этой строке пользователь admin будет добавлен на условный сервер serverchat.your-domain:

...
admins = { "admin@chat.your-domain" }
...

Если вы хотите добавить еще одного пользователя, вы должны поставить запятую после первого:

...
admins = { "admin@chat.your-domain", "8host@chat.your-domain" }
...

Включение модулей Prosody

Разработчики Prosody добавили множество функций в виде модулей, которые можно включить или отключить.

Модуль активируется путем удаления предшествующего ему символа –. Например, так модуль tls будет отключен:

--"tls"; -- Add support for secure TLS on c2s/s2s connections

А вот так – включен:

"tls"; -- Add support for secure TLS on c2s/s2s connections

Вот так выглядит раздел модулей в конфигурационном файле Prosody (отредактированные строки выделены красным):

...
modules_enabled = {
-- Generally required
"roster"; -- Allow users to have a roster. Recommended ;)
"saslauth"; -- Authentication for clients and servers. Recommended if you want to log in.
"tls"; -- Add support for secure TLS on c2s/s2s connections
"dialback"; -- s2s dialback support
"disco"; -- Service discovery
-- Not essential, but recommended
"carbons"; -- Keep multiple clients in sync
"pep"; -- Enables users to publish their avatar, mood, activity, playing music and more
"private"; -- Private XML storage (for room bookmarks, etc.)
"blocklist"; -- Allow users to block communications with other users
"vcard4"; -- User profiles (stored in PEP)
"vcard_legacy"; -- Conversion between legacy vCard and PEP Avatar, vcard
-- Nice to have
"version"; -- Replies to server version requests
"uptime"; -- Report how long server has been running
"time"; -- Let others know the time here on this server
"ping"; -- Replies to XMPP pings with pongs
"register"; -- Allow users to register on this server using a client and change passwords
"mam"; -- Store messages in an archive and allow users to access it
"csi_simple"; -- Simple Mobile optimizations
-- Admin interfaces
"admin_adhoc"; -- Allows administration via an XMPP client that supports ad-hoc commands
--"admin_telnet"; -- Opens telnet console interface on localhost port 5582
-- HTTP modules
--"bosh"; -- Enable BOSH clients, aka "Jabber over HTTP"
--"websocket"; -- XMPP over WebSockets
"http_files"; -- Serve static files from a directory over HTTP
"http_upload"; -- Enables file sharing between users
-- Other specific functionality
--"limits"; -- Enable bandwidth limiting for XMPP connections
"groups"; -- Shared roster support
--"server_contact_info"; -- Publish contact information for this service
"announce"; -- Send announcement to all online users
--"welcome"; -- Welcome users who register accounts
--"watchregistrations"; -- Alert admins of registrations
--"motd"; -- Send a message to users when they log in
--"legacyauth"; -- Legacy authentication. Only used by some old clients and bots.
--"proxy65"; -- Enables a file transfer proxy service which clients behind NAT can use
}
...

Включенные нами модули делают следующее:

Настройка хранилища базы данных

Следующий раздел, который нужно отредактировать, устанавливает, где Prosody сохраняет сообщения пользователей и другие данные. По умолчанию для этого используются текстовые файлы, но лучше сохранять сообщения в базе данных.

Prosody предлагает три варианта баз данных; MySQL, PostgreSQL и SQLite.

Читайте также: Краткий обзор реляционных систем управления базами данных

SQLite проще всего настроить и поддерживать, также она использует минимум ресурсов и подходит для небольших развертываний.

Включите следующие две строки, удалив символы –, как показано ниже:

...
storage = "sql" -- Default is "internal"
...
sql = { driver = "SQLite3", database = "prosody.sqlite" } -- Default. 'database' is the filename.
...

Архивирование сообщений

Вы можете установить, как долго сервер будет хранить старые сообщения чата, отредактировав следующую строку:

...
archive_expires_after = "1w" -- Remove archived messages after 1 week
...

По умолчанию установлена 1 неделя (1w). Используйте d для указания количества дней, w для недель и y – для лет.

Шифрование загрузки и скачивания файлов

Строка https_certificate сообщает Prosody, где искать комбинированный сертификат и ключ, который вы создали ранее, чтобы использовать его для передачи файлов.

Отредактируйте настройки так, чтобы они включали путь к этому файлу:

...
https_certificate = "/etc/letsencrypt/live/chat.your-domain/key-and-cert.pem"
...

Удаление localhost

В конфигурации по умолчанию Prosody прослушивает локальный хост (или 127.0.0.1) для соединения чатов. Это не нужно на удаленном сервере.

Отключите это поведение, добавив — в следующую строку, после редактирования она должна выглядеть следующим образом:

...
--VirtualHost "localhost"
...

Изменение максимального размера загружаемого файла

Ваш сервер Prosody поддерживает обмен файлами между пользователями, прикрепляя файлы к окнам чата. По умолчанию максимальный размер файлов, которыми можно делиться, составляет 1 МБ.

Установите более высокое значение, добавив следующую строку в конец конфигурации:

...
http_upload_file_size_limit = 10485760
...

Число в конце строки – это максимальный размер файла в байтах. Показанный здесь размер составляет 10485760 байт или 10 МБ. На веб-сайте GbMb есть удобный инструмент для преобразования мегабайт в байты.

Если вы хотите разрешить загрузку файлов размером более 10 МБ, вы должны добавить еще одну строку, которая устанавливает переменную http_max_content_size. Ее значение должно быть больше максимального размера загружаемого файла.

В этом примере максимальный размер файла установлен на 20 МБ (20971520 байт), а http_max_content_size установлен на 30 МБ:

...
http_upload_file_size_limit = 20971520
http_max_content_size = 31457280
...

Рекомендуем установить http_max_content_size на 50% больше максимального размера файла.

Настройка файла groups

Модуль groups, который вы включили в разделе модулей, позволяет клиентам чата видеть друг друга.

Модуль groups читает файл, содержащий имена групп и их членов. Задайте расположение и имя файла, добавив следующую строку в конец конфигурации:

...
groups_file = "/etc/prosody/sharedgroups.txt"
...

Эта строка настраивает сервер Prosody для чтения файла в /etc/prosody/sharedgroups.txt (в нем можно собрать информацию о группе). Вы заполните этот файл в разделе 4.

Сейчас просто создайте этот файл с помощью следующей команды в другом терминале:

sudo touch /etc/prosody/sharedgroups.txt

Утилита touch создает пустой файл (если не используются дополнительные параметры).

Добавление конфигурации виртуального хоста для чат-сервера

Prosody использует блок конфигурации, который начинается с VirtualHost, чтобы запустить чат-сервер, который использует ваше имя хоста.

Добавьте следующий блок конфигурации в конец текущих настроек:

...
VirtualHost "chat.your-domain"
ssl = {
key = "/etc/letsencrypt/live/chat.your-domain/privkey.pem";
certificate = "/etc/letsencrypt/live/chat.your-domain/fullchain.pem";
}
...

Мы использовали такие опции:

Добавление чат-сервера

Эта конфигурация позволяет Prosody поддерживать многопользовательские чаты. Добавьте следующий блок конфигурации в конец файла в новом разделе:

...
Component "room.your-domain" "muc"
modules_enabled = { "mam_muc"; }
storage = { muc_log = "sql"; }
ssl = {
key = "/etc/letsencrypt/live/room.your-domain/privkey.pem";
certificate = "/etc/letsencrypt/live/room.your-domain/fullchain.pem";
}
...

Мы использовали такие опции:

Сохраните и выйдите из редактора.

Теперь перезапустите Prosody, чтобы обновить конфигурацию:

sudo systemctl restart prosody.service

Вы завершили редактирование главной конфигурации Prosody. Теперь мы создадим пользователя Prosody и добавим его в группу.

4: Добавление пользователей и групп Prosody

Вы должны добавить пользователей Prosody на свой сервер с помощью командной строки, после чего они смогут войти в систему. Для управления сервером Prosody используйте инструмент prosodyctl, поставляемый с пакетом prosody по умолчанию.

Используйте следующую команду prosodyctl, чтобы добавить нового пользователя:

sudo prosodyctl register 8host chat.your-domain password

Теперь этот пользователь может подключиться к вашему серверу Prosody.

Ваши пользователи оценят, если вы создадите несколько групп, которые позволят им видеть друг друга и свой статус. Чтобы сделать это, создайте группы и добавьте в них пользователей с помощью файла groups, который вы определили ранее.

Откройте файл:

sudo nano /etc/prosody/sharedgroups.txt

Группа определяется путем помещения ее названия в квадратные скобки. Члены группы помещаются в новую строку под названием группы. Вы можете создать столько групп, сколько захотите, и пользователи могут быть членами нескольких групп одновременно.

Вот, например, группа Everyone, в которую входят два участника: 8host и admin.

[Everyone] 8host@chat.your-domain
admin@chat.your-domain

Все члены одной группы смогут видеть других, вне зависимости от того, подключены они к сети или нет.

Вы должны перезапускать сервер Prosody каждый раз, когда добавляете новых пользователей или изменяете информацию о группе:

sudo systemctl restart prosody.service

Сервер почти готов, нам осталось только разблокировать сервер Prosody в брандмауэре, что мы и сделаем в следующем разделе.

5: Настройка брандмауэра

Prosody прослушивает соединения от клиентов на TCP-портах 5222 и 5322. Используйте следующую команду, чтобы открыть эти порты в UFW:

sudo ufw allow 5222,5322/tcp

Сервер prosody теперь полностью готов к работе.

Теперь мы можем подключиться к серверу Prosody с помощью чат-клиента. Далее мы настроим клиент XMPP в своей локальной системе или на смартфоне для подключения к серверу Prosody.

6: Настройка клиента чата XMPP

Давайте настроим соединение между своим клиентом XMPP и сервером Prosody. Для подключения вам нужно будет ввести свое имя пользователя, имя хоста сервера и пароль.

Сервер Prosody настроен на использование стандартных портов XMPP, и шифрование TLS будет обеспечено автоматически, поэтому вам не нужно выполнять дополнительную настройку.

Различные клиенты чата могут запрашивать имя пользователя, пароль и имя хоста сервера в разных форматах. Имя пользователя и хоста иногда объединяются как адрес электронной почты, например 8host@chat.your-domain. Электронный адрес может называться Username или XMPP Address.

Клиенты PSI требуют ввода имени пользователя и хоста в форме адреса электронной почты. А Gajim предоставляет для имени пользователя и имени хоста отдельные поля.

Клиенты XMPP не нуждаются в каких-либо дополнительных данных, они требуют только имя пользователя, пароль и имя хоста для входа в систему. После входа в систему вы сможете найти других членов чат-группы, а также создавать групповые чаты (если это поддерживается вашим клиентом).

Заключение

В этом мануале вы настроили сервер Prosody, который поддерживает:

Вы также настроили клиент XMPP для использования всех этих функций, что предоставляет вам многофункциональный чат с друзьями и коллегами.

Читайте также: