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 HTTP Auth认证_第1张图片

EMQX HTTP Auth认证_第2张图片

EMQX HTTP Auth认证_第3张图片

特别注意: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}

# 测试成功

登录测试

EMQX HTTP Auth认证_第4张图片

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

EMQX HTTP Auth认证_第5张图片

EMQX HTTP Auth认证_第6张图片

总结

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

你可能感兴趣的:(MQTT,http,安全,java)