RabbitMQ - 游戏室和安全注意事项

时间:2012-08-14 14:30:46

标签: python security webserver messaging rabbitmq

我正在编写Android应用程序并希望定义房间。房间将容纳某些游戏的所有用户。这就像扑克有4个玩家,每个房间可以容纳4个用户。我还想使用rabbitmq来实现可扩展性和可定制性。问题是Android应用程序使用相同的用户名:password将所有用户连接到RabbitMQ服务器(特定虚拟主机)。

我想我担心一个用户可能能够读取/写入来自不同队列的消息。有多种解决方案并不令人满意:

  1. 在每个Android应用程序中使用不同的用户:这实际上无法完成,因为Android Market不允许每个下载它的用户使用不同的应用程序。即使它确实如此,无论如何这都是一个愚蠢的想法。

  2. 设置适当的访问控制:http://www.rabbitmq.com/access-control.html。我想这不会阻止恶意攻击者从/无法访问的队列读取/写入消息的问题。

  3. 设置适当的路由键:我想如果每个用户创建另一个队列,它可以从中读取消息并将消息发布到特定定义的队列,这可以工作。但我想问题是一样的,因为用户将使用相同的用户名连接到RabbitMQ:密码:因此该用户可以读取所有队列并写入它们(基于访问规则)。

  4. 我的问题是:如何允许攻击者读取/写入仅代表他当前加入的房间的队列,并阻止访问其他队列?

2 个答案:

答案 0 :(得分:2)

也许我不太了解应用程序,但根据我的经验,RabbitMQ通常用于后端,例如,在创建具有数据库和应用程序服务器以及其他松散耦合实体的分布式系统时。消息队列是异步应用程序设计的一个重要工具,事实上每个消息传递队列理论上可以由RabbitMQ生成一个单独的进程,这使得它具有显着的可扩展性。

您在问题中提到的内容似乎更像是用户的访问控制机制。我会在系统的前端看到这个。例如,在将传入消息传递到消息传递队列之前对传入消息具有过滤机制。您甚至可能希望通过每个用户的速率控制来考虑DoS预防。

干杯!

答案 1 :(得分:2)

我自己正在开发一个扑克应用程序=)

我依靠像Akka / Actors(查看Erlang)这样的流量来通过流媒体网络套接字并希望它能够解决(仍然有点担心安全网络套接字)。

那就是说,我也在考虑接受玩家行动的RabbitMQ。我不认为您希望将用户名或密码暴露给兔子队列。事实上,您可能甚至不希望从外部世界访问队列服务器。

相反,请设置一些用户可以建立连接的服务器。这将是你的Android客户端将与之交谈的“前端”。每个用户将通过安全的TCP连接连接到服务器,然后登录到您的系统。这是用户拥有自己的用户名和密码的地方。如果身份验证成功,请保持套接字处于活动状态(这是我对TCP的了解较弱的地方),然后将用户信息与此套接字关联。

当玩家进行折叠或抬起等操作时,通过安全TCP连接将其操作发送到“前端”(此连接仍应建立)。然后,“前端”检查哪个用户连接到此套接字,然后向队列发布消息,该消息理想地包含用户ID,采取的操作和表id。换句话说,允许进入队列的唯一IP是您的前端服务器,而前端服务器只使用兔子队列的单个用户名/密码。

由你来处理队列消息的交换并将消息路由到正确的表(或确保表只处理它负责的消息 - 这就是我现在正在爱Akka的原因:)一次消息到达表,验证消息中的用户标识是否是实际转向的用户标识,然后根据表的状态验证发送的操作是否可接受。例如,如果我收到CHECK请求并且用户只能CALL / FOLD / RAISE,那么我只会回复说无效操作或只是丢弃整个消息。

不要让公众进入队列,并始终确保没有安全漏洞,特别是如果你开始处理真实货币。

希望这会有所帮助......

编辑:我只是想清楚。只要客户端进行操作,他们只需要发送操作和表ID或您需要的任何信息。不要让他们发送用户ID或任何用户特定信息。您的“前端”服务器应根据请求所在的套接字自动关联用户ID。如果他们提交任何用户信息及其请求,则最好记录它,然后丢弃数据。我会记录它只是因为我不喜欢人们试图作弊,而这可能是他们在向你发送意外数据时所做的事情。