如何保护Redis集群安全?

7
我知道Redis Cluster仍不太稳定,但是它已经通过了所有的单元测试,所以我开始使用它。
我想知道如果节点需要身份验证,Redis Cluster是否能正常工作。我倾向于认为可以,因为它们通过不同的端口连接并使用不同的协议,但我不确定,并且找不到任何关于规范的文档或其他内容来确认这一点。
此外,如果Redis Cluster协议越过了身份验证障碍,那么这不是一个安全漏洞吗?我的数据库是否可以被外部访问?(至少必须让端口可访问以便与其他节点通信)

端口应该只对可能在同一本地网络上的其他节点可访问。不应该将其开放给外部世界。 - seppo0010
如果您想在数据中心之间进行节点复制,那么必须这样做。 - João Pinto Jerónimo
1
@JoãoPintoJerónimo,如果你不能使用AWS工具来完成这个任务,你可以只开放特定IP地址的端口。 - Linus Thiel
3个回答

6

SSH隧道可能是一个简单的解决方案:

  1. 您不需要将redis端口暴露给外部世界,只需要ssh端口。
  2. SSH支持数据压缩,可以减少数据中心之间的传输。

快速示例: ssh -f -L 1234:localhost:6379 server.com -NC

这将路由任何到达localhost:1234的连接到远程server.com:6379。因此,您可以在redis配置文件中将server.com:6379替换为localhost:1234。

您可以查看man ssh了解更多信息。


1
这仅适用于单节点Redis,而不是集群。根据2016年的Redis文档:“目前Redis Cluster不支持NAT环境和通常情况下IP地址或TCP端口被重新映射的环境。”隧道将破坏它在10000端口上使用的节点间协议。 - Ivan

3

如果任何协议在互联网上传输,您都需要加密(“ssl”),例如跨数据中心。这通常会影响性能。在Redis的当前安全规范中-

http://redis.io/topics/security

建议不要使用SSL,需要使用SSL代理。这通常会导致系统性能下降,例如潜在的延迟,您需要考虑到这一点。
理想情况下,集群节点应该是共同放置的。如果无法实现,则应设计集群以限制跨站点数据传输或在没有实时约束的情况下进行离线处理。
我还选择了根据每个节点的需求禁用/启用命令(请参见上面的安全规范中的详细信息)。我不确定在集群模式下是否支持此功能。

你有性能损失的概念吗?它真的很糟糕吗?在集群模式下,您只能使用传统Redis服务器可用的命令子集,即适用于单个键的命令。我认为集群之间最常见的通信是发布/订阅,这将通过SSL代理进行传输... - João Pinto Jerónimo
性能影响通常取决于流入 SSL 代理的数据量、SSL 代理的强大程度等主观因素。最好的方法是设置一个集群并进行一些性能和容量测试。 - NiladriBose

0

由于Redis在集群中的操作方式,不可能在Redis Cluster中使用SSL。

要使SSL在Redis部署中工作,您需要安装和配置stunnel或隧道应用程序。

来自Redis文档:请注意,为了使Redis Cluster正常工作,每个节点都需要: 用于与客户端通信的常规客户端通信端口(通常为6379),该端口必须对所有需要访问集群的客户端以及使用客户端端口进行键迁移的所有其他集群节点开放。 集群总线端口(客户端端口+10000)必须可从所有其他集群节点访问。

您可以配置stunnel以接收某个端口的流量,并将流量重定向到redis-server正在侦听的6379或任何其他端口。在集群模式下,redis-server会宣布其“cluster_port”,以便客户端和其他节点可以连接到此端口。如果覆盖了“cluster_announce_port”设置,则ssl-client将能够成功连接到节点,但redis-cli和通过cluster_port的节点间通信将失败。

似乎AWS ElastiCache/Redis Enterprise支持集群的SSL,但开源版本的Redis不支持。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接