阿里云Centos7搭建属于自己的物联网平台(二)EMQX MQTT Broker的认证插件

阿里云Centos7搭建属于自己的物联网平台(一)EMQX MQTT Broker的认证插件

  • 我的开发环境
    • 关于防火墙
  • 介绍
  • 用户名、密码认证插件
    • 修改emqx_auth_username的插件的配置文件
    • 加载emqx_auth_username插件
    • 用户管理
      • 修改配置文件
      • 命令行方式
    • 连接验证
  • MongoDB 认证/访问控制
    • 安装MongoDB数据库
    • 修改emqx_auth_mongo的插件的配置文件
    • 加载emqx_auth_mongo插件
    • 用户管理
      • 命令行操作
      • 图像化操作
    • 连接验证
  • MySql 认证/访问控制
    • 安装mysql数据库
    • 修改emqx_auth_mysql的插件的配置文件
    • 加载emqx_auth_mysql插件
    • 用户管理
      • 命令行操作
      • 图像化操作
    • 连接验证
  • 备注

我的开发环境

	操作系统:centos7

关于防火墙

阿里云服务器有安全策略,需要将用到的端口放行
阿里云安全组
安装完宝塔面板之后也会有一个防火墙管理,需要将对应的端口放行
宝塔面板安全组

介绍

上一篇介绍了EMQX MQTT Broker的安装与测试,在关闭匿名登陆后就无法登陆了,因此需要使用emqx提供的插件进行认证,本文主要介绍以下几种基于用户密码的认证插件。

emqx_auth_username	用户名、密码认证插件
emqx_auth_mongo		MongoDB 认证/访问控制
emqx_auth_mysql	 	认证/访问控制

用户名、密码认证插件

emqx_auth_username认证插件只支持连接认证,不支持topic的权限控制,因此可以作为超级账户使用。
以下介绍的两种数据库认证方式支持ACL权限管理,可以对topic的权限进行管理。

修改emqx_auth_username的插件的配置文件

vim /etc/emqx/plugins/emqx_auth_username.conf

以下是修改后的配置文件

  1. 取消了 auth.user.1.username = adminauth.user.1.password = public的注释表示添加一个admin的用户,密码为public
  2. 修改auth.user.password_hash = sha256auth.user.password_hash = plain表示不适用加密方式,密码采用明文,为了方便测试。后续根据实际情况选择加密方式。
##--------------------------------------------------------------------
## Username Authentication Plugin
##--------------------------------------------------------------------

## Examples:
auth.user.1.username = admin
auth.user.1.password = public
##auth.user.2.username = [email protected]
##auth.user.2.password = public
##auth.user.3.username = name~!@#$%^&*()_+
##auth.user.3.password = pwsswd~!@#$%^&*()_+

## Password hash.
##
## Value: plain | md5 | sha | sha256
#auth.user.password_hash = sha256
auth.user.password_hash = plain

加载emqx_auth_username插件

可以使用emqx_ctl plugins load xxxxxx来加载插件。
成功会返回Plugin xxxxxx loaded successfully.以下不在赘述。
使用emqx_ctl plugins list查看加载的插件

emqx_ctl plugins load emqx_auth_username

重启emqx

systemctl restart emqx

用户管理

修改配置文件

我们的admin:public就是通过配置文件的方式直接指定的,这样比较灵活但是也比较麻烦,及时每次修改完配置文件都得重启emqx,操作不便。

命令行方式

users list                                      # List users
users add <Username> <Password>                 # Add User
users update <Username> <NewPassword>           # Update User
users del <Username>                            # Delete User

执行emqx_ctl users list查看之前通过配置文件指定的用户名。
执行emqx_ctl users add mqtt mqtt添加一个用户。
执行emqx_ctl users update mqtt 123456修改mqtt用户的密码。

[root@shuaifriend ~]# emqx_ctl users list
admin
[root@shuaifriend ~]# emqx_ctl users add mqtt mqtt
ok
[root@shuaifriend ~]# emqx_ctl users update mqtt 123456
ok
[root@shuaifriend ~]# emqx_ctl users list
admin
mqtt
[root@shuaifriend ~]# emqx_ctl users add root root
ok
[root@shuaifriend ~]# emqx_ctl users list
admin
root
mqtt
[root@shuaifriend ~]# emqx_ctl users del root
ok
[root@shuaifriend ~]# emqx_ctl users list
admin
mqtt
[root@shuaifriend ~]#

连接验证

阿里云Centos7搭建属于自己的物联网平台(二)EMQX MQTT Broker的认证插件_第1张图片

阿里云Centos7搭建属于自己的物联网平台(二)EMQX MQTT Broker的认证插件_第2张图片

MongoDB 认证/访问控制


我们使用数据库作为物联网平台主要的数据存储工具
数据库可以安装MongoDB或者MySql,EMQX官方提供了这两种数据库的密码验证插件支持

安装MongoDB数据库

MongDB 是一个基于分布式文件存储的数据库
添加MongoDB软件源
执行 vim /etc/yum.repos.d/mongodb-org-4.2.repo 添加

