emqx开启mysql插件进行动态认证鉴权

                                        emqx开启mysql插件

一、简述

  1. 采用emqx搭建mqtt服务器,基于主题(topic)的发布订阅模式。在线上项目中使用,肯定要进行动态的认证和topic权限鉴权,动态管理连接emqx的用户名和密码,以及用户对应的主题权限,本文采用外接mysql形式进行用户管理。

二、开启插件前准备好数据库

  1. 在mysql中创建好插件所需要的的表用户表和acl权限表(默认用户表为‘mqtt_user’,acl权限表为‘mqtt_acl’)
    1. 建表语句如下:
      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=InnoDB DEFAULT CHARSET=utf8mb4;
      
      
      CREATE TABLE `mqtt_acl` (
        `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
        `allow` int(1) DEFAULT 1 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=utf8mb4;
  2. 表字段说明   
  • allow:禁止(0),允许(1)
  • ipaddr:设置 IP 地址
  • username:连接客户端的用户名,此处的值如果设置为 $all 表示该规则适用于所有的用户
  • clientid:连接客户端的 Client ID
  • access:允许的操作:订阅(1),发布(2),订阅发布都可以(3)
  • topic:控制的主题,可以使用通配符,并且可以在主题中加入占位符来匹配客户端信息,例如 t/%c则在匹配时主题将会替换为当前客户端的 Client ID
    • %u:用户名
    • %c:Client ID

三、mysql插件修改

1、首先把emqx安装目录下的etc/emqx.conf中配置修改:

## 将匿名访问禁止掉,默认是开启的,无需用户名和密码即可连接emqx。
allow_anonymous = false

## 如果没有匹配的ACL规则,则拒绝;默认是允许的。
acl_nomatch = deny

2、修改mysql插件配置里面的信息(位于emqx的etc/plugins/emqx_auth_mysql.conf):

第一步:修改mysql连接信息,

# etc/plugins/emqx_auth_mysql.conf

## mysql所在服务器地址和ip端口号
auth.mysql.server = 127.0.0.1:3306

## 连接池大小
auth.mysql.pool = 8

## 连接mysql数据库的用户名
auth.mysql.username = emqx

## 连接mysql数据库的密码
auth.mysql.password = public

## mqtt_user和mqtt_acl这两张表所属的数据库
auth.mysql.database = mqtt

auth.mysql.query_timeout = 5s

第二步:设置密码加密方式和认证sql查询语句

##    根据用户名查询用户密码的sql。
auth.mysql.auth_query = select password from mqtt_user where username = '%u' limit 1


##    plain使用明文连接,不加密,即连接emqx的密码和数据库中的密码一致
auth.mysql.password_hash = plain

可以在认证 SQL 中使用以下占位符,执行时 EMQ X 将自动填充为客户端信息:

  • %u:用户名
  • %c:Client ID
  • %C:TLS 证书公用名(证书的域名或子域名),仅当 TLS 连接时有效
  • %d:TLS 证书 subject,仅当 TLS 连接时有效

也可以根据自己的业务需要调整认证sql,如添加多个查询条件、使用数据库预处理函数,以实现更多业务相关的功能。

注: 查询结果只能有一条,多条结果时只取第一条作为有效数据。

如果启用了加盐配置,查询结果中必须包含 salt 字段,EMQ X 使用该字段作为 salt(盐)值。

查询结果必须包含password,若表中密码字段为pwd则此处查询的password使用as语法;例如pwd as password。

若不想使用mqtt_user这个表名,则需要这个地方查询语句中的表名和数据库中表名保持一致即可。

第三步:acl鉴权查询语句开启(默认是开启状态,则无需改动)

 超级用户SQL(super_query)

进行 ACL 鉴权时,EMQ X 将使用当前客户端信息填充并执行用户配置的超级用户 SQL,查询客户端是否为超级用户。客户端为超级用户时将跳过 ACL SQL。

  1. 查询结果中必须包含 is_superuser 字段,is_superuser 应该显式的为 true
  2. 查询结果只能有一条,多条结果时只取第一条作为有效数据

注:如果不需要超级用户功能,注释并禁用该选项能有效提高效率。

ACL SQL(acl_query)

进行 ACL 鉴权时,EMQ X 将使用当前客户端信息填充并执行用户配置的超级用户 SQL,如果没有启用超级用户 SQL 或客户端不是超级用户,则使用 ACL SQL 查询出该客户端在数据库中的 ACL 规则。

  1. 查询结果中必须包含 allow、access、topic、clientid、username、ipaddr 字段,如果字段不想参与比对则使用 $all 字符串或者数据库 NULL 值
  2. 查询结果可以有多条,多条结果时按照从上到下的顺序进行匹配

注:可以在 SQL 中调整查询条件、指定排序方式实现更高效率的查询。

以上操作均在Linux环境下,Windows环境下可能会存在异常(PS:本人遇到过)                                                 

### 如何为 EMQX Broker 安装 MySQL 插件 为了使 EMQX 支持与 MySQL 数据库交互的功能,通常会通过安装相应的插件来实现。以下是具体的操作指南: #### 准备工作 确保已经成功部署并运行了 EMQX Broker 的环境。 #### 下载和配置 MySQL 插件 访问官方文档或 GitHub 仓库获取最新版本的 `emqx-auth-mysql` 插件源码或者预编译包[^1]。如果采用二进制文件的方式,则可以直接下载适用于当前系统的 tarball 或者 deb/rpm 包形式;如果是从源代码构建的话,则需按照项目 Readme 中给出的方法执行编译命令。 对于大多数 Linux 发行版而言,可以使用如下方式快速完成安装过程: ```bash # 添加 emqx apt 源 (仅当需要时) sudo wget https://repos.emqx.io/emqx-deb-pkg.key -O- | sudo gpg --dearmor -o /usr/share/keyrings/emqx-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/emqx-archive-keyring.gpg] https://repos.emqx.io/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/emqx.list sudo apt update # 安装 emqxmysql 认证插件 sudo apt install emqx emqx-auth-mysql ``` #### 配置连接参数 编辑 `/etc/emqx/emqx.conf` 文件中的 `[mysql]` 节点下的各项属性以适配本地数据库实例的信息,例如主机地址、端口、用户名以及密码等字段: ```ini ## MySQL server address, default is localhost:3306 auth.mysql.server = "tcp(localhost:3306)" ## Database name used by EMQ X auth.mysql.database = "mqtt" ## Username and password for accessing the database auth.mysql.username = "root" auth.mysql.password = "" ... ``` #### 启动服务并验证功能正常运作 重启 EMQX 使得新的配置生效,并利用客户端工具测试能否顺利登录到代理服务器上。 ```bash sudo systemctl restart emqx.service ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Qubb

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值