热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c++mqtt客户端_MQTT安全性设计详解

1前言MQTT(MQTelemetryTransport,MQ遥测传输)。它是一种发布订阅、极其简单和轻量级的消息传递协议,旨在用于受限设备和低带宽,高

1 前言

MQTT(MQ Telemetry Transport, MQ 遥测传输)。它是一种发布/订阅、极其简单和轻量级的消息传递协议,旨在用于受限设备和低带宽,高延迟或不可靠的网络。设计原则是使网络带宽和设备资源要求最小化,同时还要尝试确保可靠性和一定程度的交付保证。这些原则也使该协议成为新兴的“M2M”或“物联网”连接设备世界的理想选择,并且适用于带宽和电池电量极为宝贵的移动应用。

物联网的前景变得越来越大,尤其是 5G 的到来,各领域如车联网、车载娱乐(AR 等)、智能电网、移动和协作机器人、智能视频监控、智慧城市等等。

6205083b636806c1152d624f98ddca3c.png

5G 物联网用例图

IOT ANALYTICS机构预测到 2025 年全世界运行的物联网设备能达到 342 亿(34.2billion)。各互联网大头公司,如亚马逊、微软、阿里巴巴、腾讯、IBM 等等都推出了物联网云平台。而每个云平台都对 MQTT 协议支持,支持直接将设备通过 MQTT 协议与他们的云平台对接起来。MQTT 是一个开放的协议,我们可以自己去搭建自己的云平台,实现定制化开发,那么在实现 MQTT 安全上有什么需要注意的地方呢?本文从实现了 MQTT 协议的 mosquitto broker 具体示例来讲述。

f407565bea78a4f0fc99665b929b0df5.png

IOT ANALYTICS物联网激活设备趋势预测图

2 安全实现方式

  • MQTT 协议本身支持用户名和密码实现客户端的身份校验
  • 使用 SSL(升级版本 TLS)对网络数据进行加密(这与 MQTT 协议本身是无关的,会增加网络开销)
  • 通过 Broker 配置对 Topic 的读写权限
  • 使用授权管理插件,实现批量级用户权限和 topic 的读写权限管理

2.1 使用用户名和密码限制连接

通过使用用户名和密码限制连接的方式,客户端连接 broker 时需要设置与 broker 要求的用户名密码才能够连接成功。

mosquitto.conf:

# 指定用户名和密码才能连接brokerallow_anonymous falsepassword_file {your password path}/passwdfile

密码文件的生成:

mosquitto_passwd [ -c | -D ] passwordfile usernamemosquitto_passwd -b passwordfile username passwordmosquitto_passwd -U passwordfile-b 以批处理模式运行。这允许在命令行提供密码,这可以很方便,但应小心使用,因为密码将在命令行和命令历史记录中可见-c 创建一个新的密码文件,如果文件已经存在,则会覆盖。输入命令后,控制台会提示输入新建用户的密码,连续输入两次密码后,则密码文件创建完成-D 从密码文件中删除指定的用户-U 此选项可用于使用哈希密码将带有纯文本密码的密码文件升级/转换为一个密码文件

2.2 使用 SSL(升级版本 TLS)对网络数据进行加密

使用 TLS 对网络数据加密,需要在配置文件中指定认证文件、密钥文件。

mosquitto.conf:

cafile {your file path}/m2mqtt_ca.crtcertfile {your file path}/m2mqtt_srv.crtkeyfile {your file path}/m2mqtt_srv.key

如何签发证书,查看另一篇文章“使用 TLS 和 Mosquitto Broker 实现安全通信之密钥和证书生成”;

2.3 配置 Broker ACL

通过设置 Broker ACL,可以限制指定用户对指定 Topic 的数据读写权限。

mosquitto.conf:

# 配置acl_file参数为指定acl文件acl_file {your file path}/aclfile

aclfile 文件内容示例:

# 如下配置会影响没有用户名的客户端的访问控制# topic [read|write|readwrite] topic read $SYS/## 如下配置会影响用户名为 "roger" 的访问控制.user rogertopic foo/bar# 如下配置会影响所有客户端# pattern [read|write|readwrite] pattern write $SYS/broker/connection/%c/state

2.4 使用授权管理插件,实现批量级用户权限和 topic 的读写权限管理

使用授权管理插件 https://github.com/jpmens/mosquitto-auth-plug

该插件可以执行身份验证(检查用户名/密码)和授权(通过 ACL 授予订阅和/或发布特定主题的许可),通过与数据库绑定,将身份验证和 ACL 管理录入数据库,从而很方便的实现用户身份验证管理。该插件对数据库 mysql 及 mongodb 支持很友好。具体怎么使用可以参考 README。这里仅给出 mysql 配置示例。

fcf6b1131ef1e0c7ec84ce8cb625f521.png

mosquitto.conf:

# 指定插件所需动态库auth_plugin /usr/mosquitto/bin/auth-plug.so# 指定后端数据库auth_opt_backends mysql# 指定数据库主机地址auth_opt_host localhost# 指定数据库访问端口auth_opt_port 3306# 指定数据库名auth_opt_dbname your_database# 指定数据库访问用户名auth_opt_user your_username# 指定数据库访问密码auth_opt_pass your_passwd# 配置身份验证查询语句auth_opt_userquery select (case password_syncstatus when 'sync' then user_passwd else old_password end) as user_passwd from tbl_mqttuser where user_name='%s'# 配置ACL验证查询语句auth_opt_aclquery SELECT topic FROM tbl_mqttacls WHERE (user_name = '%s') AND (rw >= %d)# 匿名MQTT连接时插件配置的用户名auth_opt_anonusername anonymouS

mysql 中 tbl_mqttuser 及 tbl_mqttacls 两个表数据示例:

