EMQX部署的一些问题:

1、centos 安装mqtt

安装所需要的依赖包

$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2

使用以下命令设置稳定存储库,以 CentOS7 为例

$ sudo yum-config-manager --add-repo https://repos.emqx.io/emqx-ce/redhat/centos/7/emqx-ce.repo

安装最新版本的 EMQ X

$ sudo yum install emqx

 

 

 

2、dashboard登录后提示URL not Found

原因是http默认端口8080被占用,

查看端口占用进程

netstat -tnlp | grep :8080

 

一种方式:找到占用改端口的程序,使用kill -9 进程号 杀掉该进程

另外一种方式:修改emqx http为其他端口:

找到插件plugin中的emqx_management.conf。

修改

management.listener.http = 8090 这一行

保存,然后重启

 

3、emqx_ctl linsteners 提示命令不存在

列出的emqx_ctl使用方法列表明显表较少

正常的大概有77个命令。

EMQX部署的一些问题:_第1张图片

此时很可能是8080端口占用,跟第二个问题解决方法一样,最好给emqx_management换一个端口

 

4、使用emqx_auth_mysql插件进行用户名和访问权限控制:

(1)首先安装数据库,建议使用docker安装mariadb。

(2)设置数据库的用户名和密码。

(3)启动数据库。

(4)创建mqtt数据库

(5)创建用户表和ACL表

CREATE TABLE `mqtt_user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(100) DEFAULT NULL, `password` varchar(100) DEFAULT NULL, `salt` varchar(35) 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;

 

配置etc/plugins/emqx_auth_mysql.conf

将数据库的用户名、密码填入

其他配置信息参考官方说明文档

https://docs.emqx.io/edge/v3/cn/plugins.html#emqx-auth-http-http

其中在配置密码规则时要注意的一点:

auth.mysql.password_hash = sha256

官方配置默认是sha256加密,那么在数据库中的password字段不能用明文

上面的方式是不行的

要将密码通过sha256加密后将加密串写入数据库才行

另外要注意的是数据库字段salt是密码加盐后再进行加密。说白了就是密码加上一段一段字符串(上图中是crodigy),然后经过加密算法计算的密文。这样更安全

如果要采用密码加盐的方式则配置文件字段修改如下

auth.mysql.password_hash = salt,sha256

意思是 字符串+密码后经过sha256计算后的密文填入数据库

示例:

EMQX部署的一些问题:_第2张图片

python代码实现sha256+盐算法代码如下:其中string是密码,crodigy是盐字符串

最终将输出的res字段放入数据库的password中

import hashlib

# ######## sha256 ########

string = "test"

sha256 = hashlib.sha256(b'crodigy')

sha256.update(string.encode('utf-8'))

res = sha256.hexdigest()

print("sha256加密结果:",res)

 

ACL批量校验:

在实际项目中一般要限制用户订阅的主题和发布的主题。比如采用 /username/set 来订阅主题

/username/get 来发布主题。 如果连接的客户端比较多,那么简历的ACL规则也比较多

比如连接十万个客户端,那么就要有至少20万个(发布+订阅)主题,数据库中就要写20万个ACL规则,这样规则匹配也非常耗时。

可以使用通配符替换的形式来解决问题.

先上解决方案:

在数据库配置文件emqx_auth_mysql.conf中修改如下字段:

auth.mysql.acl_query = select allow, ipaddr, username, clientid, access, REPLACE(topic,'$devTopic','%u') from mqtt_acl where ipaddr = '%a' or username = '%u' or username = '$all' or clientid = '%c' order by id desc

数据库语句主要修改了1、REPLACE(topic,'$devTopic','%u')和2、order by id desc

第一条的作用是将主题中的通配符$devTopic替换成当前需要匹配的用户名。

第二条是将查询出来的规则以id降序排列,进行验证。因为ACL规则是按照规则顺序进行一一校验,所以顺序不同校验结果可能不同。

数据库填写如下内容

EMQX部署的一些问题:_第3张图片

这样就可以实现用户test1只能订阅/test1/get主题,只能发布/test1/set主题。

制定这样规则的好处在于每个用户只能订阅和发布自己的主题,不能订阅发布别人的主题。

另外数据库中的用户名和ACL规则添加后,emqx是动态加载,不需要重启emqx就能实现校验。这个可能是比较新的版本修改过。之前看到git上有人提问类似的问题:说添加了ACL规则后要重启emqx才能生效。目前我测试的3.2.7版本不需要重启就能生效。

你可能感兴趣的:(python)