如何在 Ubuntu 18.04 上安装 Prosody

作者选择了 开放式互联网 / 自由言论基金作为 写给捐赠计划的一部分接受捐款。

介绍

Prosody是一个XMPP聊天服务器,支持TLS加密的一个对一个聊天和组聊天室。 XMPP(Extensible Messaging and Presence Protocol)是一个开放的消息协议,正式称为Jabber。

XMPP是一个成熟和开放的标准,由Internet Engineering Task Force(IETF)(https://www.ietf.org/about/)维护。它被积极维护和部署在许多应用程序中,如 Google Talk,它被数百万用户使用。

在本教程中,您将安装和配置一个支持一对一和组聊天会话的ProSody服务器,以及将文件上传到聊天面板共享的能力。

前提条件

在您开始本指南之前,您将需要以下内容:

  • 一个 Ubuntu 18.04 服务器,至少有 512MB RAM 设置,按照 初始服务器设置与 Ubuntu 18.04 指南,包括一个 sudo 启用,非根用户和防火墙。
  • 一个 XMPP 聊天客户端安装在您的本地系统上。 在此 XMPP 客户 页面上列出的任何聊天应用程序都将与您的 Prosody 服务器兼容。
  • 两个主机名指向您的服务器。 您需要两个主机名,因为 Prosody 使用一个用于直接聊天,另一个用于组聊天室。 学习如何将主机名指向 DigitalOcean Droplets 通过我们的 DNS How-Tos

登录您的服务器作为 sudo 启用,非 root 用户启动本指南。

步骤 1 - 安装 Prosody

在此步骤中,您将添加自定义 Prosody APT 仓库到您的服务器,然后从中安装 Prosody. 您正在使用 Prosody 仓库来确保安装最新的包。

首先,使用文本编辑器创建并打开新的存储文件. 此文件包含 APT 包管理器的 Prosody 存储信息:

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

将下列行添加到您的文件中:

1[label /etc/apt/sources.list.d/prosody.list]
2deb https://packages.prosody.im/debian bionic main

现在,您需要下载并安装 Prosody APT 公共密钥. 您的服务器将使用此功能来确认 Prosody 包由 Prosody 团队创建并未被篡改。

以下命令使用wget实用程序来下载当前目录的密钥:

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

使用apt-key add命令将 Prosody 的密钥添加到 APT 的键:

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

您现在可以删除密钥,因为您不再需要它:

1rm prosody-debian-packages.key

更新您的服务器的包数据库,以便包括来自 Prosody 存储库的最新包版本:

1sudo apt update

您现在已经准备好安装 Prosody 服务器包和一些额外的可选包:

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

您安装的软件包如下:

  • prosody: Prosody 服务器.
  • prosody-modules: 扩展 Prosody 服务器功能的额外 Prosody 模块.
  • lua-dbi-sqlite3: 允许 Prosody 使用 SQLite 数据库.
  • lua-event: 允许 Prosody 处理更多的同时客户端。

在下一步,您将获得两个TLS证书,Prosody将用来加密您的数据,因为它通过互联网到达和从Prosody服务器。

第2步:获取TLS证书

Prosody 使用 TLS 证书来加密服务器和客户端之间的连接. 这些证书是您每次访问具有HTTPS URL 的网站时使用的相同证书。 Let's Encrypt是一家提供免费 TLS 证书的非营利组织。 他们还提供certbot工具来获取和管理他们的证书。 在此步骤中,您将安装certbot工具并使用它来获取您指向服务器的两个主机名称的证书。

您将从 Let's Encrypt Ubuntu PPA 存储库中安装certbot,以确保您正在使用最新的软件包。

首先,运行以下命令来添加自定义存储库:

1sudo add-apt-repository ppa:certbot/certbot

现在,安装certbot:

1sudo apt install certbot

接下来,允许通过UFW的HTTP流量,以便certbot可以验证您的证书申请:

1sudo ufw allow http

运行以下certbot命令,它将为您的主机名之一获得证书:

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

这些选项是:

  • --certonly: 获取证书,不要在服务器上做出任何其他更改。
  • --standalone: 启动临时网络服务器进行证书验证。
  • --agree-tos: 自动同意我们加密服务条款。
  • --email your_email: 您将提交给Let's Encrypt的电子邮件地址,他们将使用它来通知您有关安全问题,证书到期通知和其他重要信息。

当您运行此命令时,您将被问及是否希望与电子边境基金会(https://www.eff.org/)共享您的电子邮件地址,这是可选的。

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

再次运行相同的命令,以获得您第二个主机名称的证书。

您现在有两个地址:

  • /etc/letsencrypt/live/room.your-domain
  • /etc/letsencrypt/live/chat.your-domain

它们包含您的主机名称的证书和密钥文件。

由于 Prosody 服务器不作为用户运行,因此对目录和关键文件的所有权和权限需要更改,以便 Prosody 服务器可以读取和使用它们。

Linux 上的文件和目录的权限允许控制哪些用户和流程可以读、写和执行目录和文件夹. 这种控制可以保护系统免受未经授权的用户的修改,还可以保护私人文件,如 TLS 私钥,免受未经授权的用户的阅读。

如果您对 Linux 用户和权限不熟悉,这篇文章 An Introduction to Linux Permissions提供了一个很好的介绍。

第一步是通过以下命令将私钥的群组所有者更改为 Prosody 服务器的群组prosody:

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

chgrp实用程序改变了文件和目录的组所有者,在这里,您将组从默认的root更改为prosody

接下来,将包含 TLS 证书文件的目录的权限更改为0755。这些目录由root用户和root组所有。

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

这些目录中的0755的新权限意味着 root 用户已经阅读、写入和执行权限。

现在,更改 TLS 私钥的权限:

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

这些文件上的0640权限意味着 root 用户已经读过和写过文件上的权限。prosody 组的成员已经读过文件上的权限。prosody 组有一个成员,prosody 用户。

这两个命令使用 chmod实用程序来修改哪些用户和组在文件和目录上读取、写入和执行权限。

您可以通过使用sudo来测试 Prosody 是否可以读取私钥,以便将cat作为prosody用户的私钥文件读取:

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

如果这是成功的,那么你会看到你的屏幕上显示的关键文件的内容。

Prosody 使用包含证书和私钥的单个文件来加密文件上传和下载连接。

您将首先进入包含密钥和证书文件的目录,然后使用cat将其内容合并为一个新的文件key-and-cert.pem:

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

这个命令的开始,sudo sh -c打开了一个新的子壳,它具有root用户的权限,因此可以将新文件写入/etc/letsencrypt/live/chat.your-domain/

现在,用以下命令更改该新文件的组和权限,以匹配您为其他私钥文件设置的组和权限:

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

回到用户的家庭目录:

1cd

最后,该文件必须每次更新证书时重新创建,或者它将包含已过期的证书。

certbot配备了一个叫做hook的机制,允许在证书更新之前或之后运行脚本. 您可以使用此机制运行一个脚本,在每次更新证书后重新创建您运行的命令。

使用文本编辑器打开名为 `/etc/letsencrypt/renewal-hooks/post/key-and-cert-combiner.sh’的新脚本文件:

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

然后将以下内容添加到编辑器中:

1[label /etc/letsencrypt/renewal-hooks/post/key-and-cert-combiner.sh]
2#!/usr/bin/env bash
3set -e
4
5# combines the certificate and key into a single file with cat
6cat /etc/letsencrypt/live/chat.your-domain/privkey.pem \
7    /etc/letsencrypt/live/chat.your-domain/fullchain.pem \
8   >/etc/letsencrypt/live/chat.your-domain/key-and-cert.pem

这就是你的Bash脚本如何打破:

  • # !/usr/bin/env bash:告诉系统使用Bash解释器来运行脚本。
  • set -e:如果任何命令失败,会导致脚本退出。

无法运行脚本,直到您使用以下命令给它执行权限:

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

+x为脚本提供执行权限。

接下来,测试证书是否正确安装,并通过运行以下certbot命令来验证更新后链接脚本的运行:

1sudo certbot renew --dry-run

这个命令告诉certbot更新证书,但使用--dry-run选项阻止certbot做出任何更改。

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

您现在已经为您的 Prosody 服务器获得了 TLS 证书. 在下一步,您将编辑 Prosody 的主要配置文件。

步骤 3 – 配置 Prosody

Prosody有许多配置选项,这反映在主要配置文件 /etc/prosody/prosody.cfg.lua的大小。

在你开始编辑一个大配置文件之前,这是一个好主意,使一个副本,以便你有原来的参考和恢复从。

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

你现在有原始文件的副本在 /etc/prosody/prosody.cfg.lua.original

接下来,使用文本编辑器打开配置文件:

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

配置更改在下面的部分中被分成更小的任务。

创建一个管理员

Prosody 管理员是可以从他们的聊天客户端对 Prosody 服务器进行更改的用户,向所有用户发送消息,并完成其他特权操作。

Prosody 服务器管理员设置为下列行:

1[label /etc/prosody/prosody.cfg.lua]
2...
3admins = { }
4...

在这个示例行中,用户admin将被添加到示例服务器chat.your-domain:

1[label /etc/prosody/prosody.cfg.lua]
2...
3admins = { "[email protected]" }
4...

如果您想添加另一个用户,那么您必须在第一个用户后放一个字节:

1[label /etc/prosody/prosody.cfg.lua]
2...
3admins = { "[email protected]", "[email protected]" }
4...

允许模块化

Prosody开发人员将许多功能放入可以启用或禁用的模块中。

一个模块是通过删除前面的--来启用的,例如,在这里,tls模块是禁用的:

1[secondary_label Module Disabled]
2                --"tls"; -- Add support for secure TLS on c2s/s2s connections

这里是允许的:

1[secondary_label Module Enabled]
2                "tls"; -- Add support for secure TLS on c2s/s2s connections

以下是 Prosody 配置文件的编辑模块部分,编辑的行被突出显示:

 1[label /etc/prosody/prosody.cfg.lua]
 2...
 3modules_enabled = {
 4
 5        -- Generally required
 6                "roster"; -- Allow users to have a roster. Recommended ;)
 7                "saslauth"; -- Authentication for clients and servers. Recommended if you want to log in.
 8                "tls"; -- Add support for secure TLS on c2s/s2s connections
 9                "dialback"; -- s2s dialback support
10                "disco"; -- Service discovery
11
12        -- Not essential, but recommended
13                "carbons"; -- Keep multiple clients in sync
14                "pep"; -- Enables users to publish their avatar, mood, activity, playing music and more
15                "private"; -- Private XML storage (for room bookmarks, etc.)
16                "blocklist"; -- Allow users to block communications with other users
17                "vcard4"; -- User profiles (stored in PEP)
18                "vcard_legacy"; -- Conversion between legacy vCard and PEP Avatar, vcard
19
20        -- Nice to have
21                "version"; -- Replies to server version requests
22                "uptime"; -- Report how long server has been running
23                "time"; -- Let others know the time here on this server
24                "ping"; -- Replies to XMPP pings with pongs
25                "register"; -- Allow users to register on this server using a client and change passwords
26                "mam"; -- Store messages in an archive and allow users to access it
27                "csi_simple"; -- Simple Mobile optimizations
28
29        -- Admin interfaces
30                "admin_adhoc"; -- Allows administration via an XMPP client that supports ad-hoc commands
31                --"admin_telnet"; -- Opens telnet console interface on localhost port 5582
32
33        -- HTTP modules
34                --"bosh"; -- Enable BOSH clients, aka "Jabber over HTTP"
35                --"websocket"; -- XMPP over WebSockets
36                "http_files"; -- Serve static files from a directory over HTTP
37                "http_upload"; -- Enables file sharing between users
38
39        -- Other specific functionality
40                --"limits"; -- Enable bandwidth limiting for XMPP connections
41                "groups"; -- Shared roster support
42                --"server_contact_info"; -- Publish contact information for this service
43                "announce"; -- Send announcement to all online users
44                --"welcome"; -- Welcome users who register accounts
45                --"watchregistrations"; -- Alert admins of registrations
46                --"motd"; -- Send a message to users when they log in
47                --"legacyauth"; -- Legacy authentication. Only used by some old clients and bots.
48                --"proxy65"; -- Enables a file transfer proxy service which clients behind NAT can use
49}
50...

您启用的模块如下:

  • mam: 在服务器上存储聊天消息,以便用户可以获取它们。
  • csi_simple: 允许移动客户端的优化。
  • http_files: 允许文件共享。
  • http_uploads: 允许文件共享。
  • groups: 允许用户可见性。

建立数据库存储

您需要编辑的下一个部分设置为 Prosody 存储用户的消息和其他数据. 默认设置是使用文本文件,但更可扩展的配置是将消息保存到数据库中。

Prosody为数据库提供了三种选择:MySQL、PostgreSQL和SQLite(LINK0)。SQLite是最容易设置和维护的,使用最少的资源,适用于较小的部署。

通过如下所示删除引导 -- 来启用以下两行:

1[label /etc/prosody/prosody.cfg.lua]
2...
3storage = "sql" -- Default is "internal"
4...
5sql = { driver = "SQLite3", database = "prosody.sqlite" } -- Default. 'database' is the filename.
6...

消息档案

您可以通过编辑下面的行来决定服务器将存储旧聊天消息的时间:

1[label /etc/prosody/prosody.cfg.lua]
2...
3archive_expires_after = "1w" -- Remove archived messages after 1 week
4...

顯示「1w」(一周)的默認期間,使用「d」為日期、「w」為週期和「y」為年期。

加密文件上传和下载

https_certificate行告诉 Prosody在哪里寻找您之前创建的组合证书和密钥,用于文件传输。

编辑它以便使用通往您的合并文件的路径:

1[label /etc/prosody/prosody.cfg.lua]
2...
3https_certificate = "/etc/letsencrypt/live/chat.your-domain/key-and-cert.pem"
4...

删除本地

在默认配置中,Prosody 会倾听本地主机127.0.0.1以进行聊天连接。

通过在行中添加--来禁用此行为,以便在编辑后显示如下:

1[label /etc/prosody/prosody.cfg.lua]
2...
3--VirtualHost "localhost"
4...

更改最大上传文件大小

您的 Prosody 服务器通过将其附加到聊天窗口来支持用户共享文件,用户可以共享的文件的默认最大大小为 1 MB。

将此值设置为更高的值,将下列行添加到配置的末尾:

1[label /etc/prosody/prosody.cfg.lua]
2...
3http_upload_file_size_limit = 10485760
4...

行末尾的数字是字节中的最大文件大小. 这里所示的大小是 10485760 字节或 10MB. 该 GbMb 网站提供了转换 MB 到 Bytes 的实用工具。

如果你想允许上传大于10MB的文件,那么你必须添加另一个行,设置http_max_content_size变量。

在这里,最大文件大小设置为 20MB (20971520 字节),而http_max_content_size设置为 30MB:

1[label /etc/prosody/prosody.cfg.lua]
2...
3http_upload_file_size_limit = 20971520
4http_max_content_size = 31457280
5...

将 http_max_content_size 设置为 50% 大于最大文件大小。

配置组文件

您在模块部分启用的模块允许聊天客户端互相查看。

模块读取包含组名及其成员的文件. 通过将下列行添加到配置底部来设置该文件的位置和名称:

1[label /etc/prosody/prosody.cfg.lua]
2...
3groups_file = "/etc/prosody/sharedgroups.txt"
4...

此行将 Prosody 配置为在 `/etc/prosody/sharedgroups.txt 读取文件以收集组信息。

在不同的终端中使用以下命令创建此文件:

1sudo touch /etc/prosody/sharedgroups.txt

触摸实用程序在没有使用额外选项时创建一个空的文件。

添加聊天服务器 VirtualHost 配置

Prosody使用一个从VirtualHost开始的配置块来启动使用您的主机名称的聊天服务器。

将下列配置块添加到配置的底部:

1[label /etc/prosody/prosody.cfg.lua]
2...
3VirtualHost "chat.your-domain"
4    ssl = {
5            key = "/etc/letsencrypt/live/chat.your-domain/privkey.pem";
6            certificate = "/etc/letsencrypt/live/chat.your-domain/fullchain.pem";
7    }
8...

配置选项:

  • VirtualHost: Prosody 将为聊天服务器使用的主机名。
  • key:用于保护聊天连接的 TLS 私钥。
  • certificate:用于保护聊天连接的 TLS 私钥。

添加聊天室服务器

此配置允许 Prosody 为您的用户提供多用户聊天室. 在新部分中,将下面的配置块添加到配置文件的底部:

 1[label /etc/prosody/prosody.cfg.lua]
 2...
 3Component "room.your-domain" "muc"
 4    modules_enabled = { "mam_muc"; }
 5    storage = { muc_log = "sql"; }
 6    ssl = {
 7          key = "/etc/letsencrypt/live/room.your-domain/privkey.pem";
 8          certificate = "/etc/letsencrypt/live/room.your-domain/fullchain.pem";
 9    }
10...

所使用的选项:

  • Component: 允许 muc (多用户聊天) 组聊天模块使用 room.your-domain 主机名。
  • modules_enabled = { "mam_muc"; }: 允许对组聊天进行消息存档。
  • 存储: 存档聊天信息进入 SQLite 数据库。
  • key: 用于保护聊天连接的 TLS 私钥。

保存和退出编辑器。

现在,重新启动 Prosody 以将新配置带到现场:

1sudo systemctl restart prosody.service

您已完成编辑 Prosody 的主要配置文件. 在下一步,您将添加一个 Prosody 用户并将其添加到组中。

步骤 4 – 添加 Prosody 用户和组

您必须在命令行上将 Prosody 用户添加到您的 Prosody 服务器,然后他们可以登录。

使用以下prosodyctl命令添加新用户:

1sudo prosodyctl register sammy chat.your-domain password

此用户现在可以连接到您的 Prosody 服务器。

您的用户将欣赏它,如果您创建一些组,使他们可以看到彼此,并查看他们的状态. 您通过创建组并将用户添加到他们与您之前定义的组文件。

打开组文件:

1sudo nano /etc/prosody/sharedgroups.txt

一个组的名称是通过将其名称放置在方块之间设置的。该组的成员被放置在组名称下的新行上。

这里有一个名为每个人的组,其中有两个成员: sammy 和 ** admin** 。

1[label /etc/prosody/sharedgroups.txt]
2[Everyone]
3[email protected]
4[email protected]

同一组的所有成员将能够看到其他成员是否在线。

您必须每次添加新用户或修改组信息时重新启动 Prosody 服务器:

1sudo systemctl restart prosody.service

剩下的服务器配置是允许Prosody通过防火墙进行通信,这将在下一节中进行。

步骤 5 – 允许通过防火墙的 Prosody 流量

Prosody 会听取来自 TCP 端口 52225322 的客户端连接. 使用以下命令在 UFW 中打开这些端口:

1sudo ufw allow 5222,5322/tcp

现在 Prosody 服务器已完全安装和配置。

您现在可以使用聊天客户端连接到您的 Prosody 服务器. 在下一步,您将在本地系统或智能手机上配置一个 XMPP 客户端连接到您的 Prosody 服务器。

步骤 6 — 配置 XMPP 聊天客户端

在此步骤中,您将将您的 XMPP 客户端配置为您的 Prosody 服务器,您需要输入您的用户名、服务器主机名和密码才能连接。

您已将 Prosody 服务器配置为使用标准的 XMPP 端口,并将自动处理 TLS 安全,因此您不需要将其设置为连接到客户端。

不同的聊天客户端可能会以不同的格式请求用户名、密码和服务器主机名. 用户名和服务器主机名有时会像电子邮件地址一样组合在一起,例如「[email protected]」。

此图像显示了 PSI客户端的登录屏幕,该客户端需要在电子邮件地址表格中输入用户名和服务器主机名。

Image showing the PSI login page

对于 Linux XMPP 客户端 Gajim的帐户登录屏幕的下一个屏幕截图显示了用户名和主机名分开的输入字段。

Image showing the Gajim login page

XMPP 客户端不需要比用户名、密码和服务器主机名更详细的信息来登录.您登录后,您将能够找到聊天组的其他成员,您还将能够创建由您的客户端支持的组聊天室。

结论

在本文中,您将设置一个 Prosody 服务器,具有以下功能:

  • TLS 加密
  • 一对一聊天室和组聊天室.
  • 文件共享

您还配置了一个 XMPP 聊天客户端来使用所有这些功能,让您与朋友和同事聊天。

如果您正在寻找进一步的开源替代远程通信,请参阅我们的 如何安装 Jitsi Meet 教程

Published At
Categories with 技术
comments powered by Disqus