如何将 ZMQ 发布/订阅模式设置为仅供预授权订阅者使用

How to setup a ZMQ PUB/SUB pattern to serve only for pre-authorized subscriber(s)

本文关键字:授权 模式 ZMQ 发布 设置      更新时间:2023-10-16

如何在PUB-SUB模式中实现或执行某种"黑客",以获得仅向授权订阅者发布,断开未经授权的订阅者功能?

我在谷歌上搜索了这个问题,但所有答案都与在订阅者端设置订阅过滤器非常相似。

但是,正如我所说,我希望仅将我的更新从PUB发布给那些通过授权或具有一些秘密key的客户,这些客户端是在REQ-REP中收到的。

感谢您的任何想法。

阅读指南的第5章,特别是"Pub-Sub的利弊"部分。

你试图完成的方式有很多问题(但如果你愿意改变你的架构,有一些解决方案)。

  • 据推测,您需要全世界都可以普遍访问 PUB 套接字,无论是整个世界还是仅由一些授权的套接字和一些未授权的套接字组成的世界。 如果没有,您可以仅控制对 PUB 套接字本身的访问(通过防火墙)到仅授权的计算机/套接字。
  • 当 PUB 套接字收到新连接时,它不知道订阅者是否获得授权。 PUB 无法从 SUB 套接字接收实际通信,因此 SUB 套接字无法直接传达其授权。XPUB/XSUB套接字打破了这个限制,但它不会帮助你(见下文)。
  • 无论您如何将 SUB 套接字的授权传达给 PUB 套接字,我不知道 PUB 套接字在
  • 未获得授权的情况下有什么方法可以杀死或忽略 SUB 套接字的连接。这意味着不受信任的 SUB 套接字可以订阅 ALL ('') 并从 PUB 套接字接收所有消息,而 PUB 套接字对此无能为力。如果您信任 SUB 套接字来监管自身(您创建连接套接字并控制它部署的计算机),那么您可以选择只订阅"控制"主题、发送授权,并让 PUB 套接字反馈允许您订阅的频道/主题。

因此,这几乎扼杀了它在可公开访问的 PUB/SUB 范式中实现一般安全性。

以下是您的选择:

  1. 放弃 PUB/SUB - 您可以准确控制每次在发送端(我知道)发送到哪个对等体的唯一方法是使用 ROUTER 套接字。 如果您使用 ROUTER/DEALER,DEALER 套接字可以发送它的授权,ROUTER 套接字将其与其 ID 一起存储,当需要发送某些内容时,它只是找到所有已授权的连接套接字并将其按顺序发送给每个套接字。 这是否可行取决于套接字的数量和工作负载(消息的大小和数量)。
  2. 加密您的消息 - 您已经说过这是您的最后手段,但这可能是唯一可行的答案。正如我上面所说,任何可以访问您的 PUB 套接字的 SUB 套接字都可以订阅发送的所有 ('') 消息,没有监督。您无法有效地隐藏您的 PUB 套接字地址/端口,您无法隐藏通过该 PUB 套接字发送的任何消息,但您可以使用加密隐藏这些消息的内容。密钥共享的正确方法取决于您的情况。

正如杰森向你展示了一个关于为什么的极好评论(不要忘记在他非凡的答案上加一个+1,好吗?),让我补充我的两分钱如何:

问:如何?

答:忘记 PUB/SUB 原型并创建一个特定于案例的原型

是的。ZeroMQ是一个非常强大的可以做的工具箱,而不是一盒糖果,你可以品尝和选择组装你的下一个超级代码。

这样,您的代码就可以并且仍然能够为原本无法控制的SUB端代码行为设置控件和度量值。

创建自己的、复合的、分层的消息传递解决方案是 ZeroMQ 为您的设计带来的强大功能。在那里,您意识到自己是分布式系统设计的主人。除了学术示例之外,没有人使用普通的原始行为原型,但通常为生产级解决方案编写更健壮和现实证明的复合消息传递模式。

没有简单的单行代码可以使您的系统用例正常工作。


虽然它不需要回答您的所有详细信息,但您可能需要阅读备注

  • 关于管理PUB/SUB连接
  • 关于零MQ授权措施。