系统的安全性需要从身份认证、操作授权、黑名单机制、数据安全传输等几个方面去考虑,EMQX Broker的安全也是从这几方面考虑,下面分别介绍下EMQX安全特性。
身份验证是大多数应用程序的重要组成部分。MQTT 协议支持用户名/密码认证以及增强认证,例如 SASL/SCRAM 身份验证。启用认证可以有效防止非法客户端连接。
EMQX 提供了与多种后端数据库的集成支持,包括 MySQL、PostgreSQL、MongoDB 和 Redis。同时 EMQX 也支持用户将身份凭据存储到内置数据库(Mnesia)中。与使用外部数据库相比,这种方式提供了非常简单的配置流程和用户管理接口。例如,您可以从仪表板 UI 管理用户,或从 CSV 或 JSON 文件批量导入用户。内置数据库也是性能最高的认证数据源,因为 EMQX 运行时会将这些用于认证的数据会从磁盘加载到内存中。
今天仅学习采用HTTP密码认证。
HTTP 认证使用外部自建 HTTP 应用认证数据源,根据 HTTP API 返回的数据判定认证结果,能够实现复杂的认证鉴权逻辑。
result
和 is_superuser
字段值指示。"ignore"
,继续执行认证链。如果当前的 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`
}
特别注意:EMQX使用docker安装,因此填写宿主机ip
安装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认证的能力。总之,这一点架构思想是可以在平时的工作中借鉴的。