EMQ百万级MQTT消息服务(ACL鉴权)

2024-05-28 01:32

本文主要是介绍EMQ百万级MQTT消息服务(ACL鉴权),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011142688/article/details/79852306

虽然EMQ已经搭建起来了,但是投入到业务使用中还面临着一些问题,当然MQTT设计之初也考虑了这一点,比如不是任何一个客户端都能链接到服务器和限制客户端能够对topic操作的权限

附上:

喵了个咪的博客:w-blog.cn
EMQ官方地址:http://emqtt.com/
EMQ中文文档:http://emqtt.com/docs/v2/guide.html

1.ACL鉴权

先说实际场景,我们需要监听每一台设备的链接和断开事件等EMQ的系统行为,这样的事件当然不是任何一个连接到服务器的终端,这样的限制就是ACL鉴权,官方也提供了默认的鉴权,在 /usr/local/emqttd/etc/acl.conf 下,默认值允许127.0.0.1的IP地址链接监听系统主题

%% 允许'dashboard'用户订阅 '$SYS/#'
{allow, {user, "dashboard"}, subscribe, ["$SYS/#"]}.
%% 允许本机用户发布订阅全部主题
{allow, {ipaddr, "127.0.0.1"}, pubsub, ["$SYS/#", "#"]}.
%% 拒绝用户订阅'$SYS#''#'主题
{deny, all, subscribe, ["$SYS/#", {eq, "#"}]}.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

规则如下:

允许|拒绝  用户|IP地址|ClientID  发布|订阅  主题列表## 访问控制规则采用 Erlang 元组格式,访问控制模块逐条匹配规则:---------              ---------              ---------
Client -> | Rule1 | --nomatch--> | Rule2 | --nomatch--> | Rule3 | --> Default---------              ---------              ---------|                      |                      |match                  match                  match\|/                    \|/                    \|/allow | deny           allow | deny           allow | deny
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这个时候如果在外网链接EMQ定于如下主题,当客户端链接的时候是无法获取消息的

$SYS/brokers/+/clients/+/connected
$SYS/brokers/+/clients/+/disconnected
  • 1
  • 2

但是只需要修改acl配置文件如下然后重启节点:(所有节点都需要修改)

> vim /usr/local/emqttd/etc/acl.conf
## 修改
# {allow, {ipaddr, "127.0.0.1"}, pubsub, ["$SYS/#", "#"]}.
{allow, {ipaddr, 你的外网IP}, pubsub, ["$SYS/#", "#"]}.
  • 1
  • 2
  • 3
  • 4

重新监听当客户端链接的时候就可以获得如下信息

{"clientid":"V10115125355235","username":"cline","ipaddress":"116.192.34.23","clean_sess":true,"protocol":4,"connack":0,"ts":1521689797}
{"clientid":"V10115125355235","username":"cline","reason":"normal","ts":1521689801}
  • 1
  • 2

2.MYSQL实时配置ACL

一般来说我们不会使用外网IP来进行限制,有限会选择用户来进行限制行为,官方提供如下方式来进行用户和ACL验证的存储:
(对应的配置方式可以参考官网文档)
- 配置文件和命令
- LDAP
- HTTP
- MySQL
- Postgre
- Redis
- MongoDB

笔者这里采用大家经常用到的MYSQL作为鉴权的数据来源,首先先关闭匿名认证(默认是开启的谁都能够登录)

vim /usr/local/emqttd/etc/emq.conf ## Allow Anonymous authentication
mqtt.allow_anonymous = false
  • 1
  • 2
  • 3
  • 4

重启服务器之后不管是谁都会被链接拒绝,我们需要准备好用于检查用户和权限的mysql表:

CREATE TABLE `mqtt_user` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`username` varchar(100) DEFAULT NULL,`password` varchar(100) DEFAULT NULL,`salt` varchar(20) 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;CREATE TABLE `mqtt_acl` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`allow` int(1) DEFAULT NULL COMMENT '0: deny, 1: allow',`ipaddr` varchar(60) DEFAULT NULL COMMENT 'IpAddress',`username` varchar(100) DEFAULT NULL COMMENT 'Username',`clientid` varchar(100) DEFAULT NULL COMMENT 'ClientId',`access` int(2) NOT NULL COMMENT '1: subscribe, 2: publish, 3: pubsub',`topic` varchar(100) NOT NULL DEFAULT '' COMMENT 'Topic Filter',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 建立ACL默认访问控制
INSERT INTO `mqtt_acl` (`id`, `allow`, `ipaddr`, `username`, `clientid`, `access`, `topic`)
VALUES(1,1,NULL,'$all',NULL,2,'#'),(2,0,NULL,'$all',NULL,1,'$SYS/#'),(3,0,NULL,'$all',NULL,1,'eq #'),(5,1,'127.0.0.1',NULL,NULL,2,'$SYS/#'),(6,1,'127.0.0.1',NULL,NULL,2,'#'),(7,1,NULL,'dashboard',NULL,1,'$SYS/#');
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

修改mysql配置文件

> vim /usr/local/emqttd/etc/plugins/emq_auth_mysql.confauth.mysql.server = xxxxxxxxx:3306
auth.mysql.username = root
auth.mysql.password = xxxxxxxx
auth.mysql.database = emq
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

建立用户

# 用户名 server 密码 server 密码默认是sha256
insert `mqtt_user`(`username`,`password`) values('server','b3eacd33433b31b5252351032c9b3e7a2e7aa7738d5decdf0dd6c62680853c06');
# 用户名 cline 密码 cline
insert `mqtt_user`(`username`,`password`) values('cline','84829dbd815311888f0e3d85822e9b07d14be89a480a3c09ee67353f0e806e3b');
  • 1
  • 2
  • 3
  • 4

可以配置超级管理员(超级管理员会无视ACL规则对所有的topic都有订阅和推送的权限)

update `mqtt_user` set `is_superuser`=1 where `id`=1;
  • 1

注意:可以注释掉acl.conf的默认规则(也可以结合使用)
注意:emq任何配置文件的变动都需要重启服务(可以在UI上直接修改配置不需要重启)
注意:如果是在集群下集群中每一个节点都需要执行命令

> emqttd stop
ok
> emqttd start
emqttd 2.3.5 is started successfully!
## 打开mysql鉴权
> emqttd_ctl plugins load emq_auth_mysql
Start apps: [emq_auth_mysql]
Plugin emq_auth_mysql loaded successfully.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在插件中就可以看到对应的mysql鉴权插件已经打开了

3 总结

这个时候在链接的时候配置用户名和密码就可以顺利链接上了,并且ACL的配置可以动态的变更谁能做什么事情,在不同的业务需求场景下这样的功能可以让程序做到更加安全又利于编程

注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!

这篇关于EMQ百万级MQTT消息服务(ACL鉴权)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1009164

相关文章

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

MQTT SpringBoot整合实战教程

《MQTTSpringBoot整合实战教程》:本文主要介绍MQTTSpringBoot整合实战教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录MQTT-SpringBoot创建简单 SpringBoot 项目导入必须依赖增加MQTT相关配置编写

SpringCloud整合MQ实现消息总线服务方式

《SpringCloud整合MQ实现消息总线服务方式》:本文主要介绍SpringCloud整合MQ实现消息总线服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、背景介绍二、方案实践三、升级版总结一、背景介绍每当修改配置文件内容,如果需要客户端也同步更新,

linux服务之NIS账户管理服务方式

《linux服务之NIS账户管理服务方式》:本文主要介绍linux服务之NIS账户管理服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、所需要的软件二、服务器配置1、安装 NIS 服务2、设定 NIS 的域名 (NIS domain name)3、修改主