[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc

执行 yum install -y mongodb-org 安装
执行 vim /etc/yum.conf 编辑配置添加以下内容禁止升级

exclude=mongodb-org,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools

使用默认目录默认情况下,MongoDB使用mongod用户帐户运行,并使用以下默认目录:

/var/lib/mongo (数据目录)
/var/log/mongodb (日志目录)

本实验使用默认目录启动

systemctl start mongod
systemctl status mongod

修改emqx_auth_mongo的插件的配置文件

vim /etc/emqx/plugins/emqx_auth_mongo.conf
  1. 修改auth.mongo.auth_query.password_hash = sha256auth.mongo.auth_query.password_hash = plain表示不适用加密方式,密码采用明文,为了方便测试。后续根据实际情况选择加密方式。
  2. 修改auth.mongo.super_query = onauth.mongo.super_query = off表示关闭超级用户查询
  3. 修改auth.mongo.acl_query = onauth.mongo.acl_query = off表示关闭Publish 和 Subscribe 的权限查询查询。
  4. 以上配置为了测试方便,后续根据实际情况选择修改。
    以下是配置文件中需要修改的点,其他使用默认即可
auth.mongo.auth_query.password_hash = plain
auth.mongo.super_query = off
auth.mongo.acl_query = off

加载emqx_auth_mongo插件

可以使用emqx_ctl plugins load xxxxxx来加载插件。
成功会返回Plugin xxxxxx loaded successfully.以下不在赘述。
使用emqx_ctl plugins list查看加载的插件

emqx_ctl plugins load emqx_auth_mongo

重启emqx

systemctl restart emqx

用户管理

通过操作数据库的方式管理用户
/etc/emqx/plugins/emqx_auth_mongo.conf这个配置文件中有以下几条配置,我们使用了默认值,以下几条配置是我们操作的基础。

auth.mongo.database = mqtt
auth.mongo.auth_query.collection = mqtt_user
auth.mongo.auth_query.password_field = password

命令行操作

直接输入mongo即可进入命令行交互模式。输入以下内容添加一个账户。

use mqtt
db.createCollection("mqtt_user")
db.mqtt_user.insert({username: "mongo_test", password: "test123456"})

图像化操作

mongo即可进入命令行交互模式
添加管理账户

> use admin
switched to db admin
> db.createUser(
   {
     user: "admin",
     pwd: "admin123456",
     roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
   }
 )
Successfully added user: {
        "user" : "admin",
        "roles" : [
                {
                        "role" : "userAdminAnyDatabase",
                        "db" : "admin"
                },
                "readWriteAnyDatabase"
        ]
}
> exit
bye

修改配置文件开启任意ip访问和验证权限

vim /etc/mongod.conf

主要修改以下内容

net:
  port: 27017
  #bindIp: 127.0.0.1  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
  bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.


security:
  authorization: enabled

阿里云Centos7搭建属于自己的物联网平台(二)EMQX MQTT Broker的认证插件_第3张图片
点击下载Mongodb的图形化工具Robo 3T
安装并打开Robo 3T
Ctrl+N快捷键新建一个连接
阿里云Centos7搭建属于自己的物联网平台(二)EMQX MQTT Broker的认证插件_第4张图片
然后这是用户验证信息。
阿里云Centos7搭建属于自己的物联网平台(二)EMQX MQTT Broker的认证插件_第5张图片
阿里云Centos7搭建属于自己的物联网平台(二)EMQX MQTT Broker的认证插件_第6张图片
然后就可以图形化的方式操作数据库了。
阿里云Centos7搭建属于自己的物联网平台(二)EMQX MQTT Broker的认证插件_第7张图片
阿里云Centos7搭建属于自己的物联网平台(二)EMQX MQTT Broker的认证插件_第8张图片
具体的操作不在赘述。

注意图形化方式操作开启了任意ip登陆,为了安全起见同时也开起来权限验证,不允许匿名登陆了,因此需要在emqx插件的配置文件中也打开相应的配置
需要在emqx插件的配置文件中也打开相应的配置
需要在emqx插件的配置文件中也打开相应的配置
需要在emqx插件的配置文件中也打开相应的配置

vim /etc/emqx/plugins/emqx_auth_mongo.conf

主要修改以下配置

auth.mongo.login = admin
auth.mongo.password = XXXXXXXX
auth.mongo.auth_source = admin

重启mongoemqx

systemctl restart mongod
systemctl restart emqx

连接验证

阿里云Centos7搭建属于自己的物联网平台(二)EMQX MQTT Broker的认证插件_第9张图片
阿里云Centos7搭建属于自己的物联网平台(二)EMQX MQTT Broker的认证插件_第10张图片

MySql 认证/访问控制

安装mysql数据库

mysql的安装我使用的是宝塔面板来安装的
centos7上宝塔面板一键安装脚本

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

具体宝塔面板的使用和介绍可点击此处跳转到官网了解
安装完成后可以使用bt default查看默认的web登陆信息

bt default
==================================================================
BT-Panel default info!
==================================================================
Bt-Panel-URL: http://xx.xx.xx.xx:xxxx/xxxx
username: xxxx
password: xxxxxxxx
Warning:
If you cannot access the panel,
release the following port (8888|888|80|443|20|21) in the security group

以下即为登陆信息,为了安全起见我使用xx代替具体的信息

Bt-Panel-URL: http://xx.xx.xx.xx:xxxx/xxxx
username: xxxx
password: xxxxxxxx

也可以使用bt命令对宝塔面板进行设置

bt
===============宝塔面板命令行==================
(1) 重启面板服务           (8) 改面板端口
(2) 停止面板服务           (9) 清除面板缓存
(3) 启动面板服务           (10) 清除登录限制
(4) 重载面板服务           (11) 取消入口限制
(5) 修改面板密码           (12) 取消域名绑定限制
(6) 修改面板用户名         (13) 取消IP访问限制
(7) 强制修改MySQL密码      (14) 查看面板默认信息
(22) 显示面板错误日志      (15) 清理系统垃圾
(23) 关闭BasicAuth认证     (16) 修复面板(检查错误并更新面板文件到最新版)
(24) 关闭谷歌认证          (17) 设置日志切割是否压缩
(25) 设置是否保存文件历史副本  (18) 设置是否自动备份面板
(0) 取消
===============================================
请输入命令编号:

可以修改端口、用户名、密码等建议修改一下,避免默认带来安全性问题
阿里云Centos7搭建属于自己的物联网平台(二)EMQX MQTT Broker的认证插件_第11张图片
可以看到登陆之后就会提示安装web套件,顺便就把mysql安装了。
可以在以下地方查看会修改mysql的root密码
阿里云Centos7搭建属于自己的物联网平台(二)EMQX MQTT Broker的认证插件_第12张图片

mysql -uroot -p   输入密码后进入数据库 exit退出

修改emqx_auth_mysql的插件的配置文件

vim /etc/emqx/plugins/emqx_auth_mysql.conf
  1. 和mongo认证方式类似,前三行添加了数据库相关的信息(账号、密码、数据库名),最后一行修改为不加密。
  2. 以上配置为了测试方便,后续根据实际情况选择修改。
    以下是配置文件中需要修改的点,其他使用默认即可
auth.mysql.username = root
auth.mysql.password = XXXXXX
auth.mysql.database = mqtt
auth.mysql.password_hash = plain
auth.mysql.auth_query = select password from mqtt_user where username = '%u' limit 1

加载emqx_auth_mysql插件

可以使用emqx_ctl plugins load xxxxxx来加载插件。
成功会返回Plugin xxxxxx loaded successfully.以下不在赘述。
使用emqx_ctl plugins list查看加载的插件

emqx_ctl plugins load emqx_auth_mysql

如果加载不成功重启以下 emqx、mysql或者重启服务器试试
重启emqx

systemctl restart emqx

用户管理

通过操作数据库的方式管理用户
/etc/emqx/plugins/emqx_auth_mysql.conf这个配置文件中有以下几条配置,我们使用了默认值,以下几条配置是我们操作的基础。

auth.mysql.database = mqtt
auth.mysql.auth_query = select password from mqtt_user where username = '%u' limit 1
auth.mysql.super_query = select is_superuser from mqtt_user where username = '%u' limit 1
auth.mysql.acl_query = select allow, ipaddr, username, clientid, access, topic from mqtt_acl where ipaddr = '%a' or username = '%u' or username = '$all' o    r clientid = '%c'

命令行操作

直接输入mysql -u root -p后输入root密码即可进入命令行交互模式。输入以下内容添加一个账户。

创建数据库

CREATE DATABASE mqtt;
use mqtt

创建Auth Table

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;

创建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;

添加一个用户

  • username 用户名
  • password 为密码
  • is_superuser 是否为超级用户,用于控制 ACL,缺省为0;设置成 1 的时候为超级用户,可以跳过 ACL(Topic 的读写权限控制Topic ACL) 检查。
INSERT INTO 
mqtt_user(username,password,is_superuser)
VALUES("mysql_test","test123456",1);

图像化操作

  • 使用phpMyAdmin来进行mysql的图形化操作。
  • 前面使用宝塔面板安装mysql时已自动安装。
    阿里云Centos7搭建属于自己的物联网平台(二)EMQX MQTT Broker的认证插件_第13张图片
    阿里云Centos7搭建属于自己的物联网平台(二)EMQX MQTT Broker的认证插件_第14张图片
    阿里云Centos7搭建属于自己的物联网平台(二)EMQX MQTT Broker的认证插件_第15张图片

连接验证

阿里云Centos7搭建属于自己的物联网平台(二)EMQX MQTT Broker的认证插件_第16张图片
阿里云Centos7搭建属于自己的物联网平台(二)EMQX MQTT Broker的认证插件_第17张图片

备注

如果遇到连不上的情况,请检查阿里云的安全策略组或者防火墙
为了安全起见文中账号密码或者ip端口等敏感信息打了马赛克或使用xx代替

你可能感兴趣的:(阿里云Centos7搭建属于自己的物联网平台(二)EMQX MQTT Broker的认证插件)