首次发布 -理湃光晶完成数千万元A轮融资
06-17
1简介MQTT(MQ Telemetry Transport,MQ遥测传输)。它是一种发布/订阅、极其简单且轻量级的消息传递协议,设计用于受限设备和低带宽、高延迟或不可靠的网络。
设计原则是尽量减少对网络带宽和设备资源的需求,同时也尽量保证可靠性和一定程度的交付保证。这些原则还使该协议成为“M2M”或“物联网”连接设备的新兴世界以及带宽和电池电量非常宝贵的移动应用的理想选择。
物联网的前景越来越被看好,特别是随着5G的到来,在车联网、车载娱乐(AR等)、智能电网、移动和协作机器人、智能家居等各个领域视频监控、智慧城市等。 5G物联网用例图 IOT ANALYTICS预测,到2020年,全球运行的物联网设备数量将达到342亿台。
各大互联网公司,如亚马逊、微软、阿里巴巴、腾讯、IBM等都推出了物联网云平台。各云平台均支持MQTT协议,支持设备通过MQTT协议直接连接至其云平台。
MQTT 是一种开放协议。我们可以搭建自己的云平台,实现定制化开发。
那么在实现MQTT安全时我们应该注意什么呢?本文从实现 MQTT 协议的 mosquitto 代理的具体示例开始。 IOT ANALYTICS 物联网激活设备趋势预测 图2 安全实现方式 MQTT协议本身支持用户名和密码来实现客户端身份验证,并使用SSL(升级版TLS)对网络数据进行加密(这个与MQTT协议无关)本身会增加网络开销)使用授权管理插件通过Broker配置Topic的读写权限,实现批量级别的用户权限以及Topic的读写权限管理 2.1 使用用户名密码限制连接使用用户名和密码来限制连接,客户端连接broker需要设置broker所需的用户名和密码才能成功连接。
mosquitto.conf: Code language: javascript copy # 指定连接brokerallow_anonymous falsepassword_file {你的密码路径}/passwdfile 的用户名和密码 密码文件生成: Code language: javascript copy mosquitto_passwd [ -c | -D ] 密码文件用户名mosquitto_passwd -b 密码文件用户名密码mosquitto_passwd -U 密码文件 -b 以批处理模式运行。这允许在命令行上提供密码,这很方便,但应谨慎使用,因为密码将在命令行和命令历史记录中可见 -c 创建一个新的密码文件,如果该文件已存在则覆盖该文件。
输入命令后,控制台会提示输入新用户的密码。连续输入两次密码后,密码文件创建完成。
-D 从密码文件中删除指定用户。 -U 此选项可用于使用带有纯字符的哈希密码。
将文本密码密码文件升级/转换为密码文件 2.2 使用SSL(升级版TLS)对网络数据进行加密。使用TLS对网络数据进行加密,需要在配置文件中指定认证文件和密钥文件。
mosquitto.conf:代码语言:javascript copy cafile {您的文件路径}/m2mqtt_ca.crtcertfile {您的文件路径}/m2mqtt_srv.crtkeyfile {您的文件路径}/m2mqtt_srv.key 如何颁发证书,请查看另一篇文章《使用 TLS》 Mosquitto Broker 实现安全通信的密钥和证书生成”; 2.3 配置Broker ACL 通过设置Broker ACL,可以限制指定用户对指定Topic的数据读写权限。mosquitto.conf: Code language: javascript copy # 配置acl_file参数指定acl文件 acl_file {你的文件路径}/aclfileaclfile 文件内容示例: Code language: javascript copy # 以下配置会影响无用户名客户端的访问控制# topic [ read|write|readwrite]
使用授权管理插件 ACL 授予订阅和/或发布特定主题。权限),通过与数据库绑定,将身份认证和ACL管理录入数据库,轻松实现用户认证管理。
该插件对数据库mysql和mongodb支持友好。有关如何使用它的具体说明,请参阅 README。
这里仅给出mysql配置示例。mosquitto.conf: 代码语言: javascript copy # 指定插件所需的动态库 auth_plugin /usr/mosquitto/bin/auth-plug.so # 指定后端数据库 auth_opt_backends mysql # 指定数据库主机地址 auth_opt_host localhost # 指定数据库访问端口 auth_opt_port # 指定数据库名称 auth_opt_dbname your_database# 指定数据库访问用户名 auth_opt_user your_username# 指定数据库访问密码 auth_opt_pass your_passwd# 配置认证查询语句 auth_opt_userquery select (case passwd_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 anonymouSmysql tbl_mqttuser 和 tbl_mqttacls 两张表数据 示例: 代码语言:javascript copy mysql> select * from tbl_mqttacls;+--------+---------------- -+--------+-- --+| acl_id |用户名 |主题 | rw |+--------+--------------+--------+---- +| 1 |用户_1 | #| 6 || 2 |用户_2 | $SYS/# | 4 |+--------+-------------+--- -----+----set 中的行(0.00 秒)mysql> select * from tbl_mqttuser;+---------+--------------+-------- -------------------------------------------------- ----------+---------------------------------------------------- ----------------------------------+------------- ----- ---+--------------------+|用户 ID |用户名 |用户密码 | old_password??注意:对$SYS系统主题设置权限时,需要注意读写权限,一般来说不会开放写入数据的权限,否则系统主题获取到的数据将不会是正确的统计数据,并且可能已被篡改。
在生产环境中,一般系统主题不会打开。 3 小结 物联网的安全尤为重要。
MQTT 是一种广泛使用的轻量级协议。有很多方法可以实现安全。
MQTT协议本身支持用户名和密码来实现客户端身份验证。 SSL(TLS的升级版)可用于验证网络数据。
加密(这个与MQTT协议本身无关,会增加网络开销)。通过Broker可以配置Topic的读写权限,并使用授权管理插件实现对$SYS系统主题的批量级用户权限和主题读写权限管理。
权限设置需要注意读写权限。一般来说,写数据的权限是不会被授予的。
4 扩展MQTT SYS 主题 MQTT v3.1.1 是较旧的ISO 和OASIS 标准,MQTT v5.0 是OASIS 标准。协议定义了静态主题、必须实现的SYS主题和不需要实现的主题。
静态 SYS 主题:关于静态 $SYS 主题的消息不需要在每个 $SYS 主题更新间隔发送,只需在订阅后发送一次。 **所需主题:** 每个声称支持 $SYS 主题的代理(代理,例如 mosquitto)都应该支持这些主题,并且每个代理都需要支持它。
**可选主题:** 代理可以选择实施这些主题。静态主题包含在必需主题和可选主题中。
必需主题: $SYS/broker/load/bytes/received :自代理启动以来接收到的字节总数。 $SYS/broker/load/bytes/sent :自代理启动以来发送的字节总数。
$SYS/broker/clients/connected :当前连接的客户端数量 $SYS/broker/clients/disconnected :在代理上注册但当前已断开连接的持久客户端总数(禁用干净会话)。 $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:代理的版本。
静态主题 可选主题: $SYS/broker/time:服务器上的当前时间 $SYS/broker/timestamp:生成此特定版本的代理时的时间戳。静态主题。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-17
06-17
06-17
06-18
06-18
06-18
06-18
06-18
06-18
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用