Rocky Linux 9安装与安全配置Redis完整指南(2023)

引言

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

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

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

先决条件

要完成本教程,您需要一台运行Rocky Linux 9的服务器。这台服务器应该有一个具备管理员权限的非root用户,并且配置了firewalld防火墙。要进行设置,请按照我们的Rocky Linux 9初始服务器设置指南进行操作。

第一步 – 安装和启动Redis

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

sudo dnf install redis nano

这个命令会提示您确认是否要安装所选的软件包。按 y 然后按 ENTER 来进行确认:

输出
. . .
Total download size: 2.0 M
Installed size: 7.4 M
Is this ok [y/N]: y

接下来,在Redis配置文件中需要进行一个重要的配置更改,该配置文件在安装过程中自动生成。

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

sudo nano /etc/redis/redis.conf

在文件中找到supervised指令。该指令允许您声明一个初始化系统来将Redis作为服务进行管理,从而提供更多对其操作的控制权。默认情况下,supervised指令是设置为no的。由于您正在运行Rocky Linux,它使用systemd作为初始化系统,如果需要的话,请取消该行的注释(去掉行首的#),并将它改为systemd。

/etc/redis/redis.conf文件内容如下:

. . .

# 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,然后按Enter。

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

sudo systemctl start redis.service

如果您想让Redis在启动时自动运行,您可以使用enable命令将其启用。

sudo systemctl enable redis

请注意,此命令在单元文件名后面不包括.service后缀。通常情况下,在systemctl命令中可以省略此后缀,因为它可以自动从服务名称中解析出来。

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

sudo systemctl status redis
输出
● 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确实在运行,您可以使用这个命令来测试其功能。

redis-cli ping

这应该作为回应打印出”PONG”。

输出
PONG

如果是这样的话,意味着您现在的服务器上已经安装了Redis,您可以开始配置它以提高安全性。

步骤二 — 配置Redis并通过防火墙加以保护

这是文章《如何在Rocky Linux 9上安装和保护Redis》的第2部分(共5部分)。

保护Redis的有效方法是确保它运行在安全的服务器上。你可以通过将Redis绑定到本地主机或私有IP地址,并确保服务器运行着防火墙来实现此目标。

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

为了解决这个问题,再次使用您偏好的文本编辑器打开Redis配置文件。

sudo nano /etc/redis/redis.conf

请定位以bind开头的行,并确保该行未被注释或禁用,如果需要,请移除行首的#符号。

Redis的配置文件位于 /etc/redis/redis.conf

. . .
bind 127.0.0.1 -::1

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

/etc/redis/redis.conf 的原文翻译如下:

. . .
bind 您的私有IP

确认绑定指示没有被注释掉后,你可以保存并关闭文件。

如果你按照先决条件的初步服务器设置教程并在服务器上安装了防火墙,而且你没有计划从另一个主机连接到Redis,那么你不需要为Redis添加任何额外的防火墙规则。毕竟,任何进入的流量都会被默认拦截,除非由防火墙规则明确允许。由于默认独立安装的Redis服务器仅在回环接口上监听(127.0.0.1或本地主机),所以对其默认端口的进入流量不应引起任何担忧。

然而,如果您计划从另一台主机访问Redis,您需要使用firewall-cmd命令对您的firewalld配置进行一些更改。同样,为了限制您的服务暴露给的主机数量,您应仅允许使用它们的私有IP地址从主机上访问您的Redis服务器。

首先,在您的firewalld策略中添加一个专用的Redis区域。

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

然后指定您希望打开的端口。Redis默认使用端口6379。

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

接下来,请指定可以通过防火墙,并且访问Redis的任何私有IP地址。

sudo firewall-cmd --permanent --zone=redis --add-source=客户端服务器私有IP

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

sudo firewall-cmd --reload

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

请记住,使用任何防火墙工具都可以,无论您使用的是 firewalld、ufw 还是 iptables。重要的是防火墙正常运行,以阻止未知个体访问您的服务器。下一步,您将配置 Redis 仅通过强密码访问。

第三步 — 配置Redis密码

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

sudo nano /etc/redis/redis.conf

滚动到安全部分并查找一个有评论的指示,其中写着:

/etc/redis/redis.conf

. . .
# requirepass foobared

去掉#号,取消它,并将foobared更改为您自己选择的强密码。

注意:

与其自己编写一个密码,您可以使用像apg或pwgen这样的工具来生成一个密码。但是,如果您不想安装应用程序来生成密码,您可以使用以下命令。该命令将输出一个字符串,并将其传递给以下的sha256sum命令,该命令将显示该字符串的SHA256校验和。

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

echo "digital-ocean" | sha256sum

尽管生成的密码可能不容易记忆,但它将非常强大和长,这正是Redis所需要的密码类型。在将该命令的输出复制并粘贴为requirepass的新值之后,应该这样写:

/etc/redis/redis.conf

. . .
requirepass 从输出复制的密码

或者,如果你喜欢较短的密码,你可以使用另外一个校验和的输出。同样,请更改引号中的单词,以便不生成与此命令相同的密码:

echo "digital-ocean" | sha1sum

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

  1. sudo systemctl restart redis

为了测试密码是否正确,请打开Redis客户端。

  1. redis-cli

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

  1. set key1 10

由于您尚未进行身份验证,因此Redis返回错误,所以这种方法不会起作用。

输出

(error) NOAUTH Authentication required.

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

  1. auth your_redis_password

Redis会确认您已通过身份验证。

输出

OK

之后,再次运行上述命令应该会成功。

  1. set key1 10
输出

OK

使用get key1命令查询Redis新key的值。

  1. get key1
输出

"10"

这个最后的命令是用来退出redis-cli的。你也可以使用exit来退出。

  1. quit

现在,未经授权的用户应该很难访问到您的Redis安装。请注意,如果您已经在使用Redis命令行客户端并重新启动Redis,您需要重新认证。另外,请注意,如果您远程连接到Redis且没有使用SSL或VPN,这个密码仍然可能被外部人员截获。

接下来,本指南将介绍重新命名Redis命令,以进一步保护Redis免受恶意行为的影响。

第四步 – 重命名危险命令

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

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

这不是一个全面的清单,但是重命名或禁用清单中的所有命令可以帮助提升您的数据存储的安全性。是否应该禁用或重命名特定命令将取决于您的具体需求。如果您知道您永远不会使用一个可能被滥用的命令,那么您可以将其禁用。否则,您应该选择重命名命令。

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

  1. sudo nano /etc/redis/redis.conf

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

要禁用或取消一个命令,将其重命名为空字符串,像这样:

# 也可以通过将命令重命名为空字符串来完全禁用命令:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""

为命令重新命名,给它一个像下面的例子中那样的别名。重新命名的命令应该对别人来说很难猜到,但对你来说容易记住。

Redis 配置文件位于 /etc/redis/redis.conf

# 也可以通过将命令重命名为空字符串来完全禁用该命令:
#
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
输出

OK

假设你将CONFIG命令重新命名为ASC12_CONFIG,尝试使用config命令将会失败。

  1. config get requirepass
输出

(error) ERR unknown command 'config'

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

  1. asc12_config get requirepass
输出

1) "requirepass" 2) "your_redis_password"

