如何在Linux上执行安全的Redis安装

Redis对许多事情都有益处,其中之一是缓存。您还可以将Redis用作主要数据存储,甚至用作数据库的替代品。但是,如何执行安全的Redis安装呢?安装Redis可能会很麻烦,如果不小心,可能会出现许多错误。幸运的是,本教程为您提供了帮助。

在本教程中,您将学习如何在Linux系统上安全地安装Redis,以及一些避免常见错误的技巧。

继续阅读,并避免为Redis安装错误而头痛!

先决条件

本教程将进行实践演示。如果您想跟着做,请确保具备以下条件:

  • 一台Ubuntu 20.04 LTS机器 – 本教程使用Ubuntu 20.04 LTS,但大多数Linux发行版的指令类似。
  • Root权限或具有sudo权限的非root用户

使用APT软件包管理器安装Redis

有几种在Ubuntu上安装Redis的方法,但在本教程中,您将使用APT软件包管理器来安装Redis。

Redis是用C语言编写的,因此您需要手动从源代码编译Redis。需要安装几个依赖项,并且构建过程并不是完全无误的。

从源代码编译Redis并不是推荐的方法,但好处是您可以根据需要自定义安装。您需要下载源代码,然后手动配置它。

打开终端并运行下面的apt update命令,以确保您拥有最新的软件包列表

sudo apt update -y
Updating the Linux system

现在,运行下面的apt install命令来在您的机器上安装Redis。

以下命令使用apt软件包管理器从Ubuntu存储库中下载并安装redis-server软件包到您的机器上。-y标志告诉apt在安装过程中自动接受提示。

sudo apt install redis-server -y
Installing Redis on your machine

配置Redis.conf文件以将Redis配置为服务运行

您刚刚安装了Redis,但它还没有准备好供使用。在您开始使用Redis之前,您需要首先配置redis.conf文件。

redis.conf配置文件已包含在您安装的Redis软件包中,并默认存储在/etc/redis/目录中。此文件包含了Redis的所有配置选项

.conf文件扩展名是合乎逻辑的,因为它遵循了一个常规模式。许多其他程序也使用这种相同的风格。例如,Apache Web服务器使用.conf文件扩展名作为其主配置文件。

1. 运行以下systemctl命令以停止 redis-server服务。在您刚开始使用Redis时,停止Redis服务的运行是一种推荐的做法。

sudo systemctl stop redis.service

2. 接下来,使用您喜欢的文本编辑器打开/etc/redis/redis.conf文件。

找到supervised指令,然后将其设置为systemd,如下所示,并保存更改。这样做会告诉操作系统将Redis作为服务运行。

Setting up the systemd directive

3. 现在,运行以下命令systemctl restart以重新启动Redis服务(redis.service),因为Redis服务还不知道这些更改。

sudo systemctl restart redis.service

4. 最后,运行以下命令systemctl status以查看Redis是否正在运行。

sudo systemctl status redis.service

如下所示,输出显示Redis服务正在运行。

Checking if Redis Service is Running

测试Redis服务器是否正常运行

您已配置并验证Redis服务正在正常运行,但这并不意味着Redis服务器正在工作。如何测试Redis服务器是否正常运行?连接到Redis服务器并发送命令,看服务器是否响应。

1. 运行以下命令redis-cli以连接到Redis服务器。redis-cli 是Redis的命令行界面,允许您向服务器发送命令并检查其状态。

redis-cli

如下,您可以看到您在Redis服务器提示符中(127.0.0.1:6379>)。redis-cli命令默认尝试连接到127.0.0.1:6379的Redis服务器。

Connecting to the Redis Server

2. 接下来,运行以下命令ping以检查Redis服务器是否可达。

ping

如您所见,服务器返回PONG,表示Redis服务器可达,现在可以成功与服务通信。

Pinging the Redis server

也许你还持怀疑态度;运行下面的set命令。set命令是一个Redis命令,用于在数据库中设置键值对。

set test "This is a test"

正如你所看到的,set命令返回“OK”,这表示Redis服务正常运行。

Testing the Redis server

3. 运行下面的exit命令以退出redis-cli。这样做会关闭与Redis服务器的连接。

exit

将Redis服务器绑定到本地主机

你刚刚测试了Redis服务器的正常工作,但它可能也可以从你网络中的其他设备访问。这种行为是不可取的,通常你会想要保护你的Redis服务器不受陌生人的干扰。

将Redis服务器绑定到本地主机会设置一个行为,只有安装了Redis的机器才能访问Redis服务器。

1. 在你的文本编辑器中打开/etc/redis/redis.conf文件。

