本页内容
- 先决条件
- 安装 Redis
- 使用 Firewalld 保护 Redis
- 配置 Redis
- 使用 ACLs(访问控制列表)保护 Redis 禁用默认 Redis 用户 验证用户 alice 验证用户 bob
- 结论
- 禁用默认 Redis 用户
- 验证用户 alice
- 验证用户 bob
Redis 是一个流行的开源内存键值数据存储。它支持多种不同的数据结构,例如 Hash、Lists、Sets、Strings 等等。Redis 被设计为仅在可信环境中运行,它可以用作数据库、缓存和消息代理。Redis 以其广泛的支持、高性能、高可用性和灵活性而广为人知。
对于小型部署,你可以将 Redis 作为独立实例安装。对于大型部署,它们提供了额外的组件,例如用于高可用的 Redis Sentinel 和用于跨多个 Redis 节点服务器分区数据的 Redis Cluster。
本教程将向你展示如何在 AlmaLinux 9 服务器上安装和配置 Redis。此外,我们还将向你展示如何通过 Redis ACLs(访问控制列表)和 Firewalld 来保护 Redis。
先决条件
要完成本教程,你必须具备以下条件:
- 一台 AlmaLinux 9 服务器 —— 本示例使用的 AlmaLinux 服务器主机名为 ' alma-linux ',IP 地址为 ' 192.168.5.21' 。
- 一个具有 sudo/root 管理员权限的非 root 用户。
- 已配置、已启动并正在运行的 firewalld。
现在,让我们开始吧。
安装 Redis
Redis 是一个高性能的开源数据存储,可用作数据库、缓存、消息代理和流处理引擎。Redis 在大多数 Linux 发行版(包括 AlmaLinux)上都可用。它可以通过默认发行版仓库进行安装。
在安装 Redis 之前,运行以下命令来重建软件包缓存并获取最新的软件包信息。
sudo dnf makecache

现在,运行下面的 dnf 命令来安装 Redis。在提示时输入 y,然后按 ENTER 继续。
sudo dnf install redis

Redis 安装完成后,运行以下 systemctl 命令来启动并启用 Redis 服务。
sudo systemctl start redis
sudo systemctl enable redis

最后,使用下面的命令验证 Redis 服务状态。
sudo systemctl is-enabled redis
sudo systemctl status redis
以下输出确认 Redis 正在运行且已启用,这意味着它将在系统启动时自动运行。

使用 Firewalld 保护 Redis
在本节中,你将配置 firewalld 来保护 Redis 安装。实现这一目标的最佳方式是在 firewalld 上创建区域(zone),并允许特定的网络/子网访问该服务。
运行以下命令创建一个名为 ' svcs ' 的新 firewalld 区域,然后将内部网络接口添加到其中。在本示例中,Redis 将在接口 ' enp0s8 ' 下的内部 IP 地址上运行,你必须将你的接口添加到 ' svcs ' 区域。
sudo firewall-cmd --new-zone=svcs --permanent
sudo firewall-cmd --zone=svcs --add-interface=enp0s8 --permanent
现在,运行以下命令允许网络 ' 192.168.5.1/24 ' 访问 ' svcs ' 区域上的端口。
sudo firewall-cmd --zone=svcs --add-source=192.168.5.1/24
之后,将 Redis 端口 ' 6379/tcp ' 添加到 ' svcs ' 区域,然后将更改应用到 firewalld。
sudo firewall-cmd --zone=svcs --add-port=6379/tcp
sudo firewall-cmd --runtime-to-permanent

现在,使用以下命令重新加载 firewalld,以确保新更改已应用到 firewalld。
sudo firewall-cmd --reload
最后,运行以下命令检查 firewalld 上活动区域的列表。你应该会看到 ' svcs ' 区域处于活动状态。
sudo firewall-cmd --get-active-zones
现在你可以验证 'svcs' 区域中可用的规则列表。成功时,你应该会在 Ports 部分看到 Redis 端口 ' 6379/tcp ',并在 Source 部分看到子网 ' 192.168.5.1/24 '。
sudo firewall-cmd --list-all --zone=svcs

