安全
认证
身份认证是物联网应用的重要组成部分,可以帮助有效组织非法客户端的连接。
认证机制
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发布和订阅所有主题。