溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于MySQL的EMQ X Auth & ACL怎么使用

發布時間:2021-12-08 09:16:38 來源:億速云 閱讀:291 作者:iii 欄目:互聯網科技
# 基于MySQL的EMQ X Auth & ACL使用指南

## 目錄
- [1. 概述](#1-概述)
- [2. EMQ X認證與授權基礎](#2-emq-x認證與授權基礎)
  - [2.1 認證(Auth)機制](#21-認證auth機制)
  - [2.2 訪問控制(ACL)機制](#22-訪問控制acl機制)
- [3. MySQL數據庫準備](#3-mysql數據庫準備)
  - [3.1 數據庫表設計](#31-數據庫表設計)
  - [3.2 示例數據插入](#32-示例數據插入)
- [4. EMQ X配置MySQL認證](#4-emq-x配置mysql認證)
  - [4.1 基本配置](#41-基本配置)
  - [4.2 密碼加密方式](#42-密碼加密方式)
  - [4.3 超級用戶配置](#43-超級用戶配置)
- [5. EMQ X配置MySQL ACL](#5-emq-x配置mysql-acl)
  - [5.1 ACL規則表配置](#51-acl規則表配置)
  - [5.2 ACL緩存配置](#52-acl緩存配置)
- [6. 功能驗證](#6-功能驗證)
  - [6.1 認證測試](#61-認證測試)
  - [6.2 ACL測試](#62-acl測試)
- [7. 高級配置與優化](#7-高級配置與優化)
  - [7.1 分庫分表支持](#71-分庫分表支持)
  - [7.2 連接池優化](#72-連接池優化)
  - [7.3 性能調優建議](#73-性能調優建議)
- [8. 常見問題排查](#8-常見問題排查)
- [9. 總結](#9-總結)

## 1. 概述

EMQ X作為一款高性能的MQTT消息服務器,其安全機制是保障物聯網系統可靠運行的關鍵。本文將詳細介紹如何基于MySQL數據庫實現EMQ X的認證(Auth)和訪問控制(ACL)功能,通過約3850字的詳細講解,幫助開發者快速掌握這一重要配置技能。

## 2. EMQ X認證與授權基礎

### 2.1 認證(Auth)機制

認證是驗證客戶端身份合法性的過程,EMQ X支持多種認證方式:
- 用戶名/密碼認證
- Client ID認證
- JWT認證
- 各類數據庫認證(MySQL、PostgreSQL等)
- HTTP API認證

其中MySQL認證是最常用的一種企業級方案,適合已有用戶管理系統的情況。

### 2.2 訪問控制(ACL)機制

ACL(Access Control List)用于控制客戶端對主題的訪問權限,主要包括:
- 發布權限(PUB)
- 訂閱權限(SUB)
- 發布/訂閱權限(PUBSUB)

```sql
-- 典型ACL規則示例
allow user1 subscribe /devices/+/temperature
deny user2 publish /security/+

3. MySQL數據庫準備

3.1 數據庫表設計

認證表結構

CREATE TABLE `mqtt_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) DEFAULT NULL,
  `password` varchar(100) 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=InnoDB DEFAULT CHARSET=utf8mb4;

ACL表結構

CREATE TABLE `mqtt_acl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `allow` int(1) DEFAULT 1 COMMENT '0: deny, 1: allow',
  `ipaddr` varchar(60) DEFAULT NULL COMMENT 'IP Address',
  `username` varchar(100) DEFAULT NULL COMMENT 'Username',
  `clientid` varchar(100) DEFAULT NULL COMMENT 'Client ID',
  `access` int(2) NOT NULL COMMENT '1: subscribe, 2: publish, 3: pubsub',
  `topic` varchar(100) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  INDEX `ipaddr` (`ipaddr`),
  INDEX `username` (`username`),
  INDEX `clientid` (`clientid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3.2 示例數據插入

-- 認證用戶數據
INSERT INTO `mqtt_user` VALUES 
(1, 'admin', '5f4dcc3b5aa765d61d8327deb882cf99', null, 1, NOW()),
(2, 'client1', '5f4dcc3b5aa765d61d8327deb882cf99', null, 0, NOW());

-- ACL規則數據
INSERT INTO `mqtt_acl` VALUES 
(1, 1, NULL, 'admin', NULL, 3, '#'),
(2, 1, NULL, 'client1', NULL, 1, '/devices/+/status'),
(3, 0, NULL, 'client1', NULL, 2, '/devices/+/control');

4. EMQ X配置MySQL認證

4.1 基本配置

修改etc/plugins/emqx_auth_mysql.conf:

# 啟用插件
auth.mysql.enable = true

# 數據庫連接配置
auth.mysql.server = 127.0.0.1:3306
auth.mysql.pool = 8
auth.mysql.username = emqx
auth.mysql.password = emqx123
auth.mysql.database = mqtt_auth

# 認證查詢SQL
auth.mysql.auth_query = SELECT password FROM mqtt_user WHERE username = '%u' LIMIT 1

4.2 密碼加密方式

EMQ X支持多種密碼加密方式:

# 明文密碼(不推薦)
auth.mysql.password_hash = plain

# MD5加密
auth.mysql.password_hash = md5

# SHA256加密
auth.mysql.password_hash = sha256

# PBKDF2加密
auth.mysql.password_hash = pbkdf2
auth.mysql.password_hash.salt = emqx_salt
auth.mysql.password_hash.iteration = 4096

4.3 超級用戶配置

# 超級用戶查詢SQL
auth.mysql.super_query = SELECT is_superuser FROM mqtt_user WHERE username = '%u' LIMIT 1

# 超級用戶標志
auth.mysql.super_query.column = is_superuser

5. EMQ X配置MySQL ACL

5.1 ACL規則表配置

修改etc/plugins/emqx_acl_mysql.conf:

# ACL查詢SQL
acl.mysql.acl_query = SELECT allow, ipaddr, username, clientid, access, topic FROM mqtt_acl WHERE ipaddr = '%a' OR username = '%u' OR username = '$all' OR clientid = '%c'

5.2 ACL緩存配置

# ACL緩存時間(秒)
acl.mysql.acl_cache = 60

# ACL緩存最大數量
acl.mysql.acl_cache_max = 1000

6. 功能驗證

6.1 認證測試

使用MQTT客戶端工具測試:

# 正確認證
mosquitto_sub -t 'test' -u 'client1' -P 'password'

# 錯誤認證(應被拒絕)
mosquitto_sub -t 'test' -u 'client1' -P 'wrongpass'

6.2 ACL測試

# 測試訂閱權限(應成功)
mosquitto_sub -t '/devices/001/status' -u 'client1' -P 'password'

# 測試發布權限(應失敗)
mosquitto_pub -t '/devices/001/control' -m 'hello' -u 'client1' -P 'password'

7. 高級配置與優化

7.1 分庫分表支持

對于大規模部署,建議采用分庫分表策略:

-- 按用戶ID范圍分表
CREATE TABLE mqtt_user_0 LIKE mqtt_user;
CREATE TABLE mqtt_user_1 LIKE mqtt_user;

7.2 連接池優化

# 連接池大小(建議為CPU核心數的2-3倍)
auth.mysql.pool = 16

# 連接超時(毫秒)
auth.mysql.query_timeout = 5000

7.3 性能調優建議

  1. 為MySQL表添加合適的索引
  2. 定期清理不活躍用戶
  3. 啟用ACL緩存減少數據庫查詢
  4. 監控MySQL性能指標

8. 常見問題排查

Q1: 認證失敗但密碼正確 - 檢查密碼加密方式是否匹配 - 驗證SQL查詢語句是否正確返回結果

Q2: ACL規則不生效 - 檢查ACL查詢SQL是否包含所有條件(%a, %u, %c) - 驗證規則順序(EMQ X按allow→deny順序匹配)

Q3: 性能瓶頸 - 檢查MySQL慢查詢日志 - 考慮增加連接池大小 - 評估是否需要讀寫分離

9. 總結

本文詳細介紹了基于MySQL實現EMQ X認證與ACL的完整方案,主要內容包括: 1. 數據庫表結構設計與示例數據 2. EMQ X認證插件的詳細配置 3. ACL訪問控制的實現方法 4. 功能驗證與性能優化建議

通過MySQL集成,企業可以充分利用現有用戶管理系統,構建安全可靠的MQTT消息服務。實際部署時,建議根據業務規模選擇合適的數據庫架構,并定期進行安全審計。

注:本文基于EMQ X 4.3版本編寫,不同版本配置可能略有差異,請以官方文檔為準。 “`

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女