物联网中的安全性不能是事后的想法。它是物联网发展的一个组成部分。物联网的理念不仅是将正常的日常事物连接到互联网,而且是在各个端点之间安全地传输数据,以便智能物联网应用程序不仅能够高效、成功地满足各种个人和专业需求,而且具有高度的可靠性。无论是通过网上银行汇款还是在线购物、社交或专业网络,维护最终用户的机密性和隐私是任何基于 Web 或云的服务所必需的。
为了保护物联网系统免受任何黑客攻击和攻击,已经讨论了一个通用的物联网安全模型。现在转向使用MQTT 应用层协议的实际物联网开发,了解协议栈中可用的安全功能非常重要。必须从物联网应用程序开发的初始阶段就利用和使用这些安全功能。
MQTT 是一种轻量级协议,旨在供具有受限资源和通过有限网络带宽进行通信的物联网设备使用。考虑到物联网设备和系统由于应用程序的可扩展性和设备的部署以及设备持续暴露在互联网上而存在的漏洞,MQTT 在设计时启用了网络级别、传输级别和应用程序级别的安全功能. 通过在不同的 OSI 级别启用安全功能,可以避免不同类型的攻击。所有这些安全功能都是标准机制,在不同的供应商和标准组织中具有共同的可接受性。
网络级别——该协议建议使用网关连接设备,然后通过 VPN 将网关连接到代理。设备必须使用 Wi-Fi、Zigbee、蓝牙等安全物理层协议连接到网关。
传输层 – 该协议在传输层使用 TLS/SSL 对数据包进行加密。TLS/SSL 是一种标准的传输层协议,它不仅允许对数据包进行加密,而且还分别使用客户端和服务器证书对客户端和服务器进行身份验证。
应用层——在应用层,MQTT 提供客户端身份验证和数据加密。客户端身份验证通常在代理端借助客户端标识符和用户名/密码凭证完成。同样的方法也用于设备认证。可以有完整的传输层加密或简单的有效载荷加密。
MQTT 协议具有以下安全特性——
1)身份验证——身份验证是当设备连接到代理并与其他设备通信时验证设备身份的过程。这就像在登机之前,机场安检人员会借助护照和带照片的身份证件来验证乘客的身份。通过出示护照,乘客可以向机场当局证明自己的身份。护照是旅客身份的有效证明。在这种情况下,没有其他文件可以作为有效的身份证明,尽管该文件正确说明了乘客的姓名和证件。因此,要登机,乘客必须持有特定证件,即护照。
同样,MQTT 身份验证是在用户名和密码的帮助下完成的。当谈到 MQTT 中的身份验证时,协议本身在 CONNECT 消息中提供了用户名和密码字段。因此,客户端可以在连接到 MQTT 代理时发送用户名和密码。通过在客户端设置用户名和密码,将以文本格式发送给代理。这将允许攻击者进行窃听。因此,保证用户名和密码完全安全传输的唯一方法是使用传输加密。
该协议通过向每个客户端提供唯一的客户端 ID 来允许高级身份验证。客户端在 MQTT CONNECT 消息中使用唯一的客户端 ID。通常的做法是使用 36 个字符长的 UID 或客户端可用的任何其他唯一信息,例如网络模块的 MAC 地址或设备本身的序列号。
2) 授权——授权是指定对某些资源的访问权限的功能。身份验证和授权是不同的东西。例如,如果乘客必须乘飞机旅行,那么他必须出示护照(作为登机的唯一 ID)以表明身份。这称为身份验证。身份验证后,乘客必须出示登机牌才能在特定日期准许乘坐特定飞机。这称为授权。
MQTT 客户端在连接到代理后基本上可以做两件事,它可以发布消息和订阅主题。为了限制客户端只能发布或订阅其授权的主题,需要在代理端实现主题权限。这些权限需要在代理运行期间进行配置和调整。例如,主题权限可能如下所示:
• 允许的主题(确切主题或通配符主题)
• 允许的操作(发布、订阅、两者)
• 允许的服务质量级别(0、1、2、全部)
这种主题权限允许代理为客户端指定授权策略并限制他们订阅主题和发布消息的能力。
3) TLS/SSL 安全性——TLS 在传输层提供安全性。TLS 主要用于提供安全的通信通道。通过使用 TLS 加密数据包,第三方无法读取或更改其内容。如果通过在 MQTT 连接数据包中放置用户名和密码字段来采用身份验证和授权机制,强烈建议使用 TLS。TLS 具有握手机制来协商各种参数以在客户端和服务器之间创建安全连接。端口 8883 针对安全 TLS/SSL MQTT 连接进行了标准化。许多代理(如 Mosquitto)支持 TLS 安全性。
由于每个数据包都在 MQTT TLS 安全性中加密,因此增加了通信或握手开销。这对于受限设备来说是不可行的。因此,只有在物联网设备能够承受通信开销的情况下,才应该每次都使用 TLS。使用 TLS 进行完整的传输层加密是开发人员的一种选择。如果代理提供 TLS 加密,开发人员可以使用或避免使用它。
然而,通过使用会话恢复技术,可以显着改善基于 TLS 的 TCP 连接的开销。会话恢复允许与代理重新连接而无需反复进行完整的 TLS 握手。会话恢复可以通过使用会话 ID 或会话票证以两种方式完成。在会话 ID 方法中,代理将秘密状态与会话 ID 一起存储。当客户端与代理重新连接时,它会发送可以恢复会话的会话 ID。在会话票证方法中,秘密状态被传输到客户端并使用只有经纪人知道的秘密密钥进行加密。客户端与代理重新连接时,会将此票证发回给它。如果代理可以再次解密内容,会话将以秘密票证中包含的状态恢复。
不过,会话恢复技术只有在客户与代理保持长期联系时才有用。如果客户端频繁断开并重新连接到代理,则此技术用处不大。
4) 有效载荷加密——有效载荷加密在应用层提供安全性。当开发人员不使用 TLS 安全性但仍不想以纯文本形式发送数据时,将使用有效负载加密。这提供了额外的安全层,因为通过这种方式,所有应用程序数据也得到保护和加密。有效载荷加密允许对实际应用程序数据进行加密,而不是完全传输级加密。虽然应用程序元数据(主题)保持未加密状态,但有效负载或消息仍以这种方式保持加密状态。
加密消息可能有两种情况 –
a) 端到端加密——这种方法允许应用程序数据始终被加密。数据是加密的,它由发布者发布到它被传递给订阅者。当代理收到数据包时,它会得到未加密的主题(路由和 QoS)和加密的消息,它看不到加密的消息。只有受信任的客户端才能访问密钥以再次解密消息。
这种类型的加密用于代理无法使用身份验证和授权或使用像 broker.mqttdashboard.com 这样的公共代理的情况。在这种情况下,应用程序开发人员只能加密消息或实际应用程序数据,但仍然没有提供身份验证和授权的选项。
20123920196344848b9d7759d0eb32eb~noop.image?_iz=58558&from=article.jpg

图 1:图像说明 MQTT 协议安全中的端到端有效负载加密
b) 客户端到代理加密:客户端到代理的方法确保消息的有效负载在一个客户端和代理之间的通信中被加密。代理能够在分发消息之前解密消息,因此所有订阅者都会收到原始的未加密消息。这种方法需要一个代理插件来即时解密消息。
2f34f9073d114d4ea2a1280db2fa0afd~noop.image?_iz=58558&from=article.jpg

图 2:图像说明 MQTT 协议安全中的客户端到代理有效负载加密
建议仅在代理不提供 TLS/SSL 安全加密或尽管可用但未使用时才使用负载加密。有效载荷加密可防止数据被窃听者黑客攻击或攻击,但不能防止中间人 (MITM) 攻击。只有通过 TLS 加密情况下提供的安全通道发送整个数据,才能防止 MITM。