Skip to content

安全认证

TMQTT 提供多层次的安全防护机制,包括身份认证、访问控制和速率限制。默认安全策略较为严格(匿名连接默认关闭),确保生产环境开箱即安全。


认证方式总览

TMQTT 支持以下认证方式,可根据场景单独使用或组合使用:

认证方式适用场景复杂度
用户名/密码设备端简单认证,适合内部网络
JWT Token无状态认证,适合开放平台和微服务
mTLS 证书高安全场景,如金融、医疗
链式认证多种方式并存,按顺序尝试

匿名连接

配置项 auth.anonymous_allow 控制是否允许没有用户名密码的客户端连接。

  • 默认值false(拒绝匿名连接)
  • 开发环境:可以设为 true 方便调试
  • 生产环境:务必保持 false,所有客户端必须通过认证才能连接

用户名密码认证

最基础的认证方式,客户端连接时提供用户名和密码,TMQTT 与本地密码文件比对。

密码文件格式:每行一条记录,格式为 用户名:Argon2id哈希值

Argon2id 是目前推荐的密码哈希算法,能有效抵抗暴力破解。可以使用 TMQTT 提供的工具或第三方工具生成哈希值。

启用方式:在配置文件中指定密码文件路径:

toml
[auth.password_file]
path = "/etc/tmqtt/passwd"

JWT Token 认证

适合需要无状态认证的场景,客户端在连接时携带 JWT Token 作为密码,TMQTT 使用预配置的公钥验证签名。

支持的算法:RS256(RSA)和 ES256(椭圆曲线)

校验内容

  • 签名合法性
  • Token 过期时间(可配置是否校验)
  • Audience 受众声明(可配置期望的 audience 列表,防止其他系统签发的 Token 被复用)

启用方式

toml
[auth.jwt]
algorithm = "RS256"
public_key = "/etc/tmqtt/jwt.pub"
expiry_check = true
audience = ["tmqtt-broker"]

证书认证(mTLS)

最高安全级别的认证方式。客户端连接时必须提供由可信 CA 签发的客户端证书,TMQTT 通过验证证书链确认客户端身份。

启用方式:在 TLS 监听配置中开启 mTLS:

toml
[listener.tls]
bind = "0.0.0.0:8883"
cert = "/etc/tmqtt/server.crt"
key = "/etc/tmqtt/server.key"
ca_cert = "/etc/tmqtt/ca.crt"
mtls = true

证书中的 Common Name(CN)字段可以作为客户端身份标识使用。


链式认证(多种方式组合)

TMQTT 支持同时配置多种认证方式,连接时会按顺序依次尝试,任一方式通过即认证成功。

例如,同时配置密码文件和 JWT,则客户端可以用密码登录,也可以用 JWT Token 登录。两种方式都接受,灵活适配不同客户端。


访问控制(ACL)

认证解决"你是谁"的问题,ACL 解决"你能做什么"的问题。TMQTT 支持基于配置文件的细粒度访问控制。

控制粒度

  • 可以按用户名或客户端 ID 设置规则
  • 发布(Publish)和订阅(Subscribe)权限分开控制
  • 支持主题通配符(+#
  • 支持 {client_id} 变量替换(客户端只能操作与自己 ID 相关的主题)

默认策略:无匹配规则时拒绝访问(安全优先)

热加载:修改 ACL 规则文件后,TMQTT 会自动检测并重新加载,无需重启服务。


速率限制

防止恶意客户端通过大量连接或消息洪泛攻击消耗 Broker 资源。

连接速率限制:限制每个 IP 地址每秒新建连接数。超过限制的连接会被直接拒绝。

发布速率限制:限制每个连接每秒发布的消息数量。超过限制的消息会被拒绝。

配置示例:

toml
[auth.rate_limit]
max_connections_per_sec = 50
max_publish_per_sec = 500

安全最佳实践

  1. 关闭匿名连接(anonymous_allow = false
  2. 至少配置一种认证方式
  3. 启用 TLS 加密通信
  4. 配置 ACL 限制客户端只能访问必要主题
  5. 设置合理的速率限制
  6. 为管理 API 配置鉴权 Token

完整的安全加固清单请参见 性能与安全加固

Copyright (c) 2026 桃子 TaoZi.Pub https://taozi.pub | MIT License