1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
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-авторизацией - Журнал @ веб-сайте самохостера 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 >= 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 && 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 <директория с корнем вашего
веб-сервера>
# А второй, поддерживая 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"
</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>
|