3、身份认证漏洞:匿名连接风险、弱密码爆破、客户端证书伪造、Token泄露
身份认证,说白了就是MQTT服务器在问客户端:“你是谁?我凭什么相信你?”
如果这一步没做好,攻击者就能轻松混进来。我见过太多物联网项目,设备直接裸连,连个密码都没有。结果呢?被人当肉鸡,数据被篡改,甚至被用来发动DDoS攻击。
这一节,咱们就把身份认证的四个“死穴”挨个拆解一遍。
3.1 匿名连接风险
MQTT协议默认允许匿名连接。很多开发者图省事,直接把这个选项开着。你想想看,一个没有任何凭证的设备,就能随意发布和订阅消息,这跟把家门钥匙挂在门把手上有什么区别?
⚠️ 风险提示:
- 攻击者可以随意订阅所有主题,窃取敏感数据。
- 攻击者可以向控制主题发布恶意指令,导致设备误动作。
- 攻击者可以大量建立匿名连接,耗尽服务器资源(DoS攻击)。
防护方案:
- 强制关闭匿名连接:在Broker配置中设置
allow_anonymous false。 - 设置默认拒绝策略:所有未认证的连接,直接断开。
- 定期审计:检查Broker日志,看是否有异常的匿名连接尝试。
💡 我的经验:
我曾经接手过一个智慧农业项目,传感器数据经常莫名其妙地乱跳。查了半天,发现是隔壁工厂的实习生用MQTT客户端匿名连上了我们的Broker,在乱发数据。关掉匿名连接后,世界清净了。
3.2 弱密码爆破
就算你关了匿名连接,如果密码设得太简单,也等于没设。攻击者可以用Hydra、Medusa这类工具,对着你的Broker一顿暴力破解。
常见的弱密码有哪些?
admin / adminmqtt / mqtt123456 / 123456device / 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链。
防护方案:
- 证书与设备指纹绑定:在证书的CN或SAN字段中写入设备的唯一ID(如IMEI、MAC地址)。
- 启用CRL或OCSP:配置证书吊销列表(CRL)或在线证书状态协议(OCSP),实时检查证书是否有效。
- 双向认证(mTLS):不仅Broker要验证客户端证书,客户端也要验证Broker的证书。
- 硬件安全模块(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安全的第一道防线。匿名连接、弱密码、证书伪造、Token泄露,这四个问题只要有一个没处理好,整个系统就可能被攻破。
我个人习惯是:能关的匿名连接一定关,能用证书就不用密码,能用Token就绑定设备ID。多一层防护,就多一分安全。