MongoDB 认证/访问控制

EMQX 企业版技术支持发表于:2022年05月16日 13:54:21

MongoDB 认证/访问控制

MongoDB 认证/访问控制使⽤外部 MongoDB 数据库作为数据源,可以存储⼤量数据,同时⽅便与外部设备管理系统集成。

安装MongoDB

这里我们以Docker为例:

## 拉取并运行mongo容器
docker run -itd --name mongo -p 27017:27017 mongo 

## 进入容器内
docker exec -it mongo bash

## 进入命令行
mongo

创建模块

打开 EMQX Dashboard,点击左侧的 “模块” 选项卡,选择添加:

image.png

选择 MongoDB 认证/访问控制模块

image.png

配置 MongoDB 相关参数

image.png

SRV 记录的相关说明和使用方式请参考 规则引擎 - 保存数据到 MongoDB

点击添加后,模块添加完成:

image.png

认证集合

db.mqtt_user.insert({  
    username: "mongo",  
    password: "mongo",  
    salt: "salt",  
    is_superuser: false,  
    created: "2022-05-16 11:12:14"
})

image.png

进行身份认证时,EMQX 将使用当前客户端信息填充并执行用户配置的认证 Query,查询出该客户端在数据库中的认证数据。

验证结果:

image.png

MongoDB 支持配置集合名称、认证字段、认证占位符等等参数。

配置项说明
认证查询集合认证查询的MongoDB集合
认证查询字段名需要从集合里面查询出来的字段,如果需要查询多个,使用逗号分隔。例如password,salt
认证条件字段认证查询的条件,如果需要查询多个,使用逗号分隔。例如 username=%u,clientid=%c


你可以在认证查询占位符中使用以下占位符,执行时 EMQX 将自动填充为客户端信息:

  • %u:用户名

  • %c:clientid

  • %C:TLS 证书公用名(证书的域名或子域名),仅当 TLS 连接时有效

  • %d:TLS 证书 subject,仅当 TLS 连接时有效

你可以根据业务需要调整认证查询,如添加多个查询条件、使用数据库预处理函数,以实现更多业务相关的功能。但是任何情况下认证查询需要满足以下条件:

  1. 查询结果中必须包含 password 字段,EMQX 使用该字段与客户端密码比对

  2. 如果启用了加盐配置,查询结果中必须包含 salt 字段,EMQX 使用该字段作为 salt(盐)值

  3. MongoDB 使用 findOne 查询命令,确保你期望的查询结果能够出现在第一条数据中

提示:这是默认配置使用的集合结构,熟悉该插件的使用后你可以使用任何满足条件的集合进行认证。

访问控制集合

db.mqtt_acl.insert({    
    username: "mongo",    
    clientid: "mqttjs_b92f275d",    
    publish: ["topic/1"],    
    subscribe: ["topic/2"],    
    pubsub: ["topic/3"]
})

image.png

MongoDB ACL 一条规则中定义了发布、订阅和发布/订阅的信息,在规则中的都是允许列表。

验证结果:
image.png

image.png

规则字段说明:

配置项说明
访问控制查询集合访问控制查询的MongoDB集合
访问控制查询字段名需要从集合里面查询出来的字段
访问控制条件字段访问控制查询的条件,支持and 和 or 操作,and操作通过逗号分隔,例如:username=%u,clientid=%c, or 操作需要添加多条数据

超级用户查询

进行 ACL 鉴权时,EMQX 将使用当前客户端信息填充并执行用户配置的超级用户查询,查询客户端是否为超级用户。客户端为超级用户时将跳过 ACL 查询。 同一个选择器的多个条件时实际查询中使用 MongoDB and 查询:

db.mqtt_user.find({
  "username": "wivwiv"
  "clientid": "$all"
})

你可以在查询条件中使用以下占位符,执行时 EMQX 将自动填充为客户端信息:

  • %u:用户名

  • %c:clientid

你可以根据业务需要调整超级用户查询,如添加多个查询条件、使用数据库预处理函数,以实现更多业务相关的功能。但是任何情况下超级用户查询需要满足以下条件: 查询结果中必须包含 is_superuser 字段,is_superuser 应该显式的为 true。 MongoDB 支持配置集合名称、认证字段、认证占位符等等参数。

配置项说明
超级用户查询集合超级用户查询的MongoDB集合
超级用户查询字段名需要从集合里面查询出来的字段
超级用户条件字段超级用户查询的条件,如果需要查询多个,使用逗号分隔。例如 username=%u,clientid=%c

提示:MongoDB ACL 规则需严格使用上述数据结构。 MongoDB ACL 中添加的所有规则都是 允许 规则,可以搭配 etc/emqx.confacl_nomatch = deny 使用。

加密规则

## 不加盐,明文
plain

## 不加盐,仅做哈希处理
sha256

## salt 前缀:使用 sha256 加密 salt + 密码 拼接的字符串
salt,sha256

## salt 后缀:使用 sha256 加密 密码 + salt 拼接的字符串
sha256,salt

## pbkdf2 with macfun iterations dklen
## macfun: md4, md5, ripemd160, sha, sha224, sha256, sha384, sha512
pbkdf2,sha256,1000,20

提示:可参考:加盐规则与哈希方法


    您需要登录后才可以回复