5

我正在开发一个将使用 mqtt 的应用程序。我将使用 python 库。我一直倾向于使用 mosquitto,但找不到以编程方式为其设置访问控制限制的方法。我正在编写的应用程序需要能够区分用户,并且只允许他们订阅某些主题。当前的解决方案看起来像是从配置文件完成的。是否有可扩展的解决方案来控制 mosquitto 的访问控制限制?如果没有,您是否知道存在这种情况的 mqtt 代理?

4

3 回答 3

12

即使这可能不再关心您,其他人也会发现它很有用。我在这里关注 mosquitto 的手册页

有两个配置文件,一个是通用的,比如说mosquitto.conf,另一个是 ACL(访问控制列表),比如说acl.conf

mosquitto.conf启用acl.conf文件进行访问控制:

acl_file acl.conf

acl.conf定义访问控制行为:

# users can anonymously publish to the topic 'in'
topic write in
# users can subscribe topics named 'out/%u', where %u is the user's name
pattern read out/%u

# an admin may subscribe to 'in' 
# and publish to all subtopics of 'out/' (note the +)
user adminWithSecretName
topic read in
topic write out/+

我们执行mosquitto -c mosquitto.conf以使用配置文件运行 mosquitto。

在这种情况下,可以通过使用随机生成的用户名来建立动态认证机制。

示例: Alice 想要订阅,以便她可以在这里阅读私人消息。她将她的凭据与随机数一起发送N1in. 此外,她还订阅了主题out/N1,使用N1作为用户名。该模式read out/%u允许这样做。

adminWithSecretName连接并订阅该主题的第三方服务器应用程序in接收 Alice 的消息。它验证其真实性,然后生成一个新的随机数N2并将其发布到out/N1Alice 订阅的位置。

从现在开始——至少对于本次会议而言——out/N2是 Alice 分别在此处的设备将接收消息的常规主题。因此,Alice 取消订阅并断开表单out/N1并订阅out/N2. 第三方服务器应用程序将属于 Alice 的所有新消息发布到主题out/N2

进一步考虑:人们可能还想考虑安全性的其他方面,例如 TLS 和/或每消息加密。根据目标安全/隐私的等级,此处讨论的配置可能还需要 TLS。另一方面,如果消息单独加密,这可能会过时。一个,比如 Eve,如果她可以访问有线/WiFi 流,就可以拦截(甚至订阅!)消息,因为她会将秘密用户名视为纯文本。但是:当一个人已经可以访问数据流时,他/她无论如何都可以截取字节。它们以任何一种方式加密,使用 TLS 或按消息加密。此外,流量分析可以应用于这两种方法。

我建议使用 TLS 或按消息加密。两者都应正确实施和应用,从而带来可比的安全性。

于 2014-07-16T00:38:11.503 回答
5

您可以编写一个插件来为您处理这个问题。有关一些示例,请参见http://mosquitto.org/2013/07/authentication-plugins/

如果您在 mosquitto 邮件列表中询问,您可能会找到更多答案。

于 2013-08-26T19:32:59.107 回答
2

如果您熟悉 Java,您应该尝试 HiveMQ MQTT 代理:http ://www.hivemq.com 。

有一个开放的 PluginSDK,它使您能够为代理编写任何类型的扩展。

您可以实施最适合您的用例的身份验证或授权方法,例如从数据库、文件...

基于主题的授权是一个常见的用例,HiveMQ 插件指南中有一个示例。

作为 HiveMQ 插件开发的入口点,请参阅插件入门页面:http ://www.hivemq.com/documentations/getting-started-plugins/

披露:我是 HiveMQ 的开发人员之一。

于 2013-08-27T07:28:48.673 回答