我知道 Redis Cluster 仍然不稳定,但是很长一段时间以来它已经通过了所有的单元测试,所以我开始使用它。
我想知道如果节点需要身份验证,Redis 集群是否能正常工作。我倾向于认为是的,因为它们通过不同的端口连接并使用不同的协议,但我不确定,也找不到任何文档或规范上的任何内容来确认这一点。
此外,如果 redis 集群协议飞越身份验证障碍,这不是安全漏洞吗?我的数据库可以被外界访问吗?(端口至少必须是可访问的,以便它可以与其他节点通信)
SSH 隧道可能是一个简单的解决方案:
快速示例:
ssh -f -L 1234:localhost:6379 server.com -NC
这会将任何到 localhost:1234 的传入连接路由到远程 server.com:6379。因此,您可以在 redis 配置文件中将 server.com:6379 替换为 localhost:1234。
您可以查看man ssh
更多信息。
如果任何协议在 Internet 上运行,您将需要加密(“ssl”),例如跨数据中心。这通常会影响性能。在当前的 Redis 安全规范中 -
http://redis.io/topics/security
建议不支持 ssl,您需要 SSL 代理。这通常会导致系统性能下降,例如您必须考虑的延迟。
因此,理想情况下,集群节点应该位于同一地点。如果不能,则应将集群设计为限制跨站点数据传输或在没有任何实时限制的情况下离线。
我还选择在每个节点的需要的基础上禁用/启用命令(请参阅上面的安全规范中的详细信息)。我不确定集群模式是否支持此功能。
由于 Redis 在集群中的运行方式,使用 SSL 的 Redis Cluster 是不可能的。
要使 SSL 在 Redis 部署中工作,您需要安装和配置 stunnel 或隧道应用程序。
从 Redis 文档中: 请注意,要使 Redis 集群正常工作,您需要,对于每个节点:用于与客户端通信的正常客户端通信端口(通常为 6379)对所有需要访问集群的客户端开放,加上所有其他集群节点(使用客户端端口进行密钥迁移)。集群总线端口(客户端端口 + 10000)必须可以从所有其他集群节点访问。
您可以将 stunnel 配置为在某个端口接收流量并将流量重定向到 6379 或任何其他 redis-server 正在侦听的端口。在集群模式下,redis-server 会宣布它的“cluster_port”,以便客户端和其他节点可以连接到这个与之连接的端口。如果您覆盖设置“cluster_announce_port”,ssl-clients 将成功连接到节点,但 redis-cli 和 cluster_port 上的节点间通信将失败。
似乎 AWS ElastiCache/Redis Enterprise 支持带集群的 SSL,但不支持开源 Redis。