如何在 Ubuntu 22.04 上安装和保护 Redis

介绍

Redis是一个内存关键值存储,以其灵活性,性能和广泛的语言支持而闻名,本教程展示了如何在Ubuntu 22.04服务器上安装,配置和保护Redis。

前提条件

要完成本指南,您需要访问一个 Ubuntu 22.04 服务器,该服务器具有非根用户的sudo权限和配置为ufw的防火墙。

步骤 1 – 安装和配置 Redis

我们将使用 APT 包管理器从官方 Ubuntu 存储库中安装 redis. 截至此刻,默认存储库中可用的版本为 6.0.16.

首先,更新您的本地apt包缓存:

1sudo apt update

然后通过键入安装 Redis:

1sudo apt install redis-server

這將下載並安裝 Redis 及其依賴組件,然後在安裝過程中自動生成的 Redis 配置檔案中進行一個重要的配置變更。

使用您喜爱的文本编辑器打开此文件:

1sudo nano /etc/redis/redis.conf

在文件中,找到监督指令. 此指令允许您宣布 init 系统以管理 Redis 作为服务,为您提供对其运作的更多控制权。 该监督指令默认设置为。 由于您正在运行 Ubuntu,该系统使用 systemd init 系统,请将此设置更改为systemd:

 1[label /etc/redis/redis.conf]
 2. . .
 3
 4# If you run Redis from upstart or systemd, Redis can interact with your
 5# supervision tree. Options:
 6#   supervised no      - no supervision interaction
 7#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
 8#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
 9#   supervised auto    - detect upstart or systemd method based on
10#                        UPSTART_JOB or NOTIFY_SOCKET environment variables
11# Note: these supervision methods only signal "process is ready."
12#       They do not enable continuous liveness pings back to your supervisor.
13supervised systemd
14
15. . .

这是你需要在这个时候对 Redis 配置文件进行的唯一更改,所以在你完成时保存并关闭它. 如果你使用nano来编辑该文件,请按CTRL + X,Y,然后按ENTER

然后,重新启动 Redis 服务,以反映您对配置文件所做的更改:

1sudo systemctl restart redis.service

有了它,你已经安装和配置了Redis,它在你的机器上运行,但在开始使用它之前,最好先检查Redis是否正常工作。

步骤 2 - 测试 Redis

与任何新安装的软件一样,在对其配置进行任何进一步更改之前,最好确保 Redis 按预期运行。

請先檢查 Redis 服務是否正在運行:

1sudo systemctl status redis

如果运行没有任何错误,此命令将产生类似于以下的输出:

 1[secondary_label Output]
 2 redis-server.service - Advanced key-value store
 3     Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
 4     Active: active (running) since Wed 2022-04-20 20:40:52 UTC; 4s ago
 5       Docs: http://redis.io/documentation,
 6             man:redis-server(1)
 7   Main PID: 2899 (redis-server)
 8     Status: "Ready to accept connections"
 9      Tasks: 5 (limit: 2327)
10     Memory: 2.5M
11        CPU: 65ms
12     CGroup: /system.slice/redis-server.service
13             └─2899 "/usr/bin/redis-server 127.0.0.1:6379
14. . .

此输出表示 Redis 正在运行并已启用,这意味着它每次启动服务器时都设置为启动。

<$>[note] ** 注意:** 此设置适用于许多常见的 Redis 用例,但是,如果您喜欢每次启动服务器时手动启动 Redis,则可以使用以下命令配置此设置:

1sudo systemctl disable redis

美元

要测试 Redis 是否正常运行,请使用 Redis 命令行客户端redis-cli连接到服务器:

1redis-cli

在以下提示中,使用ping命令测试连接性:

1ping
1[secondary_label Output]
2PONG

此输出确认服务器连接仍然活跃. 接下来,检查您是否可以通过运行设置密钥:

1set test "It's working!"
1[secondary_label Output]
2OK

通过键入返回值:

1get test

假设一切工作,您将能够检索您存储的值:

1[secondary_label Output]
2"It's working!"

确认您可以获取值后,请退出 Redis 提示以返回壳:

1exit

作为最后的测试,我们将检查 Redis 是否能够在停止或重新启动后仍然保持数据。

1sudo systemctl restart redis

然后再连接到命令行客户端:

1redis-cli

并确认您的测试值仍然可用

1get test

您的密钥的值仍然可以访问:

