如何在 Rocky Linux 8 上安装和保护 Redis如何在 Rocky Linux 8 上安装和保护 Redis如何在 Rocky Linux 8 上安装和保护 Redis如何在 Rocky Linux 8 上安装和保护 Redis
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Rocky Linux 8 上安装和保护 Redis

介绍

Redis 是一种开源的内存键值数据存储,擅长缓存。 Redis 是一种非关系 数据库,以其灵活性、性能、可扩展性和广泛的语言支持而闻名。

Redis 是为受信任的客户端在受信任的环境中使用而设计的,它自己没有强大的安全功能。但是,Redis 确实具有一些安全功能,例如密码身份验证以及重命名或禁用某些命令的能力。本教程提供有关如何安装 Redis 和配置这些安全功能的说明。它还涵盖了一些其他设置,这些设置可以提高 Rocky Linux 8 上独立 Redis 安装的安全性。

请注意,本指南不涉及 Redis 服务器和客户端应用程序位于不同主机或不同数据中心的情况。 Redis 流量必须穿越不安全或不受信任的网络的安装将需要一组不同的配置,例如在 Redis 机器之间设置 SSL 代理或 VPN。

您还可以使用 DigitalOcean 的托管 Redis 服务。

先决条件

要完成本教程,您需要一台运行 Rocky Linux 8 的服务器。该服务器应该有一个具有管理权限的非 root 用户和一个配置有 firewalld 的防火墙。要进行设置,请遵循我们的 Rocky Linux 8 初始服务器设置指南。

第 1 步 — 安装和启动 Redis

您可以使用 DNF 包管理器安装 Redis。使用 DNF,您可以安装 Redis、它的依赖项和 nano,一个用户友好的文本编辑器。您不必安装 nano,但我们将在本指南的示例中使用它:

  1. sudo dnf install redis nano

此命令将提示您确认是否要安装选定的软件包。按 y 然后按 ENTER 这样做:

Output
. . . Total download size: 1.5 M Installed size: 5.4 M Is this ok [y/N]: y

在此之后,需要对 Redis 配置文件进行一项重要的配置更改,该文件是在安装过程中自动生成的。

使用您喜欢的文本编辑器打开此文件。这里我们将使用 nano:

  1. sudo nano /etc/redis.conf

在文件中,找到 supervised 指令。该指令允许您声明一个初始化系统来将 Redis 管理为一项服务,从而为您提供对其操作的更多控制。 supervised 指令默认设置为 no。由于您正在运行使用 systemd init 系统的 Rocky Linux,因此将其更改为 systemd:

. . .

# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
#   supervised no      - no supervision interaction
#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
#   supervised auto    - detect upstart or systemd method based on
#                        UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
#       They do not enable continuous liveness pings back to your supervisor.
supervised systemd

. . .

这是此时您需要对 Redis 配置文件进行的唯一更改,因此请在完成后保存并关闭它。如果您使用 nano 编辑文件,您可以使用 CTRL + X 保存并退出,然后在出现提示时,按 Y 然后回车。

编辑文件后,启动Redis服务:

  1. sudo systemctl start redis.service

如果您希望 Redis 在开机时启动,您可以使用 enable 命令启用它:

  1. sudo systemctl enable redis

请注意,此命令在单元文件名后不包含 .service 后缀。您通常可以将此后缀从 systemctl 命令中删除,因为它可以从服务名称中自动解析。

您可以通过运行以下命令来检查 Redis 的状态:

  1. sudo systemctl status redis
Output
● redis.service - Redis persistent key-value database Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/redis.service.d └─limit.conf Active: active (running) since Tue 2022-09-06 22:11:52 UTC; 40s ago Main PID: 14478 (redis-server) Tasks: 4 (limit: 11152) Memory: 6.6M CGroup: /system.slice/redis.service └─14478 /usr/bin/redis-server 127.0.0.1:6379

确认 Redis 确实在运行后,您可以使用以下命令测试其功能:

  1. redis-cli ping

这应该打印 PONG 作为响应:

Output
PONG

如果是这种情况,则意味着您现在已经在服务器上运行了 Redis,您可以开始配置它以增强其安全性。

第 2 步 — 配置 Redis 并使用防火墙保护它

保护 Redis 的一种有效方法是保护其运行的服务器。为此,您可以确保 Redis 仅绑定到本地主机或私有 IP 地址,并且服务器已启动并运行防火墙。

但是,如果您选择使用其他教程设置 Redis,那么您可能已经更新了配置文件以允许来自任何地方的连接。这不如绑定到本地主机或私有 IP 安全。

要解决此问题,请使用您喜欢的文本编辑器再次打开 Redis 配置文件:

  1. sudo nano /etc/redis.conf

找到以 bind 开头的行,并通过删除行开头的 # 符号确保它没有被注释掉 或被禁用必要的:

. . .
bind 127.0.0.1

如果您需要将 Redis 绑定到另一个 IP 地址(例如您将从单独的主机访问 Redis 的情况),您应该强烈考虑将其绑定到私有 IP 地址。绑定到公共 IP 地址会增加您的 Redis 接口对外部各方的暴露:

