如何在 Ubuntu 18.04 上安装 Prosody

作者选择开放互联网/言论自由基金接受捐赠,作为Write for DOnations计划的一部分。

介绍

Prosody是一个 XMPP 聊天服务器,支持 TLS 加密的一对一聊天和群聊室。XMPP(可扩展消息和在线协议)是一种开放的消息协议,正式名称为 Jabber。这意味着任何 XMPP 聊天客户端都可以连接到 Prosody 服务器并开始聊天。

XMPP是一个成熟的开放标准,由Internet Engineering Task Force (IETF)维护它在许多应用程序中得到积极维护和部署,例如被数百万用户使用的Google TalkXMPP 服务器,如 Prosody,是已经存在了二十多年的聊天服务器的灵活选择。

在本教程中,您将安装和配置 Prosody 服务器,该服务器支持一对一和群聊会话以及将文件上传到聊天面板进行共享的功能。所有聊天会话都将受到 TLS 加密证书的保护,因此您的个人数据将保持私密。

先决条件

在开始本指南之前,您需要具备以下条件:

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

    • chat.your-domain:一对一聊天主机名。
    • room.your-domain: 群聊室主机名。

以启用 sudo 的非 root 用户身份登录到您的服务器以开始本指南。

步骤 1 — 安装 Prosody

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

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

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

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

/etc/apt/sources.list.d/prosody.list
deb https://packages.prosody.im/debian bionic main

现在,您需要下载并安装 Prosody APT 公钥。您的服务器将使用它来确认 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: 韵律服务器。
  • prosody-modules:扩展 Prosody 服务器功能的附加 Prosody 模块。
  • lua-dbi-sqlite3:使 Prosody 能够使用SQLite数据库。
  • lua-event:使 Prosody 能够处理更多并发客户端。

您现在已经完成了 Prosody 的安装。在下一步中,您将获得两个 TLS 证书,Prosody 将使用它们来加密您的数据,因为它通过 Internet 进出 Prosody 服务器。

第 2 步 – 获取 TLS 证书

Prosody 使用 TLS 证书来加密服务器和客户端之间的连接。这些证书与您每次访问带有HTTPSURL的网站时使用的证书相同Let’s Encrypt是一个提供免费 TLS 证书的非营利组织。他们还提供了certbot获取和管理证书实用程序。在此步骤中,您将安装该certbot实用程序并使用它为您指向服务器的两个主机名获取一对证书。

您将从certbotLet’s Encrypt Ubuntu PPA 存储库进行安装以确保您使用的是最新的软件包。

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

  • 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

这些选项是:

  • --certonly:获取证书,不要在服务器上做任何其他更改。
  • --standalone: 启动一个临时的 Web 服务器以进行证书验证。
  • --agree-tos:自动同意 Let’s Encrypt 服务条款。
  • --email your_email:您将提交给 Let’s Encrypt 的电子邮件地址,他们将用于通知您有关安全问题、证书到期通知和其他重要信息。
  • -d chat.your-domain:您打算用于 Prosody 服务器的主机名。

当您运行此命令时,系统会询问您是否要与电子前沿基金会共享您的电子邮件地址,这是可选的。然后证书的注册将继续,输出如下:

Output
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

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

您现在有两个目录:

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

这些包含主机名的证书和密钥文件。

由于 Prosody 服务器不以root用户身份运行,因此需要更改目录和密钥文件的所有权和权限,以便 Prosody 服务器可以读取和使用它们。

Linux 上的文件和目录权限允许控制哪些用户和进程可以读取、写入和执行目录和文件夹。这种控制保护系统不被非授权用户修改,还保护私有文件,如 TLS 私钥,不被非授权用户读取。

如果您不熟悉 Linux 用户和权限,文章Linux 权限简介提供了一个很好的介绍。

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

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

chgrp实用程序更改文件和目录的组所有者。在这里,您将组从默认更改rootprosody

接下来,将包含 TLS 证书文件的目录的权限更改为0755. 这些目录归root用户和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实用程序来修改哪些用户和组对文件和目录具有读取、写入和执行权限。

您可以测试韵律可以通过读取专用密钥sudo读取与私有密钥文件catprosody用户:

  • 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,打开一个新的子shell,它具有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

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

/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 脚本分解的方式:

  • #!/usr/bin/env bash: 告诉系统使用 Bash 解释器来运行脚本。
  • set -e: 如果任何命令失败,则导致脚本退出。
  • >:将cat命令的输出重定向到右侧的新文件中。

除非您使用以下命令为其授予执行权限,否则该脚本无法运行:

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

+x给出脚本执行权限。

接下来,通过运行以下certbot命令测试证书是否正确安装以及更新后挂钩脚本是否正常工作

  • sudo certbot renew --dry-run

此命令告诉certbot更新证书,但带有--dry-run停止certbot进行任何更改选项如果一切顺利,您将看到以下输出:

Output
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

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

第 3 步 – 配置韵律

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 服务器管理员使用以下行进行设置:

/etc/prosody/prosody.cfg.lua
...
admins = { }
...

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

/etc/prosody/prosody.cfg.lua
...
admins = { "[email protected]" }
...

如果你想添加另一个用户,那么你必须在第一个之后放一个逗号:

/etc/prosody/prosody.cfg.lua
...
admins = { "[email protected]", "[email protected]" }
...

启用韵律模块

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

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

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

此处已启用:

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

本段之后是 Prosody 配置文件的已编辑模块部分,其中突出显示了已编辑的行:

/etc/prosody/prosody.cfg.lua
...
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
}
...

