Mosquitto websockets 安全最佳实践
Posted
技术标签:
【中文标题】Mosquitto websockets 安全最佳实践【英文标题】:Mosquitto websockets security best practice 【发布时间】:2019-12-06 16:03:16 【问题描述】:我有一个 Mosquitto 服务器正在运行,我在该服务器上激活了 websocket 监听器。一切正常,我可以从 Angular 应用程序订阅/发布。我没有从 Mosquitto 激活 SSL,但我使用 nginx 进行了反向代理,有效地加密了 websocket。我无法通过ws
访问,只能通过wss
访问。
现在将 websocket 连接限制为仅对经过身份验证的用户的最佳做法是什么?向外界启用该位置将使 MQTT 服务器加密,但可供所有人使用。有没有办法将连接限制为仅经过身份验证的用户,如果是,如何?
编辑
感谢@john-romkey 的澄清,我现在可以在 Mosquitto 端激活身份验证,并启用受限于 Web 客户端所需操作的用户。该文档还提到了身份验证插件,所以我想知道是否有任何基于令牌的身份验证插件可以消除将用户/密码传递给前端的需要。
【问题讨论】:
【参考方案1】:SSL/TLS 提供两个功能:
首先,它验证客户端连接的服务器。这让客户端知道它连接的服务器可以访问客户端域的加密证书,这意味着您很有可能正在与正确的服务器而不是恶意冒名顶替者交谈。
其次,它可以防止第三方窃听连接。可以访问网络数据的恶意程序将无法解码客户端和服务器之间的通信,也无法对其进行篡改。
它不会以任何方式对客户端进行身份验证。
因此,使用您描述的设置,如果我找到了您的 Mosquitto 代理,我可以连接到 websocket 并订阅我想要的任何主题或发布到我想要的任何主题,因为您描述的设置无法控制谁可以连接到代理以及连接后他们可以做什么。
从安全角度来看,这几乎是一种最糟糕的做法。
Mosquitto 提供了两种验证客户端的机制:
首先,您可以为客户端创建用户名和密码。最佳做法是为每个不同的潜在客户创建唯一的用户名和密码。 Mosquitto 提供了一个 API,允许您使用各种不同的凭据存储,从简单的文本文件到完整的关系数据库(如 Postgresql)。
其次,您可以创建一个唯一标识客户端的客户端证书。
这些允许您验证客户端访问代理。
根据您在 MQTT 代理上构建的 pubsub 网络的复杂性,您还应该考虑限制每个客户端仅访问所需的主题。
这允许您授权客户执行特定工作。
Mosquitto's documentation 讨论如何对客户端进行身份验证和授权。
【讨论】:
感谢您的冗长解释,记住基本知识总是好的。没有人可以收听流量,因为它是加密的,但任何人都可以与服务器交谈......不是 websockets 的专家,我认为他们不提供身份验证功能。如果我激活用户身份验证,它是否也适用于 wss?我会测试看看。如果是这样,我想我只剩下以安全方式将用户/密码传递给 Web 客户端的问题,因此可以验证与 wss 的连接。来晚了,我先看看这里:github.com/mcollina/mosca/issues/603 Websockets 只是一个传输层。身份验证由使用 web 套接字的 MQTT 代理处理,并且完全独立于您是在 websocket、TCP、基于 TCP 的 SSL/TLS 还是其他一些层上运行,因此 Mosquitto 肯定会通过 wss 进行身份验证(和授权)。跨度> 确实,我做了一个快速测试并让它工作。我没有先做对,因为我使用的 ngx-mqtt 库有基本文档。后来我意识到它实际上是一个 MQTT.js 库的包装器,所以创建客户端的大部分属性都在那里描述。在第一阶段,我将创建一个仅对网页所需资源具有有限权限的简单用户(无论如何这是标准的安全实践)。网页是加密的,它提供的任何资源也是如此。如果有人知道可以处理令牌的身份验证插件,那可以是第 2 步。 鉴于我回答了你的问题,请接受我的回答。 不要对您的问题收费。你在这里发布了一个问题,你得到了这个问题的答案。如果您有不同的问题 - 安全令牌和 Mosquitto - 将其作为单独的问题发布。 (答案是 Mosquitto 与 Web 身份验证令牌完全无关,如果您通过 SSL 通过 Web 套接字使用用户名和密码,它们将被加密传递 - 通过 Web 套接字和 SSL 的所有内容都将被加密,因为它是通过 SSL 发送)。以上是关于Mosquitto websockets 安全最佳实践的主要内容,如果未能解决你的问题,请参考以下文章
Websockets + TLS 的 Mosquitto 配置
Ubuntu Mosquitto 代理 websocket 不工作
Mosquitto websockets ERR_CONNECTION_REFUSED letencrypt