原文链接:Emqtt – 05 – Mysql插件认证及访问控制


相关文章:

  • Emqtt – 01 – 服务搭建

  • Emqtt – 02 – 搭建本地项目

  • Emqtt – 03 – 用户密码认证

  • Emqtt – 04 – Clientid认证

  • Emqtt – 05 – Mysql插件认证及访问控制

  • Emqtt – 06 – Redis插件认证及访问控制

  • Emqtt – 07 – HTTP插件认证及访问控制


了解了 Clientid 认证后,现在我们再来了解下 Mysql 插件认证以及访问控制,默认关闭了匿名认证


一、创建用户表和控制表

  • 根据官方文档,用户表的名称为:mqtt_user,访问控制表的名称为:mqtt_acl

    • mqtt_user

      CREATE TABLE mqtt_user (id int(11) unsigned NOT NULL AUTO_INCREMENT,username varchar(8) DEFAULT NULL COMMENT 'mqtt用户名',password varchar(12) DEFAULT NULL COMMENT 'mqtt密码',salt varchar(20) DEFAULT NULL COMMENT '加盐随机变量',is_superuser tinyint(1) DEFAULT 0 COMMENT '是否为超级用户: 0=否1=是',create_time datetime DEFAULT NULL COMMENT '创建时间',modify_time datetime DEFAULT NULL COMMENT '修改时间',PRIMARY KEY (id),UNIQUE KEY uk_username (username)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='mqtt用户表';
      
    • mqtt_acl

      CREATE TABLE mqtt_acl (id int(11) unsigned NOT NULL AUTO_INCREMENT,allow int(1) DEFAULT NULL COMMENT '是否允许连接: 0=拒绝1=允许',ipaddr varchar(60) DEFAULT NULL COMMENT 'mqtt客户端IP地址',username varchar(8) NOT NULL COMMENT 'mqtt用户名',clientid varchar(100) DEFAULT NULL COMMENT 'clientId',access int(2) NOT NULL COMMENT '行为类型: 1=订阅2=发布3=订阅+发布',topic varchar(100) NOT NULL DEFAULT '' COMMENT '主题',create_time datetime DEFAULT NULL COMMENT '创建时间',modify_time datetime DEFAULT NULL COMMENT '修改时间',PRIMARY KEY (id)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='mqtt权限控制表';
      

二、配置 mysql 认证

  • 在 etc/plugins 目录下修改 emq_auth_mysql.conf 配置文件

    • cd /usr/local/emqtt/emqttd/etc/plugins

    • vim emq_auth_mysql.conf

      ## 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 = root## MySQL password.
      ##
      ## Value: String
      auth.mysql.password = root## MySQL database.
      ##
      ## Value: String
      auth.mysql.database = mqtt
      
    • :wq

  • 开启 mysql 认证插件

    • 第一种方式:emqttd_ctl plugins load emq_auth_mysql

    • 第二种方式:在 web 管理控制台中开启该插件

  • 重启服务,使插件生效


三、测试

  • emqtt 的 mysql 插件默认开启 sha256 加密,其他加密方式如下图,其中 plain 表示明文不加密

  • 此时我在数据库中配置了

    • username:admin

    • password:8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 (123456)

  • 在项目中配置了

    • username:admin

    • password:123456

    • clientid: mqtt-client

    • topic: MQTT

  • 此时我们再启动项目时,只有正确地配置了用户名和密码之后,才可以连接成功,否则会报异常

    • 当项目启动连接到 emqtt 服务时,emqtt 服务会自动将项目里配置的明文密码,使用 sha256 进行加密,然后与数据库中存储的密文进行比较,如果相等则连接成功,如果不相等则连接失败

四、对密码进行加盐加密

  • 所谓加盐,就是对明文密码前面或后面加上一个随机字符串,然后再对整个字符串进行加密,增强了密码的安全性

    • cd /usr/local/emqtt/emqttd/etc/plugins

    • vim emq_auth_mysql.conf

      ## 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
      ##
      auth.mysql.auth_query = select password, salt 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.
      ##
      ## Value: plain | md5 | sha | sha256 | bcrypt
      ## auth.mysql.password_hash = sha256## sha256 with salt prefix
      auth.mysql.password_hash = salt,sha256
      
      • 此处在 auth.mysql.auth_query 查询语句中,需要将 salt 也一并查出,并将加密方式 auth.mysql.password_hash 改为 salt,sha256 (例如:明文密码是 123456,salt 是 admin,则将 admin123456 使用 sha256 进行加密后,把得到的密文存储到数据库中)

        • salt,sha256:表示 salt 在前,明文密码在后,拼接成字符串后使用 sha256 进行加密

        • sha256,salt:表示明文密码在前,salt 在后,拼接成字符串后使用 sha256 进行加密

        • salt,sha256,salt:像这样明文密码前后都加 salt,我试了好多次,emqtt 并不支持

    • :wq

  • 重启服务,使配置生效


五、测试

  • 此时我在数据库中配置了

    • username:admin

    • password:ac0e7d037817094e9e0b4441f9bae3209d67b02fa484917065f71b16109a1a78 (admin123456)

    • salt:admin

  • 在项目中配置了

    • username:admin

    • password:123456

    • clientid: mqtt-client

    • topic: MQTT

  • 此时我们再启动项目时,只有正确地配置了用户名和密码之后,才可以连接成功,否则会报异常


六、配置 mysql 权限控制

  • 此外,我们可以对连接到 emqtt 的客户端进行进一步的控制 (权限控制),在这之前,我们还需要关闭默认鉴权行为

    • cd /usr/local/emqtt/emqttd/etc

    • vim emq.conf

    • 找到 mqtt.acl_nomatch,将值改为 deny,保存并退出

      ## Default behaviour when ACL nomatch.
      ##
      ## Value: allow | deny
      mqtt.acl_nomatch = deny
      
    • cd /usr/local/emqtt/emqttd/etc/plugins

    • vim emq_auth_mysql.conf

      ## ACL query.
      ##
      ## Value: SQL
      ##
      ## Variables:
      ##  - %a: ipaddr
      ##  - %u: username
      ##  - %c: clientid
      auth.mysql.acl_query = select allow, ipaddr, username, clientid, access, topic from mqtt_acl where username = '%u'
      
      • 此处根据自身的权限控制需求,修改 auth.mysql.acl_query 鉴权查询语句

        • username = ‘%u’:表示当前连接到emqtt服务的用户名

        • username = ‘$all’:表示所有连接到emqtt服务的用户名

    • :wq

  • 重启服务,使配置生效


七、测试

  • 此时我在数据库中配置了

    • allow:1

    • ipaddr: 本地客户端IP地址

    • username:admin

    • clientid: mqtt-client

    • access: 1

    • topic: MQTT/#

  • 在项目中配置了

    • username:admin

    • password:123456

    • clientid: mqtt-client

    • topic: MQTT

  • 此时我们再启动项目时,只有正确地配置了用户名、密码、clientid、topic 之后 (根据鉴权查询语句来灵活配置),才可以连接成功,否则会报异常


八、启动超级用户

  • emqtt 的 mysql 插件还可以配置超级用户,超级用户可以跳过所有的访问控制,直接连接到 emqtt 服务

  • 在数据库中直接将 is_superuser 字段设置为 1 即可

    • 此时我在数据库中配置了

      • allow:1

      • ipaddr: 本地客户端IP地址

      • username:admin

      • clientid: mqtt-client

      • access: 1

      • topic: MQTT/#

      • is_superuser: 1

    • 在项目中配置了

      • username:admin

      • password:123456

      • clientid: mqtt-client

      • topic: MQTT

    • 此时我们再启动项目时,只要正确地配置了用户名和密码之后,就可以连接成功

    • 例如:访问控制设置只能订阅 (access = 1),而本地服务器调用了发布 (access = 2) 的方法,因此理论上是发布不了的,而 admin 用户已经被设为了超级用户,所以就可以发布消息

Emqtt -- 05 -- Mysql插件认证及访问控制相关推荐

  1. emqtt mysql认证_Emqtt -- 05 -- Mysql插件认证及访问控制

    了解了 Clientid 认证后,现在我们再来了解下 Mysql 插件认证以及访问控制,默认关闭了匿名认证 一.创建用户表和控制表 根据官方文档,用户表的名称为:mqtt_user,访问控制表的名称为 ...

  2. Emqtt -- 03 -- 用户密码认证

    原文链接:Emqtt – 03 – 用户密码认证 相关文章: Emqtt – 01 – 服务搭建 Emqtt – 02 – 搭建本地项目 Emqtt – 03 – 用户密码认证 Emqtt – 04 ...

  3. emq+mysql设置_EMQ--添加mysql认证及mysql插件访问控制

    EMQ-百万级分布式开源物联网MQTT消息服务器. MQTT 认证设置 EMQ 消息服务器认证由一系列认证插件(Plugin)提供,系统支持按用户名密码.ClientID 或匿名认证. 系统默认开启匿 ...

  4. emq插件开发mysql_EMQ的Mysql插件

    EMQ最新版的是EMQX3.x.x版本,一如既往的支持Mysql认证,这里专门对Mysql认证插件做个研究,写点总结.本人能力有限,文章不足之处希望及时反馈以免误导. 首先我先描述一下我的应用场景:我 ...

  5. arm qt mysql插件_Ubuntu下编译ARM平台Qt的MySQL插件

    最近需要将一个程序移植到arm平台上,程序调用了MySQL数据库,所以就牵扯到将MySQL数据库移植到ARM平台上面,所以在网上大量查阅资料.在baidu文库发现了一篇文档,是wlzxlc上传的文档名 ...

  6. saslauthd mysql_open***使用MySQL进行认证

    紧接上一篇,Open×××使用用户名密码登录之后,觉得可能本地文件的安全性不是很好,毕竟密码还是明文显示的嘛,所以这次鼓捣Open×××使用MySQL进行认证.部署环境什么的,依然参考上一篇中的配置, ...

  7. 时代亿信 认证墙-UAP统一认证与访问控制产品

    1.1  产品简介 UAP统一认证与访问控制产品 (以下简称UAP产品)集数字证书.动态口令.指纹.短信等强身份认证方式于一身, 是一个针对B/S.C/S架构应用系统的强身份认证及资源整合解决方案,对 ...

  8. 【2021-07-31 更新】【梳理】简明操作系统原理 第十九章 身份认证和访问控制(docx)

    配套教材: Operating Systems: Three Easy Pieces Remzi H. Arpaci-Dusseau Andrea C. Arpaci-Dusseau Peter Re ...

  9. MySQL插件(一)介绍

    插件 简介 插件类型 加载和卸载插件 简介 在第一节中提到,MySQL 是支持动态可插拔的储存引擎体系架构. 而储存引擎其实也是一种插件类型,所以在继续储存引擎的后续介绍之前,有必要先来了解一下MyS ...

最新文章

  1. 尽快卸载这两款恶意浏览器插件!已有近 50 万用户安装
  2. 实验室启动postgresql 8.4备忘
  3. maven工程拆分与聚合的思想
  4. 【小题目】判断一个数字是否是3的倍数
  5. tlwr886n发挥最大网速_路由器中的2.4G和5G有什么区别?用错了网速变“龟速”
  6. eks volumn s3_和平精英:SMG战队无缘总决赛,S3前提退场原因一览
  7. 在O(1)的时间内删除链表节点
  8. Raki的读paper小记:Soft Gazetteers for Low-Resource Named Entity Recognition
  9. notebook打开外部文件_NOTEBOOK文件扩展名 - 什么是.notebook以及如何打开? - ReviverSoft...
  10. 单元刚度矩阵 C++
  11. 嵌入式linux应用开发之常用shell脚本总结
  12. 算术编码 matlab程序,算术编码算法的matlab实现
  13. CMD 命令 复制多级子目录特定文件
  14. ROS | 服务通信的编程实现
  15. 还在为 520 发愁吗?教你用 Python 写个表白神器
  16. 量子态层析(quantum state tomography)
  17. Navicata查看已经创建MySql的触发器
  18. Unity 之 UGUI代码生成UI设置为相对位置问题
  19. Hadoop启动错误:WARNING log4j.properties is not found. HADOOP_CONF_DIR may be incomplete
  20. 【技术分享】什么是K折交叉验证?

热门文章

  1. LeetCode练习18:整数除法
  2. 直播预告:AAAI 2021专场二| AI TIME PhD
  3. PHP类计算机专业毕业设计题目选题课题
  4. 名词性从句 - 主语从句
  5. foxmail设置过滤器分组管理邮件
  6. EventBus多次接收踩坑
  7. MATLAB曲线拟合工具箱
  8. 谈windows开发学习过程
  9. 3.2 - E 学生查询
  10. HTML css——浏览器兼容性