1[secondary_label Output]
2"It's working!"

在你完成后,再次进入外壳:

1exit

因此,您的 Redis 安装完全可操作,并为您准备好使用。然而,一些默认配置设置不安全,并为恶意行为者提供了攻击和获取访问您的服务器和数据的机会。本教程中的其余步骤涵盖了缓解这些漏洞的方法,如官方 Redis 网站所规定(http://redis.io/topics/security)。尽管这些步骤是可选的,如果您选择不遵循这些步骤,Redis 仍然会工作,但强烈建议您完成这些步骤以加强系统的安全性。

步骤 3 – 绑定到 localhost

默认情况下,Redis仅可从 localhost 访问,但是,如果您安装和配置了Redis,并遵循与本教程不同的教程,您可能已经更新了配置文件,以允许从任何地方连接。

若要修复此问题,请打开 Redis 配置文件以编辑:

1sudo nano /etc/redis/redis.conf

查找此行,并确保它没有评论(如果有的话,删除# 字符):

1[label /etc/redis/redis.conf]
2. . .
3bind 127.0.0.1 ::1
4. . .

完成后保存并关闭文件(按CTRL + X,Y,然后按ENTER).

然后,重新启动服务,以确保 systemd 读取您的更改:

1sudo systemctl restart redis

若要檢查此變更是否已生效,請執行以下「netstat」命令:

1sudo netstat -lnp | grep redis
1[secondary_label Output]
2tcp 0 0 127.0.0.1:6379 0.0.0.0:*               LISTEN 14222/redis-server  
3tcp6 0 0 ::1:6379                :::*                    LISTEN 14222/redis-server

<$>[注] :在您的系统上默认情况下,可能无法使用 netstat 命令。

1sudo apt install net-tools

美元

此输出显示,该redis-server程序绑定到 localhost (127.0.0.1),反映了您刚刚对配置文件的更改. 如果该列中有另一个IP地址(0.0.0.0,例如),那么您应该双重检查您没有评论正确的行,并重新启动Redis服务。

现在,您的 Redis 安装仅在 localhost 上进行收听,恶意行为者将更难提出请求或获得访问您的服务器,但是,Redis 目前没有设置要求用户在对其配置或数据进行更改之前进行身份验证。

步骤 4 – 配置 Redis 密码

配置 Redis 密码允许其内置的两个安全功能之一,即auth命令,该命令需要客户端进行身份验证才能访问数据库。密码直接配置在 Redis 配置文件中,即 `/etc/redis/redis.conf,因此使用您喜爱的编辑器重新打开该文件:

1sudo nano /etc/redis/redis.conf

滚动到安全部分,并找到一个评论的指令,该指令写道:

1[label /etc/redis/redis.conf]
2. . .
3# requirepass foobared
4. . .

删除# 并将foobared更改为安全密码。

<$>[note] 注:redis.conf文件中的requirepass指令之上,有一个评论的警告:

1[label /etc/redis/redis.conf]
2. . .
3# Warning: since Redis is pretty fast an outside user can try up to
4# 150k passwords per second against a good box. This means that you should
5# use a very strong password otherwise it will be very easy to break.
6#
7. . .

因此,重要的是您将一个非常强大且非常长的值指定为您的密码,而不是自己创建密码,您可以使用openssl命令生成随机命令,如下示例所示。

1openssl rand 60 | openssl base64 -A

这个命令会像这样返回输出:

1[secondary_label Output]
2RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

在复制和粘贴该命令的输出作为requirepass的新值后,它应该读到:

1[secondary_label /etc/redis/redis.conf]
2requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

美元

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

1sudo systemctl restart redis.service

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

1redis-cli

下面显示了用于测试 Redis 密码是否有效的命令序列,第一个命令试图在身份验证之前为值设置密钥:

1set key1 10

这不会起作用,因为您没有身份验证,所以Redis返回错误:

1[secondary_label Output]
2(error) NOAUTH Authentication required.

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

1auth your_redis_password

Redis 承认:

1[secondary_label Output]
2OK

在此之后,运行以前的命令将再次成功:

1set key1 10
1[secondary_label Output]
2OK

'get key1' 查询 Redis 对新密钥的值。

1get key1
1[secondary_label Output]
2"10"

在验证后确认您可以在 Redis 客户端中运行命令后,您可以退出redis-cli:

1quit

接下来,我们将讨论重新命名 Redis 命令,如果错误地或由恶意行为者输入,可能会对您的数据产生严重影响。

步骤5 – 重命名危险命令

Redis 内置的另一个安全功能包括重命名或完全禁用被认为是危险的某些命令。

当未经授权的用户运行时,这些命令可以用于重新配置,破坏或以其他方式删除您的数据. 与身份验证密码一样,重命名或禁用命令在 /etc/redis/redis.conf 文件的同一安全性部分配置。

一些被认为是危险的命令包括:FLUSHDB,FLUSHALL,KEYS,PEXPIRE,DEL,CONFIG,SHUTDOWN,BGREWRITEAOF,BGSAVE,SAVE,SPOP,SREM,RENAMEDEBUG

您是否应该禁用或更名命令取决于您的具体需求或网站的需求. 如果您知道您永远不会使用可能被滥用的命令,那么您可以禁用命令。

若要更名或禁用 Redis 命令,请再次打开配置文件:

1sudo nano  /etc/redis/redis.conf

<$>[warning] 警告: 下列说明如何禁用和重命名命令的步骤是示例。您只应该选择禁用或重命名对您有意义的命令。

若要禁用命令,请将其重命名为空字符串(由两个没有字符之间的引用符号表示),如下所示:

1[label /etc/redis/redis.conf]
2. . .
3# It is also possible to completely kill a command by renaming it into
4# an empty string:
5#
6rename-command FLUSHDB ""
7rename-command FLUSHALL ""
8rename-command DEBUG ""
9. . .

若要更名命令,请按下面的示例给命令另一个名称。

1[label /etc/redis/redis.conf]
2. . .
3# rename-command CONFIG ""
4rename-command SHUTDOWN SHUTDOWN_MENOT
5rename-command CONFIG ASC12_CONFIG
6. . .

保存您的更改并关闭文件。

重命名命令后,通过重新启动 Redis 来应用更改:

1sudo systemctl restart redis.service

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

1redis-cli

然后是真实的:

1auth your_redis_password
1[secondary_label Output]
2OK

假设您将CONFIG命令重命名为ASC12_CONFIG,如上面的示例所示,首先尝试使用原始的CONFIG命令。

1config get requirepass
1[secondary_label Output]
2(error) ERR unknown command `config`, with args beginning with:

但是,重新命名命令将成功,它不是案例敏感:

1asc12_config get requirepass
1[secondary_label Output]
21) "requirepass"
32) "your_redis_password"

最后,你可以离开redis-cli:

1exit

请注意,如果您已经使用了 Redis 命令行,然后重新启动 Redis,则需要重新验证。

1[secondary_label Output]
2NOAUTH Authentication required.

<$>[警告] 警告 :关于重命名命令的做法,在 /etc/redis/redis.conf 的安全`部分末尾有一个警告声明,该声明写道:

1[label /etc/redis/redis.conf]
2. . .
3# Please note that changing the name of commands that are logged into the
4# AOF file or transmitted to replicas may cause problems.
5. . .

<$> <$>[注] 注: Redis 项目选择使用奴隶的术语,而 DigitalOcean 通常更喜欢主要次要的替代方案。

因此,当你试图更名命令时,请记住这一点:更名命令的最佳时间是当你不使用AOF坚持时,或者安装后不久,即在你的使用Redis的应用程序部署之前。

当您使用 AOF 并处理主奴隶安装时,请考虑 这个答案来自该项目的 GitHub 问题页面

命令登录到 AOF,并以相同的方式复制到奴隶,所以如果您尝试在没有相同更名的实例上重播 AOF,您可能会面临不一致,因为命令不能执行(对奴隶来说也是如此)。

因此,在这种情况下,处理重命名的最佳方法是确保重命名命令应用于主奴隶安装中的所有实例。

结论

在本教程中,您安装并配置了 Redis,验证了您的 Redis 安装是否正常运行,并使用其内置的安全功能,使其不容易受到恶意行为者的攻击。

请记住,一旦有人登录到您的服务器,很容易绕过我们已经部署的 Redis 特定的安全功能,因此,您的 Redis 服务器上最重要的安全功能是您的防火墙(如果您遵循前提 初始服务器设置教程,则您将其配置),因为这使得恶意行为者很难跳过该围栏。

Published At
Categories with 技术
comments powered by Disqus