# 基于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/+
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;
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;
-- 認證用戶數據
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');
修改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
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
# 超級用戶查詢SQL
auth.mysql.super_query = SELECT is_superuser FROM mqtt_user WHERE username = '%u' LIMIT 1
# 超級用戶標志
auth.mysql.super_query.column = is_superuser
修改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'
# ACL緩存時間(秒)
acl.mysql.acl_cache = 60
# ACL緩存最大數量
acl.mysql.acl_cache_max = 1000
使用MQTT客戶端工具測試:
# 正確認證
mosquitto_sub -t 'test' -u 'client1' -P 'password'
# 錯誤認證(應被拒絕)
mosquitto_sub -t 'test' -u 'client1' -P 'wrongpass'
# 測試訂閱權限(應成功)
mosquitto_sub -t '/devices/001/status' -u 'client1' -P 'password'
# 測試發布權限(應失敗)
mosquitto_pub -t '/devices/001/control' -m 'hello' -u 'client1' -P 'password'
對于大規模部署,建議采用分庫分表策略:
-- 按用戶ID范圍分表
CREATE TABLE mqtt_user_0 LIKE mqtt_user;
CREATE TABLE mqtt_user_1 LIKE mqtt_user;
# 連接池大小(建議為CPU核心數的2-3倍)
auth.mysql.pool = 16
# 連接超時(毫秒)
auth.mysql.query_timeout = 5000
Q1: 認證失敗但密碼正確 - 檢查密碼加密方式是否匹配 - 驗證SQL查詢語句是否正確返回結果
Q2: ACL規則不生效 - 檢查ACL查詢SQL是否包含所有條件(%a, %u, %c) - 驗證規則順序(EMQ X按allow→deny順序匹配)
Q3: 性能瓶頸 - 檢查MySQL慢查詢日志 - 考慮增加連接池大小 - 評估是否需要讀寫分離
本文詳細介紹了基于MySQL實現EMQ X認證與ACL的完整方案,主要內容包括: 1. 數據庫表結構設計與示例數據 2. EMQ X認證插件的詳細配置 3. ACL訪問控制的實現方法 4. 功能驗證與性能優化建議
通過MySQL集成,企業可以充分利用現有用戶管理系統,構建安全可靠的MQTT消息服務。實際部署時,建議根據業務規模選擇合適的數據庫架構,并定期進行安全審計。
注:本文基于EMQ X 4.3版本編寫,不同版本配置可能略有差異,請以官方文檔為準。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。