跳到主要内容

安全性

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 路径可以减少跨租户误操作。

关于租户分配和路由的更多说明,请参考 多租户