外部(互联网)Pub Sub

时间:2015-01-08 15:48:50

标签: c# redis

最近,我开始考虑通过互联网向订阅客户发布消息的解决方案。我们的系统是用C#开发的。

我们尝试使用Redis,它在速度和准确性方面表现非常好,但在安全性方面非常糟糕,每个人都可以订阅所有内容,而我能做的最好的事情是: 1)重命名核心功能,使它们无法使用 2)添加身份验证(但是每个服务器,而不是每个客户端)

我有两个问题: 1)我可以在Redis安全性方面做得更多吗?我可以为每个订户设置密码吗?每个频道? 2)您是否还有其他任何解决方案?

谢谢!

1 个答案:

答案 0 :(得分:0)

Redis几乎没有任何访问控制(但只是通用的AUTH),甚至计划的ACL功能也没有明确支持订阅/发布到特定渠道。

但是......你可以做一件令人惊讶的简单事情,如果你禁用MONITOR和其他可以用来监听其他客户端连接的命令,也就是说,使用HMAC来一起散列带有密码的逻辑通道名称,以获取真实的通道名称,这对于不知道密码的客户是不可能的。

这是架构(但是你应该仔细考虑这是否安全,具体取决于你的确切设置,连接加密,启用命令集。我可以保证获取频道名称是加密的,而且没有频道名字可以随意猜出。

例如,频道“foo”的密码是“bar”。要获得频道名称:

HMAC-SHA256("bar","foo") -> 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b

你有你的频道名称。

重要提示:请注意,具有相同错误(旧)密码的N个客户端仍然可以进行通信。这在大多数设置中都不应该是一个问题,因为在这种情况下他们只能订阅相同的频道名称。

重要提示2:如果是通过互联网,您应该通过SSL或VPN隧道传输所有这些内容。

重要提示3:除此之外,请务必使用AUTH作为额外的身份验证层。