前言
安全保护几乎对于所有的项目都是一个挑战,对于物联网项目更是如,自普及应用以来物联网业内已经发生过多起安全事故。
作为物联网通信协议事实标准,MQTT 保持着较高的安全性,提供了多层次的安全设计:
传输层:MQTT 基于 TCP/IP 协议,可以在传输层上使用 SSL/TLS 进行加密传输:
使用 SSL/TLS 加密通信数据,防止中间人攻击;
使用客户端证书作为设备身份凭证,验证设备合法性。
应用层:使用 MQTT 自身的安全特性进行防护:
MQTT 协议支持用户名和密码实现客户端的身份校验;
MQTT Broker 实现了 Topic 的读写权限控制(Topic ACL)。
EMQ X 完整支持 MQTT 各项安全规范,内置的安全功能无需编程开箱即用,可以快速排除项目中的安全隐患。本系列将围绕各个层次的安全规范,介绍如何通过配置 EMQ X 启用相关功能最终实现相应的安全防护。
emqx-auth-mysql 简介
emqx_auth_mysql 是基于 MySQL 数据库的 MQTT 认证/访问控制插件,通过检查每个终端接入的 username 和 password 是否与用户指定的 MySQL 数据库中存储的信息一致性来实现对终端的连接认证和访问控制。其功能逻辑如下:
本文仅介绍认证功能,ACL 功能见后续文章。
认证原理
设备连接时 EMQ X 将执行按照配置的查询语句,比较查询结果中的 password 字段的值是否与当前请求客户端的密码进行加盐 (salt) 处理、加密后的值是否相等,验证流程如下:
查询结果集中必须有 password、salt 字段,可以使用 AS 语法设置如 SELECT *, pwd as password FROM mqtt_user
在数据库中可以为每个客户端都指定一个 salt,EMQ X 根据客户端传入的密码和通过 SQL 返回的 salt 信息生成密文
结果集为空或比对结果不相等,认证失败