最后,你可以从redis-cli退出。

  1. exit

警告:关于重命名命令,在/etc/redis/redis.conf文件的安全性部分末尾有一条警示语,如下所示:

/etc/redis/redis.conf

. . .# 请注意,更改被记录到AOF文件或传输到副本中的命令的名称可能会导致问题。

. . .

这意味着,如果重命名的命令不在AOF文件中,或者在AOF文件中但尚未传输到副本中,则不应该会有问题。在重命名命令时,请牢记这一点。最好的时机是在不使用AOF持久化或安装后的初始阶段(即在Redis应用程序被部署之前)进行重命名。

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

为了提高您的Redis安装的安全性,该步骤将进行一些所有权和权限的更改。这包括确保只有需要访问Redis的用户具有读取数据的权限。默认情况下,这个用户是redis用户。

您可以通过在其父目录的长列表中使用grep命令来验证这一点,查找Redis数据目录。以下是该命令及其输出:

  1. ls -l /var/lib | grep redis
输出

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 所有,根组具有二级所有权。

  1. ls -l /etc/redis/redis.conf
输出

-rw-r-----.

-rw-r—–. 1 redis root 62192 Sep 6 22:20 /etc/redis/redis.conf

这个权限(640)意味着Redis配置文件只能被redis用户和root组读取。因为配置文件包含了步骤4中你配置的未加密的密码,redis.conf应该归属于redis用户所有,并且由redis组作为次要所有者。要设置这个,请运行以下命令:

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

然后更改权限,只有文件所有者能够读取和写入它。

  1. sudo chmod 600 /etc/redis/redis.conf

您可以再次运行先前的ls命令来验证新的所有权和权限。

  1. ls -l /var/lib | grep redis
输出

total 40 drwxrwx—. 2 redis redis 22 Sep 6 22:22 redis

  1. ls -l /etc/redis/redis.conf
输出

total 40 -rw——-. 1 redis redis 62192 Sep 6 22:20 /etc/redis/redis.conf

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

  1. sudo systemctl restart redis

通过这样,您的Redis安装已经得到保护。

结论

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

如果您试图在不受信任的网络中保护Redis通信,您将需要使用SSL代理,正如Redis开发人员在官方的Redis安全指南中建议的那样。

bannerAds