概述
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 需要满足以下条件:
- 查询结果中必须包含 password 字段,EMQ X 使用该字段与客户端密码比对
- 如果启用了加盐配置,查询结果中必须包含 salt 字段,EMQ X 使用该字段作为 salt(盐)值
- 查询结果只能有一条,多条结果时只取第一条作为有效数据
提示
可以在 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 认证 / 访问控制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复