配置 Redis
在本节中,你将通过修改默认的 Redis 配置文件 ' /etc/redis/redis.conf ' 来配置 Redis 安装。
使用下面的 nano 编辑器命令打开 Redis 配置文件 ' /etc/redis/redis.conf '。
sudo nano /etc/redis/redis.conf
将 ' bind ' 参数的值更改为服务器的内部 IP 地址。在本示例中,Redis 将运行在本地 IP 地址 ' 192.168.5.21 ' 上。
bind 192.168.5.21

现在,通过将参数值更改为 ' no ' 来禁用 ' protected-mode '。要允许你的应用程序远程连接到 Redis 服务器,你必须禁用 'protected-mode'。
protected-mode no

在 AlmaLinux 上,默认的服务管理器是 'systemd'。取消注释 ' supervised ' 参数,并将默认值更改为 ' systemd ',以启用 Redis 与 systemd 的集成。
supervised systemd

最后,取消注释 ' aclfile ' 参数,以通过文件启用 Redis 的 ACLs(访问控制列表)。自 Redis v6 起,使用 ACLs 是保护 Redis 的推荐方式,且 Redis 支持不同的 ACLs 使用方法,你可以通过 Redis shell 或定义 ACLs 文件来创建 ACLs。本示例将使用通过文件的 ACLs。
aclfile /etc/redis/users.acl

完成后保存并关闭文件。
现在,运行以下命令创建 ACLs 文件 '/etc/redis/users.acl' 。
touch /etc/redis/users.acl
之后,运行以下命令重启 Redis 服务并应用你所做的更改。
sudo systemctl restart redis
至此,redis 将以新配置启动并运行。你接下来要做的步骤是通过 Redis CLI 验证你的 Redis 配置。
使用下面的 'redis-cli' 命令连接到 Redis 服务器。在本示例中,你将指定 Redis 服务器的 IP 地址。
redis-cli -h 192.168.5.21
登录后,运行以下命令以确保连接成功。连接成功时,你应该会看到输出 ' test redis '。
PING "test redis"

接下来,运行以下查询以获取当前的 Redis 配置。在本示例中,你将检查 ' bind '、' supervised ' 和 protected-mode ' 设置。
CONFIG GET bind
CONFIG GET supervised
CONFIG GET protected-mode
成功时,你应该会得到与之前所做设置相匹配的配置。

最后,运行下面的 ACL 查询以获取 Redis 上可用的 ACLs 列表。
ACL LIST
你应该会看到类似如下的输出 —— 默认的 Redis 安装附带 ACL 用户 ' default ',其认证方式为 ' nopass '(即无需密码登录),权限为 ' +@all ',该权限允许 ' default ' 用户执行任何 Redis 查询。

至此,你已经完成了 Redis 的基本配置。在下一步中,你将深入了解用于保护 Redis 安装的 Redis ACLs(访问控制列表)配置。
使用 ACLs(访问控制列表)保护 Redis
自 Redis 6.x 起,保护 Redis 的最佳方式是实施 ACLs(访问控制列表)。这允许你在 Redis 服务器上设置用户和权限,并且可以使旧版 Redis 中的 'requirepass' 和 'rename-command' 参数过时。
你可以通过两种不同的方法在 Redis 上设置 ACLs:
- 通过 ACL 命令设置 ACLs
- 通过外部 ACL 文件设置 ACLs
使用你已经配置好的 Redis 服务器,你将通过外部 ACL 文件来设置 Redis ACLs。
首先,使用以下 nano 编辑器命令打开 ACL 文件 '/etc/redis/users.acl'。
sudo nano /etc/redis/users.acl
插入以下配置,为 Redis 创建两个用户。
user alice on -DEBUG +@all ~* >AliceP4ssw0rd user bob on +@all -@dangerous ~* >BobP4ssw0rd
完成后保存文件并退出编辑器。

