系统的安全性需要从身份认证、操作授权、黑名单机制、数据安全传输等几个方面去考虑,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 内的result
和is_superuser
字段值指示。 - 其他响应码将被认为 HTTP 认证请求执行失败。如 4xx、5xx 等。
此时认证结果使用缺省值"ignore"
,继续执行认证链。如果当前的 HTTP 认证器是链上的最后一个认证器,则认证失败,客户端将被拒绝连接。
- 认证结果应通过 Status Code 200 或 204 进行返回。
- 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`
}
配置
- 登录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服务端控制台输出截图:
文章来源:https://www.toymoban.com/news/detail-411292.html
总结
通过集成 外部HTTP 认证接口,极大的扩展了MQTT Broker的安全机制的能力,将认证功能暴露给业务系统接口,在精简Broker架构设计的同时,也增加了Broker认证的能力。总之,这一点架构思想是可以在平时的工作中借鉴的。文章来源地址https://www.toymoban.com/news/detail-411292.html
到了这里,关于EMQX HTTP Auth认证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!