Redis 安全
Redis中的安全模型和特性
本文档从Redis的角度介绍了安全主题。它涵盖了Redis提供的访问控制、代码安全问题、通过选择恶意输入从外部触发的攻击以及其他类似主题。 您可以通过参加Redis大学安全课程了解更多关于访问控制、数据保护和加密、安全的Redis架构以及安全部署技术的信息。
对于与安全相关的联系人,请在GitHub上提出问题,或者当您认为确实需要保护通信安全时,请使用本文档末尾的GPG密钥。
安全模型
Redis 设计为由受信任环境中的受信任客户端访问。这意味着通常不建议将 Redis 实例直接暴露在互联网上,或者一般来说,暴露在不受信任的客户端可以直接访问 Redis TCP 端口或 UNIX 套接字的环境中。
例如,在使用Redis作为数据库、缓存或消息系统的Web应用程序的常见上下文中,应用程序前端(Web端)的客户端将查询Redis以生成页面或执行由Web应用程序用户请求或触发的操作。
在这种情况下,Web应用程序在Redis和不受信任的客户端(访问Web应用程序的用户浏览器)之间进行访问中介。
通常,对Redis的不可信访问应始终通过实现访问控制列表(ACLs)的层进行中介,该层负责验证用户输入,并决定对Redis实例执行哪些操作。
网络安全
除了网络中的受信任客户端外,应拒绝所有人访问Redis端口,因此运行Redis的服务器应仅允许使用Redis实现应用程序的计算机直接访问。
在单个计算机直接暴露在互联网上的常见情况下,例如虚拟化的Linux实例(Linode、EC2等),Redis端口应该被防火墙保护,以防止外部访问。客户端仍然可以通过回环接口访问Redis。
请注意,可以通过在redis.conf文件中添加如下行来将Redis绑定到单个接口:
bind 127.0.0.1
由于Redis的特性,未能保护Redis端口免受外部访问可能会带来重大的安全影响。例如,外部攻击者可以使用单个FLUSHALL
命令删除整个数据集。
保护模式
不幸的是,许多用户未能保护Redis实例免受外部网络的访问。许多实例只是简单地暴露在互联网上,使用公共IP。自版本3.2.0以来,当Redis以默认配置(绑定所有接口)执行且没有任何密码时,它会进入一种称为保护模式的特殊模式。在这种模式下,Redis只响应来自回环接口的查询,并向从其他地址连接的客户端返回一个错误,解释问题以及如何正确配置Redis。
我们预计保护模式将显著减少由于未经适当管理执行的无保护Redis实例引起的安全问题。然而,系统管理员仍然可以忽略Redis给出的错误,并禁用保护模式或手动绑定所有接口。
认证
Redis 提供了两种方式来验证客户端。 推荐的身份验证方法是在 Redis 6 中引入的,通过访问控制列表(Access Control Lists),允许创建命名用户并分配细粒度的权限。 了解更多关于访问控制列表的信息,请点击这里。
通过编辑redis.conf文件并设置requirepass
来启用旧版认证方法。然后所有客户端都将使用此密码。
当启用requirepass
设置时,Redis将拒绝任何未经认证的客户端的查询。客户端可以通过发送AUTH命令后跟密码来进行认证。
密码由系统管理员在redis.conf文件中以明文形式设置。它应该足够长,以防止暴力攻击,原因有两个:
- Redis 在服务查询方面非常快速。外部客户端每秒可以测试许多密码。
- Redis密码存储在redis.conf文件和客户端配置中。由于系统管理员不需要记住它,密码可以非常长。
认证层的目标是可选地提供一层冗余。如果防火墙或任何其他用于保护Redis免受外部攻击者攻击的系统失效,外部客户端仍然无法在不知道认证密码的情况下访问Redis实例。
由于AUTH
命令,像其他Redis命令一样,是以未加密的方式发送的,它无法防止具有足够网络访问权限的攻击者进行窃听。
TLS 支持
Redis 支持在所有通信通道上使用 TLS,包括客户端连接、复制链接和 Redis 集群总线协议。
禁止特定命令
可以在Redis中禁止命令或将它们重命名为不可猜测的名称,以便普通客户端仅限于一组指定的命令。
例如,虚拟化服务器提供商可能会提供托管的Redis实例服务。在这种情况下,普通用户可能不应该能够调用Redis的CONFIG命令来更改实例的配置,但提供和删除实例的系统应该能够这样做。
在这种情况下,可以重命名或完全遮蔽命令表中的命令。此功能可作为语句使用,可以在redis.conf配置文件中使用。例如:
rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
在上面的例子中,CONFIG 命令被重命名为一个不可猜测的名称。也可以通过将其重命名为空字符串来完全禁止它(或任何其他命令),如下例所示:
rename-command CONFIG ""
由外部客户端的恶意输入触发的攻击
存在一类攻击,攻击者即使没有外部访问实例的权限,也可以从外部触发。例如,攻击者可能会向Redis插入数据,这些数据会触发Redis内部实现的数据结构上的病态(最坏情况)算法复杂度。
攻击者可以通过网页表单提供一组已知会在哈希表中哈希到同一桶的字符串,从而将预期的O(1)时间(平均时间)转变为最坏情况的O(N)时间。这可能会消耗比预期更多的CPU资源,并最终导致服务拒绝。
为了防止这种特定的攻击,Redis 使用了每次执行的伪随机种子来生成哈希函数。
Redis 使用 qsort 算法实现 SORT 命令。目前,该算法不是随机的,因此通过精心选择正确的输入集,可能会触发二次最坏情况行为。
字符串转义和NoSQL注入
Redis协议没有字符串转义的概念,因此在正常情况下使用普通的客户端库是不可能进行注入的。该协议使用前缀长度字符串,并且完全二进制安全。
由于由EVAL
和EVALSHA
命令执行的Lua脚本遵循相同的规则,这些命令也是安全的。
虽然这将是一个奇怪的用例,应用程序应避免从未受信任的来源获取的字符串组成Lua脚本的主体。
代码安全
在经典的Redis设置中,客户端被允许完全访问命令集,但访问实例不应导致能够控制运行Redis的系统。
在内部,Redis 使用了所有众所周知的安全编码实践来防止缓冲区溢出、格式错误和其他内存损坏问题。然而,使用 CONFIG 命令控制服务器配置的能力允许客户端更改程序的工作目录和转储文件的名称。这使得客户端可以将 RDB Redis 文件写入随机路径。这是一个 安全问题,可能会导致系统被攻破和/或以与 Redis 运行相同的用户身份运行不受信任的代码。
Redis 不需要 root 权限即可运行。建议将其作为仅用于此目的的无特权 redis 用户运行。
GPG 密钥
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=J9BD
-----END PGP PUBLIC KEY BLOCK-----