Веб-сайт самохостера Lotigara

Pubnix - Установка Prosody с PAM-авторизацией

Использованные источники

0. Системные требования


0,5. Авторизация при помощи ОС

PAM (Pluggable Authentication Modules) - API для авторизации в Unix-подобных ОС, по умолчанию использует список пользователей из файла `/etc/passwd`.

Все команды выполняются пользователем root, если не указано иначе.

1. Установка

Выполните эти команды:

# Установить Prosody
wget https://prosody.im/files/prosody.sources -O/etc/apt/sources.list.d/prosody.sources
apt update
apt install prosody lua5.4 liblua5.4-0 liblua5.4-dev luarocks
# Добавить привилегии демону Prosody
usermod -aG shadow prosody
usermod -aG ssl-cert prosody
# Установить библиотеку для взаимодействия с POSIX-функциями
luarocks install luaposix
# Собрать библиотеку дл/ PAM-аутентификации
git clone https://github.com/devurandom/lua-pam && cd lua-pam
make LUA_VERSION=5.4
cp pam.so /usr/lib/
# Установить модуль для PAM-аутентификации
LUA_INCDIR=5.4 prosodyctl install --server=https://modules.prosody.im/rocks/ mod_auth_pam

2. Настройка

Начните редактировать файл /etc/prosody/prosody.cfg.lua. Следуйте этим инструкциям, заменяя example.net на доменное имя, привязанное к вашему серверу.

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

admins = { "admin@example.net" }

Где admin - это ваше имя пользователя в вашей системе.

Дальше найдите строку --"mam"; и удалите два дефиса, сделайте то же самое с строкой --"turn_external";, находящейся ниже.

Теперь перейдите к строке authentication = "internal_hashed" и замените internal_hashed на pam.

Перейдите к строке, начинающейся с storage и поменяйте sql на internal (по желанию, в этой инструкции я не рассматриваю настройку с базами данных)

По желанию в строке archive_expires_after = "1w" замените 1w на never, чтобы истории переписок не удалялись каждую неделю.

Найдите строку, начинающуюся с VirtualHost и замените localhost на example.net.

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

Component "conference.example.net" "muc"
modules_enabled = { "muc_mam", "vcard_muc" }

Последнюю строку можете опустить, если вам не нужно сохранение истории многопользовательских переписок.

Если нужна возможность загружать файлы на ваш сервер, дополните конфигурацию следующими строками:

Component "upload.example.net" "http_file_share"
http_file_share_size_limit = 512 * 1024 * 1024 --измеряется в байтах
http_file_share_expire_after = 60 * 60 * 24 * 31 * 1000 --измеряется в секундах

В данном случае, лимит размера файла - это 512 МиБ (0,5 ГиБ), а удаляться файлы будут через ~1000 лет. Если требуется изменить какое-либо из этих свойств, смотрите комментарии (в Lua они начинаются с двух дефисов) и пробуйте изменять значения.

3. Настройка TLS-сертификата

Также заменяйте `example.net` на ваше доменное имя.

ACME (Automatic Certificate Management Environment) - это протокол для получения TLS-сертификатов по Web. В этом примере используется ACME-клиент acme.sh, так как эта программа более настраиваемая и удостоверяющий центр (далее УЦ) Let's Encrypt (но вы можете использовать любой другой).

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

# Эта команда установит acme.sh в директорию ~/.acme.sh, системные
# файлы не будут затронуты
wget -O - https://get.acme.sh | sh -s \
    email=yourveryownlocalpart@example.net
# Теперь либо перезайдите в систему, либо выполните `exec $0`, если
# вы уверены в значении переменной `$0`.

# Проверьте, прошла ли установка правильно
acme.sh -h

# Установить Let's Encrypt в качестве УЦ
acme.sh --set-default-ca --server \
    https://acme-v02.api.letsencrypt.org/directory

# Есть два способа подтверждения владения доменом - по HTTP или по
# DNS.
# Первый проще, но требует доступ на запись в директорию, содержимое
# которой доступно по ссылке http://example.net/:
acme.sh --issue -d example.net -d conference.example.net -d \
    upload.example.net -w <директория с корнем вашего
    веб-сервера>
# А второй, поддерживая Wildcard-сертификаты, позволяет в дальнейшем
# подключать к вашему XMPP-серверу всевозможные компоненты
# (транспорты в другие сети, модуль публикации-подписки, он же
# Publish-Subscribe или просто PubSub и многие другие), но требует
# доступа к API вашего DNS-регистратора для создания записи,
# подтверждающей владение доменным именем:
acme.sh --issue --dnssleep <время в секундах, большее чем TTL> \
    --dns dns_myapi \
    -d example.net -d '*.example.net' # Где dns_myapi - это кодовое
    # имя DNS-провайдера, указанное на
    # https://github.com/acmesh-official/acme.sh/wiki/dnsapi
# Но если у вас нет и веб-сервера (или доступа к нему), и доступа к
# API регистратора, то вы можете внести запись с подтверждением
# вручную (заметьте, что вам нужно будет это делать каждый раз, когда
# будет истекать срок действия сертификата):
# (Перед применением этого способа следует внимательно прочитать
# следующую страницу:
# https://github.com/acmesh-official/acme.sh/wiki/dns-manual-mode)
acme.sh --issue --dns -d example.net -d '*.example.net'
# Теперь примените DNS-запись, выведенную на экран командой выше, и
# подождите до её распространения. После выполните следующее:
acme.sh --renew -d example.net -d '*.example.net'

# Почти готово. Теперь осталось установить сертификат:
mkdir /etc/ssl/private/example.net
chown root:ssl-cert /etc/ssl/private/example.net
chmod 750 /etc/ssl/private/example.net
acme.sh --install-cert \
    -d example.net -d '*.example.net' \
    --ca-file        /etc/ssl/private/example.net/chain.pem \
    --cert-file      /etc/ssl/private/example.net/cert.pem \
    --fullchain-file /etc/ssl/private/example.net/fullchain.pem \
    --key-file       /etc/ssl/private/example.net/privkey.pem  \
    --reloadcmd      "prosodyctl --root cert import \
    /etc/ssl/private/example.net"

Смотрите также


В завершении статьи хочется обратить ваше внимание на то, что данная инструкция предоставляется БЕЗ каких-либо гарантий. Если при выполнении указаний из данной инструкции случилось что-то непредвиденное, вы можете обратиться ко мне, но не стоит ожидать какого-либо результата.