. . .
bind your_private_ip

确认 bind 指令没有被注释掉后,就可以保存并关闭文件了。

如果您已遵循先决条件初始服务器设置教程并在您的服务器上安装了 firewalld,并且您不打算从另一台主机连接到 Redis,那么您不需要为 Redis 添加任何额外的防火墙规则。毕竟,除非防火墙规则明确允许,否则默认情况下将丢弃任何传入流量。由于 Redis 服务器的默认独立安装仅在环回接口(127.0.0.1 或 localhost)上侦听,因此无需担心其默认端口上的传入流量。

但是,如果您确实计划从另一台主机访问 Redis,则需要使用 firewall-cmd 命令对您的 firewalld 配置进行一些更改。同样,您应该只允许使用主机的私有 IP 地址从您的主机访问您的 Redis 服务器,以限制您的服务暴露的主机数量。

首先,向您的 firewalld 策略添加一个专用的 Redis 区域:

  1. sudo firewall-cmd --permanent --new-zone=redis

然后指定您想要打开的端口。 Redis 默认使用端口6379:

  1. sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp

接下来,指定应允许通过防火墙并访问 Redis 的任何私有 IP 地址:

  1. sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP

运行这些命令后,重新加载防火墙以实施新规则:

  1. sudo firewall-cmd --reload

在此配置下,当防火墙遇到来自您客户端 IP 地址的数据包时,它会将专用 Redis 区域中的规则应用于该连接。所有其他连接将由默认的 public 区域处理。默认区域中的服务适用于每个连接,而不仅仅是那些不明确匹配的连接,因此您无需将其他服务(例如 SSH)添加到 Redis 区域,因为这些规则将自动应用于该连接。

请记住,使用任何防火墙工具都可以,无论您使用 firewalld、ufw 还是 iptables。重要的是防火墙已启动并正在运行,这样未知的人就无法访问您的服务器。在下一步中,您会将 Redis 配置为只能使用强密码访问。

第 3 步 — 配置 Redis 密码

配置 Redis 密码可启用其内置安全功能之一——auth 命令——这要求客户端在被允许访问数据库之前进行身份验证。和bind设置一样,密码直接在Redis的配置文件/etc/redis.conf中配置。重新打开该文件:

  1. sudo nano /etc/redis.conf

滚动到 SECURITY 部分并查找带有注释的指令,内容如下:

. . .
# requirepass foobared

通过删除 # 取消注释,并将 foobared 更改为您选择的非常强的密码。

注意:您可以使用 apg 或 pwgen 等工具生成密码,而不是自己创建密码。但是,如果您不想安装应用程序只是为了生成密码,则可以使用以下命令。此命令回显一个字符串值并将其通过管道传输到以下 sha256sum 命令中,该命令将显示字符串的 SHA256 校验和。

请注意,按照写入的方式输入此命令每次都会生成相同的密码。要创建唯一密码,请将引号中的字符串更改为任何其他单词或短语:

  1. echo "digital-ocean" | sha256sum

虽然生成的密码不会好记,但是会很长很长,这正是Redis需要的密码类型。将该命令的输出复制并粘贴为 requirepass 的新值后,它应该显示为:

. . .
requirepass password_copied_from_output

或者,如果您更喜欢较短的密码,则可以使用不同校验和的输出。同样,更改引号中的单词,这样它就不会生成与此命令相同的密码:

  1. echo "digital-ocean" | sha1sum

设置密码后,保存并关闭文件,然后重启Redis:

  1. sudo systemctl restart redis

要测试密码是否有效,请打开 Redis 客户端:

  1. redis-cli

以下是用于测试 Redis 密码是否有效的一系列命令。第一个命令尝试在身份验证之前将键设置为值:

  1. set key1 10

这将不起作用,因为您还没有通过身份验证,因此 Redis 会返回一个错误:

Output
(error) NOAUTH Authentication required.

以下命令使用 Redis 配置文件中指定的密码进行身份验证:

  1. auth your_redis_password

Redis 将确认您已通过身份验证:

Output
OK

之后,再次运行之前的命令应该会成功:

  1. set key1 10
Output
OK

get key1 命令向 Redis 查询新键的值:

  1. get key1
Output
"10"

最后一条命令退出 redis-cli。您还可以使用 exit:

  1. quit

现在,未经授权的用户应该很难访问您的 Redis 安装。请注意,如果您已经在使用 Redis 命令行客户端,然后重新启动 Redis,则需要重新进行身份验证。另外请注意,如果没有 SSL 或 VPN,如果您远程连接到 Redis,此密码仍可能被外部各方拦截。

接下来,本指南将重命名 Redis 命令以进一步保护 Redis 免受恶意行为者的侵害。

第 4 步 — 重命名危险命令

Redis 内置的另一个安全功能允许您重命名或完全禁用某些被认为危险的命令。当由未经授权的用户运行时,这些命令可用于重新配置、销毁或以其他方式擦除您的数据。一些被认为是危险的命令包括:

  • FLUSHDB
  • FLUSHALL
  • 键
  • PEXPIRE
  • 删除
  • 配置
  • 关机
  • BGREWRITEAOF
  • BGSAVE
  • 保存
  • SPOP
  • SREM
  • 重命名
  • 调试