通过此配置,你将创建两个用户:
- 用户 alice,密码为 ' AliceP4ssw0rd ',允许执行除 DEBUG ' -DEBUG ' 之外的所有查询 ' +@all ',并且还允许对所有可用的键值 ' ~* ' 运行查询。
- 用户 bob,密码为 ' BobP4ssw0rd ',允许用户 bob 执行除 ' -@dangerous ' 之外的所有查询 ' +@all '。命令类别 ' -@dangerous ' 包括 FLUSHALL、MIGRATE、RESTORE、SORT、KEYS、CLIENT、DEBUG、INFO、CONFIG、SAVE、REPLICAOF 等等。此外,该用户被允许对 Redis 服务器上所有可用的键值进行查询。
获取 Redis 上命令类别的完整列表。
现在,运行以下 systemctl 命令重启 Redis 服务并应用更改。
sudo systemctl restart redis
Redis 重启后,使用下面的 redis-cli 命令连接到 Redis 服务器。
redis-cli -h 192.168.5.21
登录后,运行以下 ACL 查询以检查 Redis 上可用用户的列表。
ACL LIST
至此,你应该会看到三个用户:alice、bob 和 default。

你也可以使用以下查询来验证 Redis 上的详细用户信息。
ACL GETUSER alice
ACL GETUSER bob
你应该会看到用户 alice 被允许在 Redis 上执行所有可用命令,命令组为 ' +@all '。

至于用户 bob,你可以看到允许执行的命令 ' +@all ',但同时命令组 ' dangerous ' 已被禁用。

禁用默认 Redis 用户
在创建了新用户 alice 和 bob 之后,你必须使用以下查询禁用 ' default ' 用户。
ACL SETUSER default OFF
然后,使用以下命令再次检查 Redis 上可用用户的列表。
ACL LIST
你应该会看到用户 ' default ' 的状态为 off(即已禁用),如下所示:

按 Ctrl+d 退出 Redis shell。
之后,使用以下命令再次登录 Redis。
redis-cli -h 192.168.5.21
然后,输入以下 PING 查询以验证当前连接。
PING
在 Redis 的 " default " 用户被禁用后,你应该会收到类似如下的错误 —— 你必须是通过身份验证的用户才能运行查询。

验证用户 alice
接下来,你将验证你创建的新的 Redis 用户 alice 和 bob。
运行以下命令以用户 'alice' 身份进行身份验证。如果成功,你应该会得到输出 'OK'。
AUTH alice AliceP4ssw0rd
现在运行以下查询,以确保你已通过用户 alice 向 Redis 进行了身份验证。
PING
ACL WHOAMI
你应该会看到消息 PONG,并已通过用户 alice 身份验证。
现在,运行以下查询,以确保用户 alice 能够执行所有可用的查询,包括相关的 Redis 管理操作。
CONFIG GET bind
CONFIG GET supervised
成功时,你应该会得到参数 bind 和 supervised 的当前 Redis 配置输出。

验证用户 bob
运行以下查询以用户 bob 身份登录并进行身份验证。
AUTH bob BobP4ssw0rd
身份验证后,运行下面的 PING 查询。如果成功,你应该会收到消息 PONG 。
PING
接下来,在 Redis ACL 文件中,用户 bob 的命令类别 ' -@dangerous ' 会阻止该用户在 Redis 服务器上执行某些危险命令,例如 FLUSHALL、CONFIG 等等。
如果你以用户 bob 身份运行以下查询,你应该会得到类似 'NOPERM' 的输出,这意味着用户 bob 没有执行该命令的权限。
FLUSHALL
CONFIG GET bind
SAVE

至此,你已通过 ACL 文件成功使用 ACLs(访问控制列表)保护了 Redis。
结论
恭喜!你已成功在 AlmaLinux 9 上安装了 Redis。你还学习了如何通过 ACL 文件设置 ACLs(访问控制列表)来保护 Redis 安装。此外,你还通过为 Redis 服务创建特定区域,使用 firewalld 保护了 Redis。