mysql> select * from tbl_mqttacls;+--------+--------------+--------+----+| acl_id | user_name | topic | rw |+--------+--------------+--------+----+| 1 | user_1 | # | 6 || 2 | user_2 | $SYS/# | 4 |+--------+--------------+--------+----+4 rows in set (0.00 sec)mysql> select * from tbl_mqttuser;+---------+--------------+---------------------------------------------------------------------+---------------------------------------------------------------------+---------------------+---------------------+| user_id | user_name | user_passwd | old_password

⚠️ 注意:对$SYS系统主题的权限设置需要注意读写权限,一般来说是不会开放写数据权限的,否则系统主题得到的数据就不是正确的统计数据了,可能是篡改掉了的。在生产环境中一般系统主题是不会开放的。

3 总结

  • 物联网的安全尤为重要,MQTT 作为广泛使用的轻量级协议,实现安全的方式有多种
  • MQTT 协议本身支持用户名和密码实现客户端的身份校验
  • 使用 SSL(升级版本 TLS)可以对网络数据进行加密(这与 MQTT 协议本身是无关的,会增加网络开销)
  • 通过 Broker 可以配置对 Topic 的读写权限
  • 使用授权管理插件,实现批量级用户权限和 topic 的读写权限管理
  • 对$SYS系统主题的权限设置需要注意读写权限,一般来说是不会开放写数据权限

4 扩展之 MQTT SYS 主题

MQTT v3.1.1 是较旧的 ISO 和 OASIS 标准,MQTT v5.0 是 OASIS 标准,该协议定义了静态主题、必须实现的SYS主题和非必须实现的主题。

静态 SYS 主题: 不需要在每个$SYS主题更新时间间隔上发送有关静态$SYS主题的消息,只有在订阅了之后才发送一次。**必选主题:**每个声称支持$SYS主题的代理(broker,如 mosquitto)都应支持这些主题,是每个 broker 都需要支持的。**可选主题:**代理可以选择性实现这些主题。

必选主题和可选主题中包含静态主题。

必选主题:

  • $SYS/broker/load/bytes/received : 自代理启动以来收到的字节总数。
  • $SYS/broker/load/bytes/sent : 自代理启动以来发送的字节总数。
  • $SYS/broker/clients/connected : 当前连接的客户端数
  • $SYS/broker/clients/disconnected : 在代理上注册但当前已断开连接的持久客户端总数(禁用了 clean session)。
  • $SYS/broker/clients/maximum : 已连接到代理的最大活动客户端数。仅在更新$SYS主题树时才计算此值,因此可能不计算短暂的客户端连接。
  • $SYS/broker/clients/total : 当前已在代理上连接并注册的持久会话的已连接和已断开连接的客户端总数。
  • $SYS/broker/messages/received : 自代理启动以来收到的任何类型的消息总数。
  • $SYS/broker/messages/sent : 自代理启动以来发送的任何类型的消息总数。
  • $SYS/broker/messages/publish/dropped : 由于运行中/排队限制而删除的发布消息总数。
  • $SYS/broker/messages/publish/received : 自代理启动以来收到的 PUBLISH 消息总数。
  • $SYS/broker/messages/publish/sent : 自代理启动以来发送的 PUBLISH 消息总数。
  • $SYS/broker/messages/retained/count: 代理上活动的保留消息总数。
  • $SYS/broker/subscriptions/count: 代理上活动的订阅总数。
  • $SYS/broker/uptime: 代理已联机的时间(以秒为单位)
  • $SYS/broker/version: broker 的版本。静态主题

可选主题:

  • $SYS/broker/time: 服务器上的当前时间
  • $SYS/broker/timestamp: 生成此特定版本的代理的时间戳。静态主题。
  • ......

5 参考链接

  • https://github.com/mqtt/mqtt.github.io/wiki/SYS-Topics
  • https://docs.vernemq.com/configuration/bridge
  • https://www.hivemq.com/blog/why-you-shouldnt-use-sys-topics-for-monitoring/
  • https://mosquitto.org/man/mosquitto-8.html
  • http://mqtt.org/faq
  • https://iot-analytics.com/state-of-the-iot-update-q1-q2-2018-number-of-iot-devices-now-7b/
  • https://blog.teserakt.io/2019/02/25/securing-the-mosquitto-mqtt-broker/
  • https://github.com/jpmens/mosquitto-auth-plug

本文分享自微信公众号 - 小白AI(gh_c002f3b12bc2)



推荐阅读
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • MongoDB用户验证auth的权限设置及角色说明
    本文介绍了MongoDB用户验证auth的权限设置,包括readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase、cluster相关的权限以及root权限等角色的说明和使用方法。 ... [详细]
  • Postgresql备份和恢复的方法及命令行操作步骤
    本文介绍了使用Postgresql进行备份和恢复的方法及命令行操作步骤。通过使用pg_dump命令进行备份,pg_restore命令进行恢复,并设置-h localhost选项,可以完成数据的备份和恢复操作。此外,本文还提供了参考链接以获取更多详细信息。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • phpcomposer 那个中文镜像是不是凉了 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 本文介绍了如何使用PHP代码将表格导出为UTF8格式的Excel文件。首先,需要连接到数据库并获取表格的列名。然后,设置文件名和文件指针,并将内容写入文件。最后,设置响应头部,将文件作为附件下载。 ... [详细]
  • Centos7搭建ELK(Elasticsearch、Logstash、Kibana)教程及注意事项
    本文介绍了在Centos7上搭建ELK(Elasticsearch、Logstash、Kibana)的详细步骤,包括下载安装包、安装Elasticsearch、创建用户、修改配置文件等。同时提供了使用华为镜像站下载安装包的方法,并强调了保证版本一致的重要性。 ... [详细]
  • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
    nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
author-avatar
yfx132435
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有