3、身份认证漏洞:匿名连接风险、弱密码爆破、客户端证书伪造、Token泄露

身份认证,说白了就是MQTT服务器在问客户端:“你是谁?我凭什么相信你?”

如果这一步没做好,攻击者就能轻松混进来。我见过太多物联网项目,设备直接裸连,连个密码都没有。结果呢?被人当肉鸡,数据被篡改,甚至被用来发动DDoS攻击。

这一节,咱们就把身份认证的四个“死穴”挨个拆解一遍。

3.1 匿名连接风险

MQTT协议默认允许匿名连接。很多开发者图省事,直接把这个选项开着。你想想看,一个没有任何凭证的设备,就能随意发布和订阅消息,这跟把家门钥匙挂在门把手上有什么区别?

⚠️ 风险提示:
  • 攻击者可以随意订阅所有主题,窃取敏感数据。
  • 攻击者可以向控制主题发布恶意指令,导致设备误动作。
  • 攻击者可以大量建立匿名连接,耗尽服务器资源(DoS攻击)。

防护方案:

  1. 强制关闭匿名连接:在Broker配置中设置 allow_anonymous false。
  2. 设置默认拒绝策略:所有未认证的连接,直接断开。
  3. 定期审计:检查Broker日志,看是否有异常的匿名连接尝试。
💡 我的经验: 我曾经接手过一个智慧农业项目,传感器数据经常莫名其妙地乱跳。查了半天,发现是隔壁工厂的实习生用MQTT客户端匿名连上了我们的Broker,在乱发数据。关掉匿名连接后,世界清净了。

3.2 弱密码爆破

就算你关了匿名连接,如果密码设得太简单,也等于没设。攻击者可以用Hydra、Medusa这类工具,对着你的Broker一顿暴力破解。

常见的弱密码有哪些?

  • admin / admin
  • mqtt / mqtt
  • 123456 / 123456
  • device / device
  • 出厂默认密码,从未修改

防护方案:

措施 说明 推荐等级
密码复杂度策略 至少8位,包含大小写字母、数字、特殊字符 强制
登录失败锁定 连续5次失败,锁定该IP或用户名30分钟 强烈推荐
动态密码(OTP) 每次连接使用一次性密码,如TOTP 高安全场景
密码定期轮换 每90天强制修改一次密码 推荐
🔑 关键配置示例(Mosquitto):
# 关闭匿名
allow_anonymous false
# 密码文件
password_file /etc/mosquitto/passwd
# 限制连接速率
connection_messages true
# 设置最大连接数
max_connections 1000

3.3 客户端证书伪造

密码认证虽然简单,但容易被爆破。更安全的做法是用证书。但证书认证就万无一失了吗?也不是。

我见过一个案例:某公司用自签CA给所有设备发证书,结果CA的私钥被泄露了。攻击者拿着这个CA,给自己签了一大堆假证书,堂而皇之地连上了Broker。

证书伪造的常见场景:

  • CA私钥泄露:攻击者用泄露的CA签发任意客户端证书。
  • 证书未绑定设备ID:证书的Common Name(CN)或Subject Alternative Name(SAN)没有和设备唯一标识绑定。
  • 证书吊销不及时:设备被攻陷后,证书没有被及时吊销,攻击者可以继续使用。
  • 自签证书无验证:Broker没有配置验证客户端证书的CA链。

防护方案:

  1. 证书与设备指纹绑定:在证书的CN或SAN字段中写入设备的唯一ID(如IMEI、MAC地址)。
  2. 启用CRL或OCSP:配置证书吊销列表(CRL)或在线证书状态协议(OCSP),实时检查证书是否有效。
  3. 双向认证(mTLS):不仅Broker要验证客户端证书,客户端也要验证Broker的证书。
  4. 硬件安全模块(HSM):将CA私钥存储在HSM中,防止被导出。
⚠️ 避坑指南: 我曾经在部署时,只配置了单向TLS(只验证服务器证书),结果客户端证书随便拿一个就能连上。后来改成mTLS,才真正堵住了这个漏洞。记住:单向TLS只加密,不认证客户端身份。

3.4 Token泄露

Token认证在物联网场景中越来越流行。设备先向认证服务器获取一个Token,然后用这个Token去连接MQTT Broker。Token通常有有效期,比密码更灵活。

但Token一旦泄露,后果也很严重。

Token泄露的途径:

  • 日志泄露:Token被打印在日志文件中,运维人员可以随意查看。
  • 网络嗅探:如果Token在明文传输,攻击者可以抓包获取。
  • 客户端存储不安全:Token以明文形式存储在设备文件系统中,设备被root后即可读取。
  • Token未绑定客户端IP或设备ID:攻击者拿到Token后,可以在任意设备上使用。

防护方案:

措施 实现方式
Token绑定 将Token与客户端IP、设备ID、User-Agent绑定
短有效期 Token有效期设为1小时以内,甚至更短
刷新机制 使用Refresh Token定期更换Access Token
传输加密 Token必须通过TLS/SSL传输,禁止明文
安全存储 使用安全元件(SE)或可信执行环境(TEE)存储Token
💡 我的建议: 对于高安全场景,我推荐使用JWT(JSON Web Token)并配合签名验证。Broker收到Token后,先验证签名是否有效,再检查是否过期,最后检查绑定的设备ID是否匹配。三步都通过,才允许连接。

3.5 知识体系总览

下面这张图,把身份认证的四个漏洞和对应的防护方案串了起来。你可以把它当作一个检查清单,部署MQTT时逐项核对。

MQTT身份认证漏洞与防护体系 MQTT身份认证漏洞与防护体系 匿名连接 无凭证访问 弱密码爆破 暴力破解 证书伪造 CA私钥泄露 Token泄露 凭证失窃 防护方案 关闭匿名连接 allow_anonymous false 默认拒绝策略 日志审计 密码策略 复杂度 + 长度 ≥ 8 失败锁定 + 限速 定期轮换 mTLS双向认证 证书绑定设备ID CRL/OCSP吊销 HSM保护CA私钥 Token安全 短有效期 绑定客户端 安全存储 多层防护 + 纵深防御 没有银弹,组合使用 核心原则:默认拒绝、最小权限、持续验证

身份认证是MQTT安全的第一道防线。匿名连接、弱密码、证书伪造、Token泄露,这四个问题只要有一个没处理好,整个系统就可能被攻破。

我个人习惯是:能关的匿名连接一定关,能用证书就不用密码,能用Token就绑定设备ID。多一层防护,就多一分安全。