随着物联网 (IoT) 设备的爆炸式增长,MQTT (Message Queuing Telemetry Transport) 协议作为轻量级的消息传输协议,被广泛应用于各种物联网场景。然而,在享受 MQTT 带来的便利性的同时,我们必须正视其存在的安全风险。MQTT 协议在物联网环境中的安全风险不容忽视,一旦被攻击者利用,可能导致设备数据泄露、设备控制权限被篡改等严重后果。例如,未经授权的设备可以订阅和发布消息,从而窃取敏感数据或者向设备发送恶意指令。
常见 MQTT 安全威胁
- 身份认证和授权不足: 默认配置下,许多 MQTT Broker 没有启用身份验证或使用了弱口令,攻击者可以轻易连接并操控消息。
- 传输数据未加密: MQTT 默认使用明文传输数据,攻击者可以通过中间人攻击窃取消息内容。
- 消息注入攻击: 攻击者可以构造恶意消息,例如超长消息或包含特殊字符的消息,导致 Broker 崩溃或者执行恶意代码。
- 拒绝服务 (DoS) 攻击: 攻击者可以发送大量的连接请求或消息,耗尽 Broker 的资源,导致服务不可用。
- 会话劫持: 攻击者可以窃取或伪造客户端的会话 ID,冒充合法客户端进行操作。
MQTT 协议底层原理与安全缺陷
MQTT 协议基于发布/订阅模式,客户端连接到 Broker (消息服务器),然后可以订阅感兴趣的主题 (Topic) 或发布消息到指定的主题。 Broker 负责将消息路由到所有订阅了该主题的客户端。
MQTT 协议本身的安全机制相对薄弱,主要依赖于 TLS/SSL 加密传输和用户名/密码认证。然而,以下因素加剧了 MQTT 的安全风险:
- 物联网设备资源有限: 许多物联网设备计算能力和存储空间有限,无法支持复杂的加密算法和安全协议。
- 设备管理不善: 许多物联网设备缺乏有效的安全管理措施,例如定期更新固件、配置防火墙等。
- 默认配置不安全: 许多 MQTT Broker 默认配置不安全,例如未启用身份验证或使用了弱口令。
MQTT 安全防范措施
加强身份认证和授权
启用 TLS/SSL 加密传输: 使用 TLS/SSL 加密 MQTT 连接,防止数据在传输过程中被窃取。以下是使用 OpenSSL 生成自签名证书的示例:
openssl req -new -x509 -days 365 -nodes -keyout mqtt_broker.key -out mqtt_broker.crt配置 MQTT Broker (例如 Mosquitto) 使用该证书:

port 8883 listener 1883 localhost cafile /etc/mosquitto/ca_certificates/ca.crt # CA 证书 certfile /etc/mosquitto/certs/mqtt_broker.crt # Broker 证书 keyfile /etc/mosquitto/certs/mqtt_broker.key # Broker 私钥 require_certificate true use_identity_as_username true使用强密码和证书认证: 避免使用默认密码,并定期更换密码。 考虑使用客户端证书进行身份验证,提高安全性。
实施访问控制列表 (ACL): 使用 ACL 限制客户端对主题的访问权限,防止未经授权的客户端订阅或发布消息。以下是一个 Mosquitto ACL 的示例:

user myuser topic read sensor/temperature topic write actuator/led
消息完整性和防篡改
使用消息摘要算法: 在消息中添加消息摘要 (例如 MD5 或 SHA-256),用于验证消息的完整性,防止消息被篡改。可以在应用层实现消息摘要的计算和验证。
import hashlib def calculate_md5(message): md5_hash = hashlib.md5(message.encode('utf-8')).hexdigest() return md5_hash message = "Hello, MQTT!" md5_digest = calculate_md5(message) print(f"Message: {message}") print(f"MD5 Digest: {md5_digest}")数字签名: 使用数字签名对消息进行签名,确保消息的来源可靠,防止消息被伪造。可以使用 RSA 或 ECC 算法进行数字签名。

Broker 安全加固
- 限制连接速率: 配置 Broker 的连接速率限制,防止 DoS 攻击。例如,在 Mosquitto 中,可以使用
max_connections参数限制最大连接数。 - 禁用不必要的协议和功能: 禁用 Broker 上不必要的协议和功能,减少攻击面。例如,禁用 MQTT v3.1.1 如果你的客户端都支持 MQTT v5。
- 定期更新 Broker: 定期更新 Broker 到最新版本,修复已知的安全漏洞。 可以考虑使用诸如宝塔面板简化运维操作,但切记及时更新宝塔本身。
- 配置防火墙: 使用防火墙限制对 Broker 的访问,只允许来自可信 IP 地址的连接。 可以考虑使用 Nginx 做反向代理,配置 WAF (Web Application Firewall) 进一步提升安全性,应对诸如 SQL 注入等攻击,以及实现负载均衡。
设备端安全
- 固件安全: 定期更新设备固件,修复安全漏洞。对固件进行代码审计,检查是否存在后门或恶意代码。
- 安全启动: 使用安全启动机制,验证启动代码的完整性,防止设备被恶意软件感染。
- 设备隔离: 将物联网设备隔离到独立的网络中,限制其访问其他网络的权限。 使用 VLAN 技术可以有效隔离网络。
实战避坑经验总结
- 不要使用默认配置: 许多 MQTT Broker 和设备默认配置不安全,务必修改默认配置,例如密码、端口等。
- 日志监控: 启用 MQTT Broker 的日志功能,定期检查日志,发现异常行为及时处理。 可以使用 ELK (Elasticsearch, Logstash, Kibana) Stack 进行日志分析和监控。
- 渗透测试: 定期进行渗透测试,模拟攻击者的行为,发现潜在的安全漏洞。
- 安全培训: 加强开发人员和运维人员的安全培训,提高安全意识。
- 协议选择: 如果对安全性要求极高,可以考虑使用 MQTT over WebSocket over TLS,或者 CoAP (Constrained Application Protocol) 等更安全的协议。
通过以上措施,可以有效降低 MQTT 协议在物联网环境中的安全风险,保障物联网系统的安全稳定运行。
冠军资讯
青衫落拓