溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

基于MySQL的MQTT連接認(rèn)證怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2021-12-07 09:16:59 來源:億速云 閱讀:542 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容主要講解“基于MySQL的MQTT連接認(rèn)證怎么實(shí)現(xiàn)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“基于MySQL的MQTT連接認(rèn)證怎么實(shí)現(xiàn)”吧!

前言

安全保護(hù)幾乎對(duì)于所有的項(xiàng)目都是一個(gè)挑戰(zhàn),對(duì)于物聯(lián)網(wǎng)項(xiàng)目更是如,自普及應(yīng)用以來物聯(lián)網(wǎng)業(yè)內(nèi)已經(jīng)發(fā)生過多起安全事故。

作為物聯(lián)網(wǎng)通信協(xié)議事實(shí)標(biāo)準(zhǔn),MQTT 保持著較高的安全性,提供了多層次的安全設(shè)計(jì):

  • 傳輸層:MQTT 基于 TCP/IP 協(xié)議,可以在傳輸層上使用 SSL/TLS 進(jìn)行加密傳輸:

    • 使用 SSL/TLS 加密通信數(shù)據(jù),防止中間人攻擊;

    • 使用客戶端證書作為設(shè)備身份憑證,驗(yàn)證設(shè)備合法性。

  • 應(yīng)用層:使用 MQTT 自身的安全特性進(jìn)行防護(hù):

    • MQTT 協(xié)議支持用戶名和密碼實(shí)現(xiàn)客戶端的身份校驗(yàn);

    • MQTT Broker 實(shí)現(xiàn)了 Topic 的讀寫權(quán)限控制(Topic ACL)。

EMQ X 完整支持 MQTT 各項(xiàng)安全規(guī)范,內(nèi)置的安全功能無需編程開箱即用,可以快速排除項(xiàng)目中的安全隱患。

emqx-auth-mysql 簡(jiǎn)介

emqx_auth_mysql 是基于 MySQL 數(shù)據(jù)庫(kù)的 MQTT 認(rèn)證/訪問控制插件,通過檢查每個(gè)終端接入的 usernamepassword 是否與用戶指定的 MySQL 數(shù)據(jù)庫(kù)中存儲(chǔ)的信息一致性來實(shí)現(xiàn)對(duì)終端的連接認(rèn)證和訪問控制。其功能邏輯如下:

基于MySQL的MQTT連接認(rèn)證怎么實(shí)現(xiàn)

本文僅介紹認(rèn)證功能,ACL 功能見后續(xù)文章。

認(rèn)證原理

設(shè)備連接時(shí) EMQ X 將執(zhí)行按照配置的查詢語句,比較查詢結(jié)果中的 password 字段的值是否與當(dāng)前請(qǐng)求客戶端的密碼進(jìn)行加鹽 (salt) 處理、加密后的值是否相等,驗(yàn)證流程如下:

  • 查詢結(jié)果集中必須有 password、salt 字段,可以使用 AS 語法設(shè)置如 SELECT *, pwd as password FROM mqtt_user

  • 在數(shù)據(jù)庫(kù)中可以為每個(gè)客戶端都指定一個(gè) salt,EMQ X 根據(jù)客戶端傳入的密碼和通過 SQL 返回的 salt 信息生成密文

  • 結(jié)果集為空或比對(duì)結(jié)果不相等,認(rèn)證失敗

創(chuàng)建數(shù)據(jù)庫(kù)

你可以使用任何自己喜歡的 客戶端,創(chuàng)建好相應(yīng)的數(shù)據(jù)庫(kù)。這里用的是 MySQL 自帶的命令行客戶端,打開 MySQL 的控制臺(tái),如下所示,創(chuàng)建一個(gè)名為 emqx 的認(rèn)證數(shù)據(jù)庫(kù),并切換到 emqx 數(shù)據(jù)庫(kù)。

mysql> create database emqx;Query OK, 1 row affected (0.00 sec)mysql> use emqx;Database changed
創(chuàng)建表

建議的表結(jié)構(gòu)如下,其中,

  • username 為客戶端連接的時(shí)候指定的用戶名

  • password_hash 為使用 salt 加密后的密文

  • salt 為加密串

  • is_superuser 是否為超級(jí)用戶,用于控制 ACL,缺省為0;設(shè)置成 1 的時(shí)候?yàn)槌?jí)用戶,可以跳過 ACL 檢查

數(shù)據(jù)表字段可以不用完全跟下面的一致,可以根據(jù)業(yè)務(wù)需要設(shè)置,通過 emqx_auth_mysql.conf 配置文件中的 auth_query 配置項(xiàng)來指定。

