我是靠谱客的博主 幸福仙人掌,最近开发中收集的这篇文章主要介绍emqx启用MySQL 认证 / 访问控制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

MySQL 认证 / 访问控制即插件emqx_auth_mysql

在emqx运行中加载插件(其他插件修改插件名称即可)

./bin/emqx_ctl plugins load emqx_auth_mysql

需要关闭emqx的匿名访问设置:

# etc/emqx.conf

## Value: true | false
allow_anonymous = true

警告

生产环境中请禁用匿名认证。

需要在 etc/plugins/emqx_auth_mysql.conf 中配置以下内容:

## 服务器地址
auth.mysql.server = 127.0.0.1:3306

## 连接池大小
auth.mysql.pool = 8
##数据库连接用户名
auth.mysql.username = emqx
##数据库连接密码
auth.mysql.password = public
##数据连接的库名,database
auth.mysql.database = mqtt

auth.mysql.query_timeout = 5s

默认表结构

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(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;

默认配置下示例数据如下:(密码是sha256加密,可自己修改为MD5加密)

INSERT INTO `mqtt_user` ( `username`, `password`, `salt`)
VALUES
	('emqx', 'efa1f375d76194fa51a3556a97e641e61685f914d446979da50a551a4333ffd7', NULL);

ACL Table

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功能,可忽略该表(可通过注释禁用,在同一个配置文件中)

## MySQL server address.
##
## Value: Port | IP:Port
##
## Examples: 3306, 127.0.0.1:3306, localhost:3306
auth.mysql.server = 127.0.0.1:3306

## MySQL pool size.
##
## Value: Number
auth.mysql.pool = 8

## MySQL username.
##
## Value: String
 auth.mysql.username =

## MySQL Password.
##
## Value: String
 auth.mysql.password =

## MySQL database.
##
## Value: String
auth.mysql.database = mqtt

## Variables: %u = username, %c = clientid

## Authentication query.
##
## Note that column names should be 'password' and 'salt' (if used).
## In case column names differ in your DB - please use aliases,
## e.g. "my_column_name as password".
##
## Value: SQL
##
## Variables:
##  - %u: username
##  - %c: clientid
##  - %C: common name of client TLS cert
##  - %d: subject of client TLS cert
##
## 查询mqtt连接时的用户与密码的sql 可修改该语句,只要是通过用户名查询出密码即可 limit 1
auth.mysql.auth_query = select password from mqtt_user where username = '%u' limit 1
## auth.mysql.auth_query = select password_hash as password from mqtt_user where username = '%u' limit 1

## Password hash.
##
##密码最终在sql表中的表现形式,默认是sha256,可修改成MD5加密
## Value: plain | md5 | sha | sha256 | bcrypt
auth.mysql.password_hash = sha256

## sha256 with salt prefix
## auth.mysql.password_hash = salt,sha256

## bcrypt with salt only prefix
## auth.mysql.password_hash = salt,bcrypt

## sha256 with salt suffix
## auth.mysql.password_hash = sha256,salt

## pbkdf2 with macfun iterations dklen
## macfun: md4, md5, ripemd160, sha, sha224, sha256, sha384, sha512
## auth.mysql.password_hash = pbkdf2,sha256,1000,20

## Superuser query.
##
## Value: SQL
##
## Variables:
##  - %u: username
##  - %c: clientid
##  - %C: common name of client TLS cert
##  - %d: subject of client TLS cert

auth.mysql.super_query = select is_superuser from mqtt_user where username = '%u' limit 1

## ACL query.
##
## Value: SQL
##
## Variables:
##  - %a: ipaddr
##  - %u: username
##  - %c: clientid
## Note: You can add the 'ORDER BY' statement to control the rules match order
auth.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'

官方:

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

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

你可以根据业务需要调整认证 SQL,如添加多个查询条件、使用数据库预处理函数,以实现更多业务相关的功能。但是任何情况下认证 SQL 需要满足以下条件:

  1. 查询结果中必须包含 password 字段,EMQ X 使用该字段与客户端密码比对
  2. 如果启用了加盐配置,查询结果中必须包含 salt 字段,EMQ X 使用该字段作为 salt(盐)值
  3. 查询结果只能有一条,多条结果时只取第一条作为有效数据

提示

可以在 SQL 中使用 AS 语法为字段重命名指定 password,或者将 salt 值设为固定值。

进阶

默认表结构中,我们将 username 字段设为了唯一索引(UNIQUE),与默认的查询语句(select password from mqtt_user where username = '%u' limit 1)配合使用可以获得非常不错的查询性能。

如果默认查询条件不能满足您的需要,例如你需要根据 Client ID 查询相应的 Password Hash 和 Salt,请确保将 Client ID 设置为索引;又或者您想要对 Username、Client ID 或者其他更多字段进行多条件查询,建议设置正确的单列索引或是联合索引。总之,设置正确的表结构和查询语句,尽可能不要让索引失效而影响查询性能。

特殊说明

MySQL 8.0 及以后版本使用了 caching_sha2_password 作为默认身份验证插件,受限于客户端驱动你必须将其更改为 mysql_native_password 插件:

ALTER USER 'your_username'@'your_host' IDENTIFIED WITH mysql_native_password BY 'your_password';

最后

以上就是幸福仙人掌为你收集整理的emqx启用MySQL 认证 / 访问控制的全部内容,希望文章能够帮你解决emqx启用MySQL 认证 / 访问控制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部