跳到主要内容

安全

认证

身份认证是物联网应用的重要组成部分,可以帮助有效组织非法客户端的连接。

认证机制

YedMQ 当前仅支持密码认证,后续会增加其他认证机制。

密码认证

YedMQ 支持通过密码进行身份认证。当客户端连接时,需要提供身份凭证信息,根据插件优先级,YedMQ 会在多个数据源中进行查询,如果匹配成功,YedMQ将接受该客户端的连接请求。

YedMQ 通过内置插件的方式与多类后端数据库集成提供密码认证,包括 MySQL, PostgreSQL

授权

授权是指对MQTT客户端的发布和订阅操作进行权限控制。在客户端尝试发布或订阅是,YedMQ会根据特定插件的逻辑,从相关数据源中获取该客户端的权限数据,将权限数据与要执行的操作进行匹配,根据匹配结果来允许或拒绝本次操作。

YedMQ 通过内置插件的方式与多类后端数据库集成提供密码认证,包括 MySQL, PostgreSQL,

Plugins

MySQL_ACL

MySQL认证授权需要确保内置插件正确安装。

表结构

表创建语句:

CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(100) NOT NULL,
password VARCHAR(500) NOT NULL,
tenant VARCHAR(100) NOT NULL
);

CREATE INDEX idx_users_username_tenant ON users (username, tenant);

CREATE TABLE acls (
id INT PRIMARY KEY,
username VARCHAR(100) NOT NULL,
tenant VARCHAR(100) NOT NULL,
topic VARCHAR(255) NOT NULL,
action VARCHAR(100) NOT NULL,
result VARCHAR(100) NOT NULL
);

CREATE INDEX idx_acls_username ON acls (username);
CREATE INDEX idx_acls_topic ON acls (topic);

users 表:

  • username: 用户名
  • password: 密码
  • tenant: 租户ID,认证成功后返回给YedMQ的租户唯一标识。

acls 表:

  • username: 客户端所使用的登录用户名
  • tenant: 所属的租户ID
  • action: 指定操作类型 publish 和 subscribe
  • result: 指定操作权限 allow 和 deny

PostgreSQL_ACL

表结构

表创建语句:

CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(100) NOT NULL,
password VARCHAR(500) NOT NULL,
tenant VARCHAR(100) NOT NULL
);

CREATE INDEX idx_users_username_tenant ON users (username, tenant);

CREATE TABLE acls (
id SERIAL PRIMARY KEY,
username VARCHAR(100) NOT NULL,
tenant VARCHAR(100) NOT NULL,
topic VARCHAR(255) NOT NULL,
action VARCHAR(100) NOT NULL,
result VARCHAR(100) NOT NULL
);

CREATE INDEX idx_acls_username ON acls (username);
CREATE INDEX idx_acls_topic ON acls (topic);

users 表:

  • username: 用户名
  • password: 密码
  • tenant: 租户ID,认证成功后返回给YedMQ的租户唯一标识。

acls 表:

  • username: 客户端所使用的登录用户名
  • tenant: 所属的租户ID
  • action: 指定操作类型 publish 和 subscribe
  • result: 指定操作权限 allow 和 deny

Redis_ACL

Redis_ACL 主要通过查询Redis进行相关鉴权。

新增用户
HSET mqtt_user:{登录用户名} password {登录密码} tenant_id {租户ID}

例如:允许user_1,使用密码123456登录,并且租户id为tenant_1

HSET mqtt_user:user_1 password 123456 tenant_id tenant_1
新增订阅发布权限

YedMQ 会根据用户名以及Topic查找最终结果,最终结果为字符串JSON,包含一个action属性

HSET mqtt_acl:{登录用户名} {订阅Topic} '{"action": "subscribe"}'
  • action: 客户端动作,可以为 publish subscribe all

例如:允许user_1,在 /a/b 这个topic,订阅和发布

HSET mqtt_acl:user_1 /a/b '{"action": "all"}'

File_ACL

File_ACL 主要依赖于配置文件进行权限鉴定。 文件结构JSON:

[{
"tenant": ["t1","t2"],
"action": "allow",
"username": ["%"],
"ipaddr": ["%"],
"subscribe": ["%"],
"publish": ["%"]
}]
  • tenant: 数组类型,包含了该条目对应的租户ID列表
  • action: 允许动作, allow 和 deny
  • username: 数组类型,包含了此条目涵盖的用户名, % 表示所有用户名
  • ipaddr: 数组类型,包含了此条目涵盖的IP地址, % 表示所有IP地址
  • subscribe: 数组类型,包含了此条目涵盖的所有订阅 topic
  • publish: 数组类型,包含了此条目涵盖的所有发布topic

例如: 如上文件表示,tenant 标识为 t1 或者 t2 的客户端,允许在任意IP发布和订阅所有主题。