EMQX HTTP Auth认证

系统的安全性需要从身份认证、操作授权、黑名单机制、数据安全传输等几个方面去考虑,EMQX Broker的安全也是从这几方面考虑,下面分别介绍下EMQX安全特性。

身份认证

身份验证是大多数应用程序的重要组成部分。MQTT 协议支持用户名/密码认证以及增强认证,例如 SASL/SCRAM 身份验证。启用认证可以有效防止非法客户端连接。

EMQX 提供了与多种后端数据库的集成支持,包括 MySQL、PostgreSQL、MongoDB 和 Redis。同时 EMQX 也支持用户将身份凭据存储到内置数据库(Mnesia)中。与使用外部数据库相比,这种方式提供了非常简单的配置流程和用户管理接口。例如,您可以从仪表板 UI 管理用户,或从 CSV 或 JSON 文件批量导入用户。内置数据库也是性能最高的认证数据源,因为 EMQX 运行时会将这些用于认证的数据会从磁盘加载到内存中。

今天仅学习采用HTTP密码认证。

使用 HTTP 的密码认证

HTTP 认证使用外部自建 HTTP 应用认证数据源,根据 HTTP API 返回的数据判定认证结果,能够实现复杂的认证鉴权逻辑。

HTTP认证原理

  • 在认证器的设置中,指定 HTTP 请求模式。
  • 当 MQTT 客户端连接到 EMQX 时,HTTP 认证器会根据配置的请求模板渲染并发送生成的请求。
  • HTTP 响应状态码 (HTTP Status Code) 被用于判断认证请求是否被认证服务器接收执行。
    • 认证结果应通过 Status Code 200 或 204 进行返回。
      认证结果、是否为超级用户将分别由 Response Body 内的 resultis_superuser 字段值指示。
    • 其他响应码将被认为 HTTP 认证请求执行失败。如 4xx、5xx 等。
      此时认证结果使用缺省值 "ignore",继续执行认证链。如果当前的 HTTP 认证器是链上的最后一个认证器,则认证失败,客户端将被拒绝连接。
  • HTTP 响应的编码格式可以是 application/json

返回示例

HTTP/1.1 200 OK
Headers: Content-Type: application/json
...
Body:
{
    "result": "allow" | "deny" | "ignore", // Default `"ignore"`
    "is_superuser": true | false // Default `false`
}

配置

  1. 登录dashboard,点击 访问授权 -> 认证 -> 创建 按钮

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

特别注意:EMQX使用docker安装,因此填写宿主机ip

服务端 HTTP 代码

安装Gin 依赖

go get -u github.com/gin-gonic/gin
package main

import (
	"github.com/gin-gonic/gin"
	"io"
	"net/http"
	"os"
)

type Login struct {
	Username string `json:"username"`
	Password string `json:"password"`
}

func main() {
	gin.DefaultWriter = io.MultiWriter(os.Stdout)

	r := gin.Default()
	r.POST("/auth/:clientid", func(c *gin.Context) {
		login := Login{}
		c.BindJSON(&login)

		allow := "deny"
		//
		if login.Username == "kobe" && login.Password == "123456" {
			allow = "allow"
		}
		c.JSON(http.StatusOK, gin.H{
			"result":       allow,
			"is_superuser": "true",
		})
	})
	r.Run(":8888")
}

启动程序,进行测试

curl -X POST -d '{"username": "James", "password": "123456"}' \
     -H "Content-Type: application/json" \
     http://localhost:8888/auth/1
AndydeMacBook-Pro:~ andy$ curl -X POST -d '{"username": "James", "password": "123456"}'      -H "Content-Type: application/json"      http://localhost:8888/auth/1
{"result":"deny","is_superuser":true}

AndydeMacBook-Pro:~ andy$ curl -X POST -d '{"username": "kobe", "password": "123456"}'      -H "Content-Type: application/json"      http://localhost:8888//auth/1
{"result":"allow","is_superuser":true}

# 测试成功

登录测试

在这里插入图片描述

客户端登录,分别输入错误、正确的账号密码(错误账号: jodan/123456, 正确账号: kobe/123456),以及http服务端控制台输出截图:

错误账号链接

正确账号登录

总结

通过集成 外部HTTP 认证接口,极大的扩展了MQTT Broker的安全机制的能力,将认证功能暴露给业务系统接口,在精简Broker架构设计的同时,也增加了Broker认证的能力。总之,这一点架构思想是可以在平时的工作中借鉴的。

EMQ X 支持使用 MySQL 进行认证,具体配置步骤如下: 1. 安装 MySQL 和 Python 的 MySQL 驱动程序 2. 创建 EMQ X 所需的数据库和数据表,可以使用以下 SQL 语句: ```sql CREATE DATABASE emqx_auth; USE emqx_auth; CREATE TABLE mqtt_user ( id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, username VARCHAR(100) NOT NULL, password VARCHAR(100) NOT NULL, is_superuser BOOL NOT NULL DEFAULT FALSE, PRIMARY KEY (id), UNIQUE KEY mqtt_user_username_uindex (username) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE mqtt_acl ( id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, allow INT(1) NOT NULL DEFAULT 1, ipaddr VARCHAR(60) NOT NULL DEFAULT '', username VARCHAR(100) NOT NULL, clientid VARCHAR(100) NOT NULL, access INTEGER(2) NOT NULL, topic VARCHAR(256) NOT NULL, PRIMARY KEY (id), KEY mqtt_acl_username_clientid_topic_uindex (username,clientid,topic) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; ``` 3. 配置 EMQ X,编辑 emqx.conf 文件,将 auth.acl.auth_mysql 和 auth.user.auth_mysql 配置为 true,同时配置数据库连接信息,例如: ```conf auth.user.auth_mysql = on auth.user.mysql.server = 127.0.0.1:3306 auth.user.mysql.username = root auth.user.mysql.password = root auth.user.mysql.database = emqx_auth auth.user.mysql.pool = 8 auth.acl.auth_mysql = on auth.acl.mysql.server = 127.0.0.1:3306 auth.acl.mysql.username = root auth.acl.mysql.password = root auth.acl.mysql.database = emqx_auth auth.acl.mysql.pool = 8 ``` 4. 重启 EMQ X,使配置生效。 注意:以上配置仅供参考,实际配置应根据具体情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值