如何在Ubuntu18.04上安装Prosody

来自菜鸟教程
跳转至:导航、​搜索

作为 Write for DOnations 计划的一部分,作者选择了 Open Internet/Free Speech Fund 来接受捐赠。

介绍

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

XMPP是由互联网工程任务组(IETF)维护的成熟开放的标准。 它在许多应用程序中得到积极维护和部署,例如被数百万用户使用的 Google Talk。 XMPP 服务器,如 Prosody,是一种灵活的选择,适用于已经存在了二十多年的聊天服务器。

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

先决条件

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

  • 按照 Initial Server Setup with 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 证书来加密服务器和客户端之间的连接。 这些证书与您在访问具有 HTTPS URL 的网站时使用的证书相同。 Let's Encrypt 是一个提供免费 TLS 证书的非营利组织。 他们还提供 certbot 实用程序来获取和管理他们的证书。 在此步骤中,您将安装 certbot 实用程序并使用它为您指向服务器的两个主机名获取一对证书。

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

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

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 服务器的主机名。

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

OutputSaving 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 用户和权限,文章 An Introduction to Linux Permissions 提供了很好的介绍。

第一步是使用以下命令将私钥的组所有者更改为 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 实用程序更改文件和目录的组所有者。 在这里,您将组从默认的 root 更改为 prosody

接下来,将包含 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 实用程序来修改哪些用户和组对文件和目录具有读取、写入和执行权限。

您可以测试 Prosody 是否可以读取私钥,方法是使用 sudocat 作为 prosody 用户读取私钥文件:

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 进行任何更改。 如果一切都成功,那么您将看到以下输出:

OutputCongratulations, 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 = { "admin@chat.your-domain" }
...

如果要添加另一个用户,则必须在第一个用户后加逗号:

/etc/prosody/prosody.cfg.lua

...
admins = { "admin@chat.your-domain", "sammy@chat.your-domain" }
...

启用韵律模块

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 和 SQLite。 SQLite 是最容易设置和维护的,使用最少的资源,并且适用于较小的部署。

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

/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 在 localhost127.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 配置为读取 /etc/prosody/sharedgroups.txt 处的文件以收集组信息。 您将在步骤 4 中使用用户和组填充此文件。

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

sudo touch /etc/prosody/sharedgroups.txt

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

添加聊天服务器 VirtualHost 配置

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 服务器,然后他们才能登录。 您将使用 prosody 软件包随附的 prosodyctl 工具来帮助管理 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 流量通过防火墙

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

sudo ufw allow 5222,5322/tcp

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

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

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

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

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

不同的聊天客户端可能会要求提供不同格式的用户名、密码和服务器主机名。 用户名和服务器主机名有时像电子邮件地址一样放在一起,例如 sammy@chat.your-domain。 类似电子邮件的地址可以称为 用户名XMPP 地址

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

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

除了用户名、密码和服务器主机名之外,XMPP 客户端不需要任何详细信息即可登录。 登录后,您将能够找到聊天组的其他成员,并且您还可以在客户支持的情况下创建群聊室。

结论

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

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

您还配置了 XMPP 聊天客户端以使用所有这些功能,从而为您与朋友和同事提供功能丰富的聊天。

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