安全性
YedMQ 当前的安全能力主要由传输加密、多租户隔离、插件驱动的访问控制,以及带认证的管理 API 共同组成。
传输安全
YedMQ 可以为原生 MQTT 客户端和浏览器客户端分别暴露加密监听器。
MQTT over TLS
[listener.tcp_tls]
external = "0.0.0.0:8883"
verify_client_cert = false
cacert_file = "/path/to/ca.crt"
cert_file = "/path/to/server.crt"
key_file = "/path/to/server.key"
MQTT over WSS
[listener.wss]
external = "0.0.0.0:8084"
verify_client_cert = false
cacert_file = "/path/to/ca.crt"
cert_file = "/path/to/server.crt"
key_file = "/path/to/server.key"
当 verify_client_cert = false 时,监听器只校验服务端证书并提供加密通道。
当 verify_client_cert = true 时,监听器切换到 mTLS,客户端必须提供由 cacert_file 对应 CA 签发的证书。
完整监听器结构请参考 监听器配置。
认证与鉴权
YedMQ 将身份认证和 ACL 判定委托给插件系统。
YedMQ 当前有两套独立的认证面:
[listener.api.auth].users只保护 REST 管理 API- MQTT 客户端登录和主题鉴权走插件 hook 链
因此,给 REST API 添加用户,并不会自动生成 MQTT 用户名密码登录能力。
当没有插件响应时的默认行为
[plugin]
default_authenticate_result = false
default_authorize_result = false
在仓库自带的默认配置下,只有当认证或 ACL 插件返回结果时,MQTT 客户端才会被放行;如果只是本机临时验证,可以手动放开这个兜底。
插件当前可参与的判定信息
在连接和消息处理流程里,插件可以基于以下信息进行放行或拒绝:
- 用户名与密码
- 客户端 ID
- 客户端 IP
- 在 mTLS 监听器上已通过 TLS 校验的客户端证书
- 发布或订阅动作
- 主题名
- 租户归属
认证插件还可以返回 tenant_id,它会成为该连接后续的隔离边界。
REST API 保护
管理 API 使用在 yedmq.toml 中配置的 HTTP Basic Authentication。示 例配置默认把 API 绑定到 127.0.0.1,并且用户列表为空:
[listener.api]
external = "127.0.0.1:3456"
[listener.api.auth]
users = []
# 例如:
# users = [{ username = "admin", password = "replace_me" }]
在你完成用户配置之后,所有 /api/v1/* 请求都必须带上合法凭据。实际部署时应至少设置一个强密码,并避免将管理 API 直接暴 露给不可信网络。
作为安全边界的租户隔离
- 不同租户之间看不到彼此的会话、主题和保留消息。
- 客户端 ID 只需要在单个租户内保持唯一。
- 带租户前缀的 REST 路径可以减少跨租户误操作。
关于租户分配和路由的更多说明,请参考 多租户。