2. 定位到包含bind 127.0.0.1 ::1的行,并通过删除行首的井号(#)取消该行的注释。

Uncommenting the bind 127.0.0.1 ::1 line

3. 现在,运行以下命令来重新启动redis-server服务。

sudo systemctl restart redis-server

4. 最后,运行以下命令来检查你的Redis服务器是否已绑定到本地主机。netstat -lnp命令会列出所有活动的网络连接,grep redis部分会将输出过滤为包含“redis”的行。

-lnp代表本地名称协议,是UNIX类系统用于将主机名解析为IP地址的网络协议。

sudo netstat -lnp | grep redis

您可以在下面看到,Redis服务器现在仅在本地接口(127.0.0.1:6379)上监听。反映在配置文件中的更改,您会发现在您的活动互联网连接(tcp)下,只有本地接口被列出。

现在,您网络中的其他设备无法连接到您的Redis服务器。

Listing all active network connections

使用密码保护Redis服务器连接

此时,Redis未设置要求用户使用密码进行身份验证。任何知道您的Redis服务器IP地址或主机名的人都可以连接并更改其数据。

如何保护您的Redis服务器?设置一个密码,要求用户在连接到您的Redis服务器时进行身份验证。

1. 重新打开您的文本/代码编辑器中的redis.conf配置文件。

2. 接下来,使用以下内容设置一个强密码:

  • 查找SECURITY部分下的requirepass foobared
  • 删除行首的井号(#
  • foobared替换为您选择的强密码,然后保存更改
Providing a secure password

3. 运行以下命令重新启动并连接到您的Redis服务器。

sudo systemctl restart redis-server
redis-cli

4. 现在,运行ping命令查看是否从服务器获得响应。

ping

以下是一个错误消息,显示NOAUTH需要认证。该消息表明您需要一个认证密码来远程访问您的Redis服务器。

Testing connection with the server

5. 运行以下auth命令,后跟您的密码,以验证您与Redis服务器的连接。

auth Qae9p_fY:YjdtJ7k

当身份验证成功时,您将收到一个OK响应,就像下面的例子一样。

Authenticating Redis Server Connection

6. 最后,重新运行ping命令,以测试您是否已经对Redis服务器的连接进行了身份验证。

ping

在成功验证连接后,您现在将获得PONG响应,如下所示。此时,您已成功保护了您的Redis服务器。

Pinging the Redis server

禁用危险命令以保护您的Redis服务器

设置密码来验证对Redis服务器的连接并不意味着它得到了100%的保护。默认情况下,Redis包含几个危险命令,允许用户更改您的数据库中的数据。

当未经授权的用户运行时,这些命令允许入侵者读取、修改、销毁甚至抹消您的Redis数据库中的数据。

以下不是一个全面的列表,因为您的Redis服务器可能有其他危险命令,但在大多数情况下,这些是危险命令:

FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF
BGSAVE, SAVE, SPOP, SREM, RENAME, DEBUG, EVAL

为了进一步保护您的Redis服务器,请在redis.conf文件中重命名这些危险命令:

1. 在您的文本编辑器中打开redis.conf文件,并查找命令重命名部分。

按照以下语法将命令重命名为空字符串以禁用它们。将the-command替换为要禁用的实际命令。

rename-command the-command ""

例如,通过将CONFIG命令重命名为空字符串来禁用CONFIG命令,如下所示,然后保存更改。双引号(“”)表示一个空字符串,这表示禁用一个命令。

Renaming the CONFIG command

2. 从文本编辑器退出,并运行下面的命令来重启Redis服务器。

sudo systemctl restart redis-server

3. 现在运行以下命令以连接到您的Redis服务器。

redis-cli
auth Qae9p_fY:YjdtJ7k

4. 最后,运行config get命令来测试CONFIG命令是否已被禁用。

config get requirepass

您将获得一个ERR unknown command config的响应,如下所示,这表示CONFIG命令已被禁用。

Checking the CONFIG command

如果config get requirepass命令继续执行,它会向您的Redis服务器请求密码以验证连接到您的Redis服务器的连接。

您现在已经成功地重命名了一个危险的Redis命令,以保护您的Redis服务器。现在请继续在redis.conf文件中禁用其他危险命令。

使用防火墙阻止连接请求到Redis服务器

保护Redis服务器的另一种方式是设置防火墙。设置防火墙需要您只允许每个在您的服务器上运行的服务所需的端口。

例如,如果您在服务器上运行 Redis,端口号为6379,那么您只需要打开该端口。如果您需要允许来自特定 IP 地址或一系列地址的访问,您可以将这些地址添加到防火墙规则中。

要设置防火墙,您首先需要安装一个防火墙配置工具。此示例使用UFW,这是 Linux 上常用的防火墙配置工具。但您也可以使用其他工具,例如iptables来设置防火墙。

1. 运行以下命令在您的机器上安装 UFW。

sudo apt install ufw -y

2. 接下来,运行以下命令启用 UFW。

sudo ufw enable

当您看到下面显示的提示时,请输入‘Y’以继续运行命令。

Enabling UFW

3. 运行下面的ufw命令添加一个规则,允许端口6379上的流量通过,以供您的 Redis 服务器使用。请用您预期用户的 IP 地址替换11.22.33.44 IP 地址。

sudo ufw allow from 11.22.33.44 to any port 6379
Adding a firewall rule to allow traffic on port 6379

4. 最后,运行以下命令验证您是否成功添加了防火墙规则。该命令检查防火墙的status

sudo ufw status

您可以在下面的输出中看到防火墙已激活,并且已添加了一个规则,允许来自 IP 地址11.22.33.44 的 Redis 流量通过端口6379

Checking the UFW rules

现在,任何具有 IP 地址为 11.22.33.44 的用户都可以通过端口 6379 连接到 Redis,并且需要使用密码进行身份验证。您可以以类似的方式为其他服务添加额外的端口。

结论

在本教程中,您已经学会了如何通过将危险命令重命名为空字符串并设置防火墙来安装和保护您的 Redis 服务器。

有了这些新知识,您可以充分享受 Redis 的全部好处,而不必担心将服务器暴露于不必要的风险中。

想要了解更多吗?为什么不从在 Kubernetes 中保护 Redis 服务器开始呢?

Source:
https://adamtheautomator.com/redis-install/