您启用的模块如下:

  • mam:在服务器上存储聊天消息,以便用户可以检索它们。
  • csi_simple:为移动客户端启用优化。
  • http_files:启用文件共享。
  • http_uploads:启用文件共享。
  • groups:启用用户可见性。
  • announce:允许管理员向所有用户发送公告。

设置数据库存储

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

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

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

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

消息归档

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

/etc/prosody/prosody.cfg.lua
...
archive_expires_after = "1w" -- Remove archived messages after 1 week
...

显示默认周期1w(一周)。使用d数天、w数周和数y年。

加密文件上传和下载

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

编辑它以便它使用组合文件的路径:

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

删除 localhost

在默认配置中,Prosody 侦听localhost侦听127.0.0.1聊天连接。这在远程服务器上是不需要的。

通过添加--到该行来禁用此行为,使其在编辑后如下所示:

/etc/prosody/prosody.cfg.lua
...
--VirtualHost "localhost"
...

更改最大文件上传大小

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

通过将以下行添加到配置的末尾,将其设置为更高的值:

/etc/prosody/prosody.cfg.lua
...
http_upload_file_size_limit = 10485760
...

该行末尾的数字是以字节为单位的最大文件大小。此处显示的大小为10485760字节或 10MB。GbMb网站提供转换到MB字节一个方便的工具。

如果要允许上传大于 10MB 的文件,则必须添加另一行来设置http_max_content_size变量。http_max_content_size必须小于最大文件上传大小。

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

/etc/prosody/prosody.cfg.lua
...
http_upload_file_size_limit = 20971520
http_max_content_size = 31457280
...

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

配置组文件

groups您在模块部分启用模块允许聊天客户端看到对方。

groups模块读取一个包含组名及其成员的文件。通过在配置底部添加以下行来设置文件的位置和名称:

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

此行将 Prosody 配置为读取文件 at/etc/prosody/sharedgroups.txt以收集组信息。您将在步骤 4 中使用用户和组填充此文件。

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

  • sudo touch /etc/prosody/sharedgroups.txt

touch当不使用其他选项时,实用程序会创建一个空文件。

添加聊天服务器虚拟主机配置

Prosody 使用配置块开始,VirtualHost以启动使用您的主机名的聊天服务器。

将以下配置块添加到配置底部:

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

配置选项:

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

添加聊天室服务器

此配置使 Prosody 能够为您的用户提供多用户聊天室。将以下配置块添加到配置文件底部的新部分中:

/etc/prosody/prosody.cfg.lua
...
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";
    }
...

使用的选项:

  • Component:启用muc(多用户聊天)群聊模块以使用room.your-domain主机名。
  • modules_enabled = { "mam_muc"; }:启用群聊的消息存档。
  • storage:将聊天消息存档到 SQLite 数据库中。
  • key:用于保护聊天连接的 TLS 私钥。
  • certificate:用于保护聊天连接的 TLS 私有证书。

保存并退出编辑器。

现在,重新启动 Prosody 以使新配置生效:

  • sudo systemctl restart prosody.service

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

第 4 步 – 添加 Prosody 用户和组

您必须在命令行上将 Prosody 用户添加到您的 Prosody 服务器,然后他们才能登录。您将使用prosodyctlprosody提供工具来帮助管理 Prosody 服务器。

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

  • sudo prosodyctl register sammy chat.your-domain password

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

如果您创建一些组,让他们可以看到彼此并查看他们的状态,那么您的用户将会很感激。您可以通过创建组并使用您之前定义的组文件向其中添加用户来完成此操作。

打开组文件:

  • sudo nano /etc/prosody/sharedgroups.txt

通过将其名称放在方括号之间来设置组。组的成员被放置在组名称下的新行上。您可以根据需要创建任意数量的组,并且用户可以是多个组的成员。

这是一个名为的组Everyone,它有两个成员:sammyadmin

/etc/prosody/sharedgroups.txt
[Everyone]
sammy@chat.your-domain
admin@chat.your-domain

同一组的所有成员都可以“看到”其他成员,无论他们是否在线。

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

  • sudo systemctl restart prosody.service

服务器配置剩下的就是允许 Prosody 通过防火墙进行通信,您将在下一节中执行此操作。

步骤 5 — 允许韵律流量通过防火墙

Prosody 侦听来自 TCP 端口52225322. 使用以下命令在您的 UFW 中打开这些端口:

  • sudo ufw allow 5222,5322/tcp

韵律服务器现已完全安装和配置。

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

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

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

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

不同的聊天客户端可能会以不同的格式询问用户名、密码和服务器主机名。用户名和服务器主机名有时像电子邮件地址一样放在一起,例如[email protected]. 类似电子邮件的地址可以称为用户名XMPP 地址

此图显示PSI客户端的登录屏幕,该屏幕要求以电子邮件地址形式输入用户名和服务器主机名。

显示 PSI 登录页面的图像

而 Linux XMPP 客户端Gajim的帐户登录屏幕的以下屏幕截图显示,用户名和主机名被赋予了单独的输入字段。

显示 Gajim 登录页面的图像

XMPP 客户端不需要比用户名、密码和服务器主机名更多的细节来登录。 登录后,您将能够找到聊天组的其他成员,您还可以创建群聊室您的客户支持这一点。

结论

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

  • TLS 加密
  • 一对一聊天室和群聊室。
  • 文件共享

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

如果您正在寻找远程通信的更多开源替代方案,请查看我们的如何安装 Jitsi Meet 教程

觉得文章有用?

点个广告表达一下你的爱意吧 !😁