介绍
Redis是一个内存,NoSQL,关键值缓存和存储,也可以坚持到磁盘上。它被设计用于 trusted clients 在 _trusted 环境中使用,没有强大的安全功能本身。
Redis 是专为可信客户端在可信环境中访问而设计的,这意味着通常不建议将 Redis 实例直接暴露在互联网上,或者一般来说,在一个不受信任客户端可以直接访问 Redis TCP 端口或 UNIX 接口的环境中。
`......。
总的来说,Redis不是为了最大程度的安全而优化的,而是为了最大程度的性能和简单性。
尽管如此,Redis确实有几个内置的基本安全功能,其中包括创建未加密密码的能力,以及重新命名和禁用命令的自由。
这些功能本身无法确保您的 Redis 安装的安全性,但是,配置它们仍然是一个很大的步骤,而不是让您的数据库完全不受保护。
在本教程中,您将阅读如何配置 Redis 所拥有的少数安全功能,并对您的系统配置做出一些更改,这将提高独立的 Redis 安装在 Ubuntu 服务器上的安全姿势。
请注意,本指南不涉及 Redis 服务器和客户端应用程序位于不同的主机或不同数据中心的情况。 安装 Redis 流量必须通过不安全或不受信任的网络需要完全不同的配置,例如在 Redis 机器之间设置 SSL 代理或 VPN,除了这里提供的配置。
前提条件
对于这个教程,你将需要:
- 一个 Ubuntu 18.04 服务器. 这个服务器还应该有一个非根用户,具有
sudo
特权,以及一个与 UFW 设置的防火墙,您可以根据我们的 Ubuntu 18.04 初始服务器设置指南进行配置。
步骤 1 – 检查 Redis 是否正在运行
首先,将 SSH 输入到您的服务器与您的非根用户。
要检查 Redis 是否在工作,请打开一个 Redis 命令行,使用redis-cli
命令:
1redis-cli
<$>[注意]
注意:如果您已经为 Redis 设置了密码,则在连接后必须使用auth
命令进行身份验证:
1auth your_redis_password
1[secondary_label Output]
2OK
如果您尚未为 Redis 设置密码,您可以在本教程的第 4 步中阅读如何做到这一点。
通过ping
命令测试连接:
1ping
如果 Redis 正常工作,您将看到以下内容:
1[secondary_label Output]
2PONG
接下来,输出 Redis 命令行:
1quit
现在,您已经确认 Redis 运行并正常工作,您可以转到增强服务器安全性的最重要步骤:配置防火墙。
步骤 2 – 使用 UFW 保护服务器
Redis只是一个在你的服务器上运行的应用程序,因为它只有几个基本的安全功能,所以真正保护它的第一步是保护它正在运行的服务器。在像你的Ubuntu 18.04服务器这样的面向公众的服务器的情况下,如在Ubuntu 18.04的初始服务器设置指南中所描述的防火墙的配置是第一步。
如果您不确定是否已设置防火墙或是否已启动,则可以通过执行以下操作来检查:
1sudo ufw status
如果您遵循 Ubuntu 18.04 的初始服务器设置指南,您将看到以下输出:
1[secondary_label Output]
2Status: active
3
4To Action From
5-- ------ ----
6OpenSSH ALLOW Anywhere
7OpenSSH (v6) ALLOW Anywhere (v6)
如果您使用该指南实施了防火墙规则,那么您不需要为 Redis 添加额外的规则,因为默认情况下,UFW 会减少所有输入的流量,除非明确允许。
有关如何添加规则的更多信息,请参阅此 关于 UFW 常见规则和命令的指南。
步骤 3 – 绑定到 localhost
默认情况下,Redis仅可从 localhost访问,但是,如果您遵循了配置Redis的不同教程,而不是前提部分提供的教程,您可能已经更新了配置文件,以允许从任何地方连接。
打开 Redis 配置文件以编辑:
1sudo nano /etc/redis/redis.conf
查找此行,并确保它没有评论(如果有的话,删除#
字符):
1[label /etc/redis/redis.conf]
2bind 127.0.0.1
完成后保存并关闭文件(按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 2855/redis-server 1
此输出显示,该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# requirepass foobared
删除#
并将foobared
更改为安全密码。
<$>[注]
**注:**在redis.conf
文件中的requirepass
指令之上,有一个评论的警告:
1[label /etc/redis/redis.conf]
2# Warning: since Redis is pretty fast an outside user can try up to
3# 150k passwords per second against a good box. This means that you should
4# use a very strong password otherwise it will be very easy to break.
5#
因此,重要的是您将一个非常强大且非常长的值指定为您的密码,而不是自己创建密码,您可以使用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, RENAME和 DEBUG。
您是否应该禁用或更名命令取决于您的具体需求或网站的需求. 如果您知道您永远不会使用可能被滥用的命令,那么您可以禁用命令。
要启用或禁用 Redis 命令,请再次打开配置文件:
1sudo nano /etc/redis/redis.conf
<$>[警告] **警告:**下列说明如何禁用和更名命令的步骤是示例。您只应该选择禁用或更名对您有意义的命令。
若要禁用命令,只需将命令重命名为空串(用一对没有其他字符的引文符号表示),如下所示:
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. . .
3rename-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'
但是,重新命名命令将成功,它不是案例敏感:
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 的「安全」部分末尾有一個警告聲明,該聲明說:
请注意,更改登录到 AOF 文件或发送给奴隶的命令的名称可能会导致问题。
注: _Redis项目选择使用主人
和奴隶
的术语,而DigitalOcean通常更喜欢主要
和次要
的替代方案。
也就是说,如果命令不是在AOF文件中,或者如果是,但AOF文件没有被传送给奴隶,那么应该没有问题。
因此,当你试图更名命令时,请记住这一点:更名命令的最佳时间是当你不使用AOF坚持时,或者安装后不久,即在你的使用Redis的应用程序部署之前。
当您使用 AOF 并处理主奴隶安装时,请考虑 这个答案来自该项目的 GitHub 问题页面。
命令登录到 AOF,并以相同的方式复制到奴隶,所以如果您尝试在没有相同更名的实例上重播 AOF,您可能会面临不一致,因为命令不能执行(对奴隶来说也是如此)。
因此,在这种情况下,处理重命名的最佳方法是确保重命名命令应用于主奴隶安装中的所有实例。
结论
请记住,一旦有人登录到您的服务器,很容易绕过我们已经设置的 Redis 特定的安全功能,因此,最重要的安全功能是您的防火墙,这使得恶意行为者难以跳过该围栏。
如果您试图通过不受信任的网络保护 Redis 通信,则需要使用 SSL 代理,正如 Redis 开发人员在 官方 Redis 安全指南中推荐的那样。