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

发布时间:2021-12-08 09:16:38 作者:iii
来源:亿速云 阅读:273
# 基于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版本编写,不同版本配置可能略有差异,请以官方文档为准。 “`

推荐阅读:
  1. nodejs acl的用户权限管理详解
  2. 如何解析squid的配置

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql

上一篇:mysql的隔离级别是什么

下一篇:如何解决Golang协程无法固定goroutine的最大数目问题

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》