CREATE TABLE `mqtt_user` (  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,  `username` varchar(100) DEFAULT NULL,  `password_hash` varchar(255) DEFAULT NULL,  `salt` varchar(40) DEFAULT NULL,  `is_superuser` tinyint(1) DEFAULT 0,  `created` datetime DEFAULT NULL,  PRIMARY KEY (`id`),  UNIQUE KEY `mqtt_username` (`username`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;

創(chuàng)建成功后,查看一下表結(jié)構(gòu)如下,

mysql> desc mqtt_user;+---------------+------------------+------+-----+---------+----------------+| Field         | Type             | Null | Key | Default | Extra          |+---------------+------------------+------+-----+---------+----------------+| id            | int(11) unsigned | NO   | PRI | NULL    | auto_increment || username      | varchar(100)     | YES  | UNI | NULL    |                || password_hash | varchar(255)     | YES  |     | NULL    |                || salt          | varchar(40)      | YES  |     | NULL    |                || is_superuser  | tinyint(1)       | YES  |     | 0       |                || created       | datetime         | YES  |     | NULL    |                |+---------------+------------------+------+-----+---------+----------------+6 rows in set (0.01 sec)
準(zhǔn)備認(rèn)證數(shù)據(jù)

本文提供示例數(shù)據(jù)中密碼為 test_password,加密 salt 為 secret。即客戶端連接時(shí)使用的密碼是 test_password

在 EMQ X 的配置文件的 auth.mysql.password_hash 中,salt 只是一個(gè)標(biāo)識(shí)符,表示 salt 與密碼明文的拼接關(guān)系

  • 如果采用auth.mysql.password_hash = md5,salt ,那么 EMQ X 使用 MD5 算法對(duì) test_passwordsecret 字符串加密

  • 如果采用auth.mysql.password_hash = salt,md5 ,那么 EMQ X 使用 MD5 算法對(duì) secrettest_password 字符串加密

本文采用第一種配置方式,將得到的 MD5 密文插入表 mqtt_user。讀者可以通過在線的 MD5 工具或者自己寫程序?qū)γ艽a進(jìn)行編碼。

MD5("test_passwordsecret") -> a904b2d1d2b2f73de384955022964595
mysql> INSERT INTO mqtt_user(username,password_hash,salt) VALUES('test_username', 'a904b2d1d2b2f73de384955022964595', 'secret');Query OK, 1 row affected (0.00 sec)mysql> select * from mqtt_user;+----+----------------+----------------------------------+--------+--------------+---------+| id | username       | password_hash                    | salt   | is_superuser | created |+----+----------------+----------------------------------+--------+--------------+---------+|  3 | test_username1 | a904b2d1d2b2f73de384955022964595 | secret |            0 | NULL    |+----+----------------+----------------------------------+--------+--------------+---------+1 row in set (0.00 sec)
啟用認(rèn)證功能

修改插件配置并啟用插件

修改 etc/plugins/emqx_auth_mysql.conf,修改后的有效配置如下所示,其余 ACL 相關(guān)的配置項(xiàng)可以注釋:

## 修改為實(shí)際 mysql 所在的服務(wù)器地址auth.mysql.server = localhost:3306## 修改為上面創(chuàng)建成功的 emqx 數(shù)據(jù)庫(kù)auth.mysql.database = emqx## 連接認(rèn)證查詢語句auth.mysql.auth_query = SELECT password_hash AS password, salt FROM mqtt_user WHERE username = '%u'## 加密算法 plain | md5 | sha | sha256 | bcrypt## 加鹽加密算法auth.mysql.password_hash = md5,salt## 不加鹽加密算法,直接寫算法名稱即可# auth.mysql.password_hash = md5

修改完畢后使用 Dashboard 或命令行重啟插件以應(yīng)用配置,命令行重啟示例如下:

emqx_ctl plugins reload emqx_auth_mysql

關(guān)閉匿名認(rèn)證

EMQ X 默認(rèn)開啟了匿名認(rèn)證,即便啟用了認(rèn)證功能,數(shù)據(jù)庫(kù)沒有查詢到數(shù)據(jù)時(shí)設(shè)備也能正常連接,只有當(dāng)查詢到數(shù)據(jù)且密碼錯(cuò)誤時(shí)才會(huì)拒絕連接。

打開 etc/emqx.conf 配置文件,禁用匿名認(rèn)證:

## Value: true | falseallow_anonymous = false

重啟 emqx 完成配置應(yīng)用。

測(cè)試

準(zhǔn)備就緒后,僅通過認(rèn)證校驗(yàn)之后的設(shè)備才能成功連接到 EMQ X:

  1. 使用正確的用戶名和密碼進(jìn)行連接,并訂閱 "topic" 主題,可以連接成功:

$ mosquitto_sub -p 1883 -u test_username -P test_password -t 'topic' -d
Client mosqsub|5228-wivwiv-mac sending CONNECT
Client mosqsub|5228-wivwiv-mac received CONNACK
Client mosqsub|5228-wivwiv-mac sending SUBSCRIBE (Mid: 1, Topic: topic, QoS: 0)
Client mosqsub|4119-zh
ouzibode received SUBACK
Subscribed (mid: 1): 0
  1. 使用錯(cuò)誤的用戶名或密碼進(jìn)行連接,并訂閱 "topic" 主題,連接失敗:

$ mosquitto_sub -p 1883 -u test_username -P test_password -t 'topic' -d
Client mosqsub/61879-wivwiv-ma sending CONNECT
Client mosqsub/61879-wivwiv-ma received CONNACK
Connection Refused: not authorised.

到此,相信大家對(duì)“基于MySQL的MQTT連接認(rèn)證怎么實(shí)現(xiàn)”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI