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

summaryrefslogtreecommitdiff
path: root/public/blog/pubnix----prosody--pam-
diff options
context:
space:
mode:
authorIvan Davydov <lotigara@lotigara.ru>2025-06-24 14:03:34 +0300
committerIvan Davydov <lotigara@lotigara.ru>2025-06-24 14:03:34 +0300
commita2e3bec40f5851be70299e7513967a0f5d042bf9 (patch)
tree5234a58ac93fa6c4752075a5128f183da0725c13 /public/blog/pubnix----prosody--pam-
Initial commitmaster
Diffstat (limited to 'public/blog/pubnix----prosody--pam-')
-rw-r--r--public/blog/pubnix----prosody--pam-/index.html214
1 files changed, 214 insertions, 0 deletions
diff --git a/public/blog/pubnix----prosody--pam-/index.html b/public/blog/pubnix----prosody--pam-/index.html
new file mode 100644
index 0000000..2c49631
--- /dev/null
+++ b/public/blog/pubnix----prosody--pam-/index.html
@@ -0,0 +1,214 @@
+<!DOCTYPE html>
+<html class="blog" lang="ru">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></meta>
+ <meta name="color-scheme" content="dark light"></meta>
+
+ <title>Pubnix - Установка Prosody с PAM-авторизацией - &ZHcy;&ucy;&rcy;&ncy;&acy;&lcy; &commat; &vcy;&iecy;&bcy;-&scy;&acy;&jcy;&tcy;&iecy; &scy;&acy;&mcy;&ocy;&khcy;&ocy;&scy;&tcy;&iecy;&rcy;&acy; Lotigara</title>
+ <link rel="stylesheet" href="/blog/_/style.css">
+ <body>
+<header><center>
+ <h1>Веб-сайт самохостера Lotigara</h1>
+ <nav>
+ <a href="https://www.lotigara.ru/">главная|main page</a>
+ <a href="https://www.lotigara.ru/status.php">состояние|status</a>
+ <a href="https://www.lotigara.ru/blog">журнал|journal</a>
+ <a href="https://www.lotigara.ru/files">файлы|files</a>
+ <a href="https://git.lotigara.ru">программы|software</a>
+ <br>
+ <a href="https://www.lotigara.ru/archive">архив|archive</a>
+ </nav>
+</center></header>
+
+<!-- post -->
+<div class="post">
+ <h1><a href="/blog/blog/pubnix----prosody--pam-/">Pubnix - Установка Prosody с PAM-авторизацией</a></h1>
+ <div class="content">
+<h2>Использованные источники</h2>
+
+<ul>
+ <li><a href="https://blog.desdelinux.net/en/prosody-im-local-users-SME-networks">DesdeLinux</a></li>
+ <li><a href="https://landchad.net/prosody">LandChad</a></li>
+ <li><a href="https://prosody.im">Prosody</a></li>
+</ul>
+
+<h2>0. Системные требования</h2>
+
+<ul>
+ <li>Firewall с следующими открытыми портами:</li>
+ <li>
+ <ul>
+ <li>5000/tcp (передача файлов)</li>
+ </ul>
+ </li>
+ <li>
+ <ul>
+ <li>5222/tcp (подключение клиента)</li>
+ </ul>
+ </li>
+ <li>
+ <ul>
+ <li>5269/tcp (федерация, подключение сервера к серверу)</li>
+ </ul>
+ </li>
+ <li>
+ <ul>
+ <li>5281/tcp (по желанию, но рекомендуется)</li>
+ </ul>
+ </li>
+ <li><p>Debian 12 с последними обновлениями и доступом в Интернет</p></li>
+ <li><p>Prosody &gt;= 0.13</p></li>
+</ul>
+
+<hr>
+
+<h2>0,5. Авторизация при помощи ОС</h2>
+<p>PAM (Pluggable Authentication Modules) - API для авторизации в Unix-подобных ОС, по умолчанию использует список пользователей из файла `/etc/passwd`.</p>
+
+<p>Все команды выполняются пользователем <code>root</code>, если не указано иначе.</p>
+
+<h2>1. Установка</h2>
+<p>Выполните эти команды:</p>
+
+<pre>
+# Установить 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
+# Установить библиотеку для взаимодействия с <abbr title="Portable Operating System Interface">POSIX</abbr>-функциями
+luarocks install luaposix
+# Собрать библиотеку дл/ PAM-аутентификации
+git clone https://github.com/devurandom/lua-pam &amp;&amp; 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
+</pre>
+
+<h2>2. Настройка</h2>
+<p>Начните редактировать файл <code>/etc/prosody/prosody.cfg.lua</code>.
+Следуйте этим инструкциям, заменяя <code>example.net</code> на доменное имя, привязанное к вашему серверу.</p>
+
+<p>Найдите строку, начинающуюся с слова <code>admins</code>, и добавьте ваше будущее имя пользователя в фигурные скобки подобным образом:</p>
+
+<pre>
+admins = { "admin@example.net" }
+</pre>
+
+<p>Где <code>admin</code> - это ваше имя пользователя в вашей системе.</p>
+
+<p>Дальше найдите строку <code>--"mam";</code> и удалите два дефиса, сделайте то же самое с строкой <code>--"turn_external";</code>, находящейся ниже.</p>
+
+<p>Теперь перейдите к строке <code>authentication = "internal_hashed"</code> и замените <code>internal_hashed</code> на <code>pam</code>.</p>
+
+<p>Перейдите к строке, начинающейся с <code>storage</code> и поменяйте <code>sql</code> на <code>internal</code> (по желанию, в этой инструкции я не рассматриваю настройку с базами данных)</p>
+
+<p>По желанию в строке <code>archive_expires_after = "1w"</code> замените <code>1w</code> на <code>never</code>, чтобы истории переписок не удалялись каждую неделю.</p>
+
+<p>Найдите строку, начинающуюся с <code>VirtualHost</code> и замените <code>localhost</code> на <code>example.net</code>.</p>
+
+<p>Если вам нужны многопользовательские переписки, на следующей строке добавьте следущее:</p>
+
+<pre>
+Component "conference.example.net" "muc"
+modules_enabled = { "muc_mam", "vcard_muc" }
+</pre>
+
+<p>Последнюю строку можете опустить, если вам не нужно сохранение истории многопользовательских переписок.</p>
+
+<p>Если нужна возможность загружать файлы на ваш сервер, дополните конфигурацию следующими строками:</p>
+
+<pre>
+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 --измеряется в секундах
+</pre>
+
+<p>В данном случае, лимит размера файла - это 512 МиБ (0,5 ГиБ), а удаляться файлы будут через ~1000 лет.
+Если требуется изменить какое-либо из этих свойств, смотрите комментарии (в Lua они начинаются с двух дефисов) и пробуйте изменять значения.</p>
+
+<h2>3. Настройка TLS-сертификата</h2>
+<p>Также заменяйте `example.net` на ваше доменное имя.</p>
+
+<p>ACME (Automatic Certificate Management Environment) - это протокол для получения TLS-сертификатов по Web.
+В этом примере используется ACME-клиент acme.sh, так как эта программа более настраиваемая и удостоверяющий центр (далее УЦ) Let's Encrypt (но вы можете использовать любой другой).</p>
+
+<p>Выполните следующие команды:</p>
+<pre>
+# Эта команда установит 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 &lt;директория с корнем вашего
+ веб-сервера&gt;
+# А второй, поддерживая Wildcard-сертификаты, позволяет в дальнейшем
+# подключать к вашему XMPP-серверу всевозможные компоненты
+# (транспорты в другие сети, модуль публикации-подписки, он же
+# Publish-Subscribe или просто PubSub и многие другие), но требует
+# доступа к API вашего DNS-регистратора для создания записи,
+# подтверждающей владение доменным именем:
+acme.sh --issue --dnssleep &lt;время в секундах, большее чем TTL&gt; \
+ --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"
+</pre>
+
+<h2>Смотрите также</h2>
+
+<ul>
+ <li><a href="https://stupin.su/blog/prosody-dovecot-sasl">Ещё один блог сисадмина - Настройка Jabber-сервера Prosody с аутентификацией пользователей через Dovecot SASL</a>. Статья немного старая, но если вы настраивали Dovecot так же, как и я (см. главную страницу), то это может вам пригодиться для, например, добавление доступа в XMPP совместно с эл. почтой. Также советую посмотреть конец раздела по настройке SSL (5-ый), там есть скрипт, который будет обновлять сертификаты в Prosody вместе с Certbot.</li>
+ <li><a href="https://blog.desdelinux.net/en/prosody-im-local-users-SME-networks">DesdeLinux - Prosody IM and local users - Networks PYMES</a>. Здесь тоже описывается авторизация с помощью PAM, но она выполнена с использованием ещё одной программы, что, конечно, неэффективно. Эта страница указана в начале, так как автор некоторое время использовал именно инструкцию по ссылке выше.</li>
+</ul>
+
+<hr>
+
+<p>В завершении статьи хочется обратить ваше внимание на то, что данная инструкция предоставляется БЕЗ каких-либо гарантий. Если при выполнении указаний из данной инструкции случилось что-то непредвиденное, вы можете обратиться ко мне, но не стоит ожидать какого-либо результата.</p>
+ </div>
+</div>
+<!-- /post -->
+
+ </body>
+</html>