这不是一个完整的列表,但重命名或禁用此列表中的所有命令有助于提高数据存储的安全性。是否应该禁用或重命名给定命令将取决于您的具体需要。如果您知道您永远不会使用可能被滥用的命令,那么您可以禁用它。否则,您应该重命名它。

与身份验证密码一样,重命名或禁用命令在 /etc/redis.conf 文件的 SECURITY 部分中配置。要启用或禁用 Redis 命令,请再次打开配置文件进行编辑:

  1. sudo nano /etc/redis.conf

注意:这些是示例。您应该选择禁用或重命名对您有意义的命令。您可以在 redis.io/commands 了解有关 Redis 命令的更多信息并确定它们可能如何被滥用。

要禁用或终止命令,请将其重命名为空字符串,如下所示:

# It is also possible to completely kill a command by renaming it into
# an empty string:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""

要重命名命令,请给它另一个名称,如下例所示。重命名的命令应该让别人很难猜到,但对你来说很容易记住:

# It is also possible to completely kill a command by renaming it into
# an empty string:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG

保存更改并关闭文件。然后通过重新启动 Redis 来应用更改:

  1. sudo systemctl restart redis.service

要测试您的新命令,请输入 Redis 命令行:

  1. redis-cli

使用您之前定义的密码验证您自己:

  1. auth your_redis_password
Output
OK

假设您将 CONFIG 命令重命名为 ASC12_CONFIG,尝试使用 config 命令将失败:

  1. config get requirepass
Output
(error) ERR unknown command 'config'

改为调用重命名的命令将会成功。请注意,Redis 命令不区分大小写:

  1. asc12_config get requirepass
Output
1) "requirepass" 2) "your_redis_password"

最后,您可以退出 redis-cli:

  1. exit

警告:关于重命名命令,在 /etc/redis.conf 文件的 SECURITY 部分末尾有一个警告声明,内容如下:

. . .

# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to replicas may cause problems.

. . .

这意味着如果重命名的命令不在 AOF 文件中,或者如果它在但 AOF 文件尚未传输到副本,那么应该没有问题。在重命名命令时请记住这一点。重命名命令的最佳时间是在您不使用 AOF 持久性时或刚安装后(即,在部署使用 Redis 的应用程序之前)。

第 5 步 — 设置数据目录所有权和文件权限

此步骤将经历您可能需要进行的一些所有权和权限更改,以改进 Redis 安装的安全配置文件。这涉及确保只有需要访问 Redis 的用户才有权读取其数据。默认情况下,该用户是 redis 用户。

您可以通过 grep 在其父目录的长列表中对 Redis 数据目录进行验证。此命令及其输出如下所示:

  1. ls -l /var/lib | grep redis
Output
drwxr-x---. 2 redis redis 22 Sep 6 22:22 redis

此输出表明 Redis 数据目录由 redis 用户所有,并向 redis 组授予了二级访问权限。此所有权设置是安全的,因为文件夹的权限使用八进制表示法设置为 750。

如果您的 Redis 数据目录具有不安全的权限,您可以通过运行 chmod 命令确保只有 Redis 用户和组可以访问该文件夹及其内容。以下示例将此文件夹的权限设置更改为 770:

  1. sudo chmod 770 /var/lib/redis

您可能需要更改的另一个权限是 Redis 配置文件的权限。默认情况下,它具有 640 的文件权限,由 root 拥有,root 组具有二级所有权:

  1. ls -l /etc/redis.conf
Output
-rw-r-----. 1 redis root 62192 Sep 6 22:20 /etc/redis.conf

该权限 (640) 意味着 Redis 配置文件只能由 redis 用户和根组读取。因为配置文件中包含你在第4步中配置的未加密密码,所以redis.conf应该属于redis用户,redis组是二级所有权。要设置它,请运行以下命令:

  1. sudo chown redis:redis /etc/redis.conf

然后更改权限,以便只有文件的所有者可以读取和写入它:

  1. sudo chmod 600 /etc/redis.conf

您可以通过再次运行之前的 ls 命令来验证新的所有权和权限:

  1. ls -l /var/lib | grep redis
Output
total 40 drwxrwx---. 2 redis redis 22 Sep 6 22:22 redis
  1. ls -l /etc/redis.conf
Output
total 40 -rw-------. 1 redis redis 62192 Sep 6 22:20 /etc/redis.conf

最后,重新启动 Redis 以反映这些更改:

  1. sudo systemctl restart redis

这样,您的 Redis 安装就安全了。

结论

请记住,一旦有人登录到您的服务器,就有可能绕过您设置的特定于 Redis 的安全功能。这就是为什么本教程中介绍的最重要的安全功能是防火墙,因为它可以防止未知用户首先登录您的服务器。

如果您试图通过不受信任的网络保护 Redis 通信,您必须使用 SSL 代理,正如 Redis 开发人员在官方 Redis 安全指南中所推荐的那样。

©2015-2025 艾丽卡 support@alaica.com