如何在Rocky Linux 8上安装和保护Redis
首先要介绍的是
Redis是一个开源的、内存中的键值数据存储,擅长缓存。Redis是一个非关系型数据库,以其灵活性、性能、可扩展性和广泛的语言支持而闻名。
Redis是为可信的客户端在可信的环境中使用所设计的,它自身没有健全的安全功能。然而,Redis确实具有一些安全功能,如密码身份验证以及重命名或禁用部分命令的能力。本教程提供了安装Redis和配置这些安全功能的说明。它还涵盖了一些其他设置,可以增强Rocky Linux 8上独立Redis安装的安全性。
请注意,本指南不涵盖Redis服务器和客户端应用程序位于不同主机或不同数据中心的情况。在Redis流量必须穿越不安全或不可信网络的安装中,需要进行一组不同的配置,例如设置SSL代理或在Redis机器之间设置VPN。
您也可以使用Silicon Cloud的托管Redis服务。
先决条件
为了完成这个教程,您需要一个运行Rocky Linux 8的服务器。该服务器应该有一个具有管理员特权的非root用户,并且配置有firewalld的防火墙。要设置这个,请按照我们为Rocky Linux 8的初始服务器设置指南进行操作。
第一步——安装和启动Redis
您可以使用DNF软件包管理器安装Redis。使用DNF,您可以安装Redis及其依赖项,还可以安装一个用户友好的文本编辑器nano。您不必安装nano,但在本指南中我们将使用它进行示例演示。
- sudo dnf install redis nano
这个命令会提示你确认是否要安装所选的软件包。按下y键,然后按回车键来执行确认。
Output. . .
Total download size: 1.5 M
Installed size: 5.4 M
Is this ok [y/N]: y
随后,在安装过程中自动生成的Redis配置文件中,需要进行一个重要的配置更改。
使用您喜欢的文本编辑器打开此文件。这里我们将使用nano。
- sudo nano /etc/redis.conf
在文件中找到”supervised”指令。这个指令允许你声明一个初始化系统来管理Redis作为服务,并为你提供更多对其操作的控制。默认情况下,”supervised”指令的设置为”no”。由于你正在运行Rocky Linux,它使用systemd初始化系统,将其更改为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键,最后按Enter键。
编辑文件后,启动Redis服务。
- sudo systemctl start redis.service
如果您希望Redis在启动时自动运行,可以使用enable命令来启用它。
- sudo systemctl enable redis
请注意,这个命令在单元文件名后面没有包含“.service”后缀。通常情况下,你可以在systemctl命令中省略这个后缀,因为它可以从服务名称中自动解析出来。
你可以通过运行以下命令来检查Redis的状态。
- 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确实正在运行,您可以使用以下命令测试其功能:
- redis-cli ping
这应该打印出 “PONG” 作为响应。
OutputPONG
如果是这种情况,这意味着您现在在您的服务器上运行着Redis,并且您可以开始配置它以增强其安全性。
第二步 — 配置Redis并通过防火墙保护
保护Redis的一种有效方法是确保它所运行的服务器安全。您可以通过确保Redis仅绑定到localhost或私有IP地址,并且服务器运行着防火墙来实现这一点。
如果你选择使用另外一个教程来设置Redis,那么你可能已经更新了配置文件以允许任意地方的连接。这不像绑定到本地主机或私有IP那样安全。
为了解决这个问题,请再次使用您喜欢的文本编辑器打开Redis配置文件。
- sudo nano /etc/redis.conf
找到以bind开头的行,并确保它没有被注释或禁用,通过删除行首的#符号(如果需要的话)。
. . .
bind 127.0.0.1
如果您需要将Redis绑定到另一个IP地址(例如在从另一台主机访问Redis的情况下),您应该强烈考虑将其绑定到私有IP地址。绑定到公网IP地址会增加对外界的Redis接口的曝露。
. . .
bind your_private_ip
在确认绑定指令没有被注释掉之后,你可以保存并关闭该文件。
如果您按照先决条件的初始服务器设置教程并在服务器上安装了firewalld,并且不打算从另一台主机连接到Redis,那么您不需要为Redis添加任何额外的防火墙规则。毕竟,默认情况下,除非防火墙规则明确允许,否则任何传入流量都将被丢弃。由于默认的独立安装的Redis服务器仅侦听回环接口(127.0.0.1或localhost),因此对其默认端口的传入流量不应引起任何担忧。
不过,如果你打算从另一台主机访问Redis,你需要使用firewall-cmd命令对你的firewalld配置进行一些更改。同样地,为了限制服务暴露给的主机数量,你应该只允许通过使用其私有IP地址来访问你的Redis服务器。
首先,在您的防火墙策略中添加一个专用的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=client_server_private_IP
在运行这些命令之后,重新加载防火墙以实施新的规则。
- sudo firewall-cmd --reload
在这个配置下,当防火墙遇到来自客户端IP地址的数据包时,它将对该连接应用专用Redis区域中的规则。所有其他连接将由默认的公共区域处理。默认区域中的服务适用于每个连接,不仅仅是那些没有明确匹配的连接,因此您不需要将其他服务(如SSH)添加到Redis区域,因为这些规则将自动应用到该连接。
记住使用任何防火墙工具都可以,无论是使用firewalld、ufw还是iptables。重要的是,防火墙处于启动状态,以防止未知个体访问您的服务器。在下一步中,您将配置Redis只能通过强密码访问。
第三步 — 配置 Redis 密码
在 Redis 配置文件 (/etc/redis.conf) 中重新打开它,配置 Redis 密码可以启用其内置的安全功能之一——auth 命令——该命令要求客户端在被允许访问数据库之前进行身份验证。与 bind 设置类似,密码直接配置在 Redis 的配置文件中。
- sudo nano /etc/redis.conf
滚动到“安全”部分并寻找一条被注释的指令:
. . .
# requirepass foobared
取消它的注释,将”#”号移除,并将”foobared”修改为您选择的一个非常强大的密码。
Note
请注意,按原样输入此命令将每次生成相同的密码。要创建一个唯一的密码,请将引号内的字符串更改为任何其他单词或短语:
echo “digital-ocean” | sha256sum
虽然生成的密码可能不易记住,但它将非常强大且长,这正是Redis所需的密码类型。在将该命令的输出复制并粘贴为requirepass的新值之后,它应该是这样的:
/etc/redis.conf
. . .
requirepass 密码_从输出中复制
或者,如果您更喜欢一个较短的密码,您可以使用不同校验和的输出。同样,将引号中的单词更改为不会生成与该命令相同密码的单词:
echo “digital-ocean” | sha1sum
设置密码后,保存并关闭文件,然后重新启动Redis。
- sudo systemctl restart redis
为了测试密码是否有效,请打开Redis客户端。
- redis-cli
以下是用于测试Redis密码是否有效的命令序列。第一个命令在认证之前尝试将一个键设置为一个值:
- set key1 10
因为您尚未进行验证,所以这样做行不通,Redis会返回一个错误。
Output(error) NOAUTH Authentication required.
以下命令将使用Redis配置文件中指定的密码进行身份验证:
- auth your_redis_password
Redis将会确认您已经通过身份验证。
OutputOK
之后,再次运行先前的命令应该会成功。
- set key1 10
OutputOK
使用get key1命令查询Redis中新键的值。
- get key1
Output"10"
最后一个命令是退出redis-cli。你也可以使用exit来退出。
- 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.conf文件的安全部分进行配置的。要启用或禁用Redis命令,请再次打开配置文件以进行编辑。
- sudo nano /etc/redis.conf
Note
要禁用或终止一个命令,将其重命名为空字符串,像这样:
# 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来应用这些更改。
- sudo systemctl restart redis.service
为了测试你的新命令,进入Redis命令行。
- redis-cli
请使用您之前设定的密码进行身份验证。 de .)
- auth your_redis_password
OutputOK
假设您将CONFIG命令重命名为ASC12_CONFIG,试图使用config命令将会失败。
- config get requirepass
Output(error) ERR unknown command 'config'
调用重命名的命令将会成功。请注意,Redis命令对大小写不敏感。
- asc12_config get requirepass
Output1) "requirepass"
2) "your_redis_password"
最后,你可以从redis-cli退出。
- exit
Warning
/etc/redis.conf
. . .
#请注意,将被记录到AOF文件中或传输到副本中的命令的名称更改可能会导致问题。
. . .
这意味着如果重命名的命令不在AOF文件中,或者如果它在AOF文件中但尚未传输到副本,则应该没有问题。在你重命名命令时请记住这一点。在不使用AOF持久性或安装后(即在Redis使用的应用程序部署之前)是重命名命令的最佳时机。
步骤5 – 设置数据目录所有权和文件权限
这一步将涉及一些你可能需要进行的所有权和权限更改,以改善你的Redis安装的安全配置。这包括确保只有需要访问Redis的用户具有读取其数据的权限。默认情况下,这个用户是redis用户。
你可以通过在其父目录的长列表中使用grep命令来验证这一点,查找Redis数据目录。以下是该命令及其输出:
- ls -l /var/lib | grep redis
Outputdrwxr-x---. 2 redis redis 22 Sep 6 22:22 redis
这个输出表明Redis数据目录属于redis用户,redis组被授予次要访问权限。这个所有权设置是安全的,文件夹权限使用八进制表示,设置为750。
如果您的Redis数据目录的权限不安全,可以通过运行chmod命令来确保只有Redis用户和组能够访问该文件夹及其内容。以下示例将该文件夹的权限设置更改为770。
- sudo chmod 770 /var/lib/redis
你可能需要改变的另一个权限是Redis配置文件的权限。默认情况下,它的文件权限为640,由root所有,并且附属所有权属于root组。
- ls -l /etc/redis.conf
Output-rw-r-----. 1 redis root 62192 Sep 6 22:20 /etc/redis.conf
权限(640)的意思是Redis配置文件只能被redis用户和root用户组读取。由于配置文件包含了在第四步中配置的未加密密码,redis.conf应该属于redis用户,并且有redis用户组作为第二属主。要设置这个权限,请运行以下命令:
- sudo chown redis:redis /etc/redis.conf
然后更改文件的权限,使得只有文件的所有者能读取和写入。
- sudo chmod 600 /etc/redis.conf
您可以再次运行以前的ls命令来验证新的所有权和权限。
- ls -l /var/lib | grep redis
Outputtotal 40
drwxrwx---. 2 redis redis 22 Sep 6 22:22 redis
- ls -l /etc/redis.conf
Outputtotal 40
-rw-------. 1 redis redis 62192 Sep 6 22:20 /etc/redis.conf
最后,重新启动 Redis 以反映这些更改。
- sudo systemctl restart redis
通过这样的方式,您的Redis安装已经得到了保护。
结论
请记住,一旦有人登录到您的服务器,就有可能绕过您设置的Redis特定安全功能。这就是为什么本教程中涵盖的最重要的安全功能是防火墙,因为它可以阻止未知用户首次登录到您的服务器。
如果您正在尝试在不受信任的网络上保护Redis通信,您将需要使用SSL代理,正如Redis开发者在官方Redis安全指南中建议的那样。