阿里云Centos7搭建属于自己的物联网平台(一)EMQX MQTT Broker的认证插件
我的开发环境
操作系统: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
以下是修改后的配置文件
- 取消了
auth.user.1.username = admin
和auth.user.1.password = public
的注释表示添加一个admin
的用户,密码为public
- 修改
auth.user.password_hash = sha256
为auth.user.password_hash = plain
表示不适用加密方式,密码采用明文,为了方便测试。后续根据实际情况选择加密方式。
##--------------------------------------------------------------------
## Username Authentication Plugin
##--------------------------------------------------------------------
## Examples:
auth.user.1.username = admin
auth.user.1.password = public
##auth.user.2.username = feng@emqtt.io
##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 ~]#
连接验证
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
- 修改
auth.mongo.auth_query.password_hash = sha256
为auth.mongo.auth_query.password_hash = plain
表示不适用加密方式,密码采用明文,为了方便测试。后续根据实际情况选择加密方式。 - 修改
auth.mongo.super_query = on
为auth.mongo.super_query = off
表示关闭超级用户查询 - 修改
auth.mongo.acl_query = on
为auth.mongo.acl_query = off
表示关闭Publish 和 Subscribe 的权限查询查询。 - 以上配置为了测试方便,后续根据实际情况选择修改。
以下是配置文件中需要修改的点,其他使用默认即可
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
点击下载Mongodb的图形化工具Robo 3T
安装并打开Robo 3T
按Ctrl+N
快捷键新建一个连接
然后这是用户验证信息。
然后就可以图形化的方式操作数据库了。
具体的操作不在赘述。
注意图形化方式操作开启了任意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
重启mongo
和emqx
systemctl restart mongod
systemctl restart emqx
连接验证
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) 取消
===============================================
请输入命令编号:
可以修改端口、用户名、密码等,建议修改一下,避免默认带来安全性问题
可以看到登陆之后就会提示安装web套件,顺便就把mysql安装了。
可以在以下地方查看会修改mysql的root密码
mysql -uroot -p 输入密码后进入数据库 exit退出
修改emqx_auth_mysql的插件的配置文件
vim /etc/emqx/plugins/emqx_auth_mysql.conf
- 和mongo认证方式类似,前三行添加了数据库相关的信息(账号、密码、数据库名),最后一行修改为不加密。
- 以上配置为了测试方便,后续根据实际情况选择修改。
以下是配置文件中需要修改的点,其他使用默认即可
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时已自动安装。
连接验证
备注
如果遇到连不上的情况,请检查阿里云的安全策略组或者防火墙
为了安全起见文中账号密码或者ip端口等敏感信息打了马赛克或使用xx代替