跳转到内容

安全最佳实践

安全最佳实践

本节总结 MQTT TLS 安全通信的最佳实践。这些实践涵盖了从开发到生产的完整安全生命周期。学习完成后,您将能够:

  • 掌握 MQTT 安全配置的最佳实践
  • 建立 IoT 安全运维规范
  • 评估系统安全状况
  • 提供安全配置建议

在开始本节之前,请确保:

  • 已完成本章所有技术内容
  • 理解 MQTT 安全威胁和 TLS 原理
/opt/mosquitto/config/mosquitto.conf
# 安全强化配置
# ==== 网络 ====
# 禁用 1883 明文端口(仅使用加密端口)
# listener 1883 (注释掉或删除)
listener 8883
protocol mqtt
# ==== TLS 安全 ====
cafile /mosquitto/certs/fullchain.pem
certfile /mosquitto/certs/fullchain.pem
keyfile /mosquitto/certs/privkey.pem
tls_version tlsv1.2
# 强制要求客户端证书(双向验证,可选)
# require_certificate true
# ==== 认证 ====
# 禁用匿名访问
allow_anonymous false
# 密码文件
password_file /mosquitto/config/passwd
# ==== 访问控制 ====
acl_file /mosquitto/config/acl
# ==== 连接限制 ====
# 最大客户端连接数
max_connections 1000
# 客户端超时
set_tcp_nodelay true
# ==== 日志安全 ====
# 在生产环境中关闭调试日志
log_type warning
log_type error
# ==== 性能 ====
# MQTT 协议版本
protocol mqtt
/opt/mosquitto/config/acl
# 访问控制列表
# 只读用户(仅能订阅)
user sensor_read
topic read esp32/+/data
# 控制用户(能发布到特定 Topic)
user controller
topic write esp32/+/control
# 设备用户(仅能操作自己的 Topic)
user esp32_factory_001
topic write esp32_factory_001/#
topic read esp32_factory_001/#
# 管理员(完全访问)
user admin
topic readwrite #
Terminal window
# 创建密码文件(使用 mosquitto_passwd 工具)
sudo mosquitto_passwd -c /opt/mosquitto/config/passwd admin
# 输入密码: ********
# 添加更多用户
sudo mosquitto_passwd /opt/mosquitto/config/passwd esp32_device1
sudo mosquitto_passwd /opt/mosquitto/config/passwd nodered_user
# 密码文件权限
sudo chmod 600 /opt/mosquitto/config/passwd
sudo chown 1883:1883 /opt/mosquitto/config/passwd
// 1. 不要硬编码敏感信息
// ❌ 错误做法
const char* password = "admin123"; // 明文硬编码
// ✅ 正确做法:使用环境变量或安全存储
// 在 PlatformIO 中使用 build_flags
// -DMQTT_PASSWORD=\"${sysenv.MQTT_PASSWORD}\"
// 2. 使用安全的默认配置
void setupSecureDefaults() {
// 默认启用 TLS
espClient.setCACert(rootCACertificate);
// 默认不信任未加密连接
// 如果无法建立 TLS 连接,不上报数据
}
// 3. 实现连接安全状态指示
void showSecurityStatus() {
if (espClient.connected()) {
// 显示连接加密状态
Serial.println("MQTT 连接安全 (TLS 1.3, AES-256-GCM)");
}
}
// 4. 不要泄露敏感信息到日志
// ❌ 错误
Serial.printf("密码: %s\n", mqtt_password);
// ✅ 正确
Serial.println("MQTT 认证凭据已配置(已隐去)");
// OTA 更新的安全实践
void secureOTAUpdate() {
// 1. 仅使用 HTTPS OTA
WiFiClientSecure secureClient;
secureClient.setCACert(rootCACertificate);
// 2. 验证固件签名
// 实现固件哈希校验
if (!verifyFirmwareSignature(firmwareData, firmwareSize)) {
Serial.println("固件签名验证失败,拒绝更新");
return;
}
// 3. 在 OTA 前检查电池和网络
if (WiFi.RSSI() < -70) {
Serial.println("信号太弱,延迟 OTA");
return;
}
}
Terminal window
# 最小权限原则:仅开放必需的端口
# UFW 规则
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 允许 SSH(管理)
sudo ufw allow ssh
# 允许 MQTTS(加密)
sudo ufw allow 8883/tcp
# 禁止明文 MQTT(外网)
# sudo ufw deny 1883/tcp
# 如果内网需要,限制来源
sudo ufw allow from 192.168.0.0/16 to any port 1883 proto tcp
# 启用
sudo ufw enable
Terminal window
# 监控 MQTT 异常流量
# 日志分析: 检查大量连接失败
journalctl -u mosquitto | grep "connection refused" | wc -l
# 监控: 检查异常 Topic 访问
docker logs mosquitto | grep -E "(subscribe|publish) to (unauthorized|unknown)"
# 定期安全审计: 检查用户列表和 ACL
docker exec mosquitto cat /mosquitto/config/passwd
docker exec mosquitto cat /mosquitto/config/acl
Terminal window
# 每日检查
检查 Mosquitto 运行状态
查看错误日志
监控连接设备数量
# 每周检查
检查证书剩余有效期
审查 ACL 规则
分析异常连接尝试
# 每月检查
更新固件版本
密码轮换(高安全环境)
安全审计日志分析
/usr/local/bin/check-cert.sh
#!/bin/bash
# 证书过期监控脚本
DOMAIN="mqtt.example.com"
CERT_FILE="/opt/mosquitto/certs/fullchain.pem"
WARN_DAYS=14
if [ -f "$CERT_FILE" ]; then
EXPIRY=$(openssl x509 -in "$CERT_FILE" -noout -enddate | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY" +%s)
NOW_EPOCH=$(date +%s)
REMAINING=$(( ($EXPIRY_EPOCH - $NOW_EPOCH) / 86400 ))
if [ $REMAINING -lt $WARN_DAYS ]; then
echo "⚠️ 证书将在 $REMAINING 天后过期!"
echo "请运行: sudo certbot renew"
# 可添加通知: email, telegram, etc.
else
echo "✅ 证书有效,剩余 $REMAINING"
fi
else
echo "❌ 证书文件不存在"
fi
发现安全事件
1. 隔离: 关闭外部访问
- ufw deny 8883
- 断开受影响设备
2. 取证: 收集日志和证据
- 保存 Mosquitto 日志
- Wireshark 抓包
- 保存系统日志
3. 分析: 确定攻击向量
- 检查日志中的异常连接
- 分析被访问的 Topic
- 确定受影响范围
4. 恢复: 清理和修复
- 轮换所有密码
- 更新证书(如果需要)
- 更新固件
- 打补丁
5. 改进: 防止再发生
- 更新安全策略
- 增加监控规则
- 安全培训
实践优先级实施建议
TLS 加密🔴 高所有公网 MQTT 必选
用户认证🔴 高禁用匿名访问
ACL 权限🟡 中Topic 级别访问控制
证书监控🟡 中提前 14 天警告
固件签名🟡 中OTA 安全性保障
日志审计🟢 低按需配置

本节总结了 MQTT 安全最佳实践:

  1. Mosquitto 配置:仅加密端口、ACL 权限、禁用匿名
  2. ESP32 代码:TLS 默认开启、不硬编码密码、不泄露敏感信息
  3. 网络安全:防火墙最小权限、异常流量监控
  4. 运维监控:每日/周/月安全检查清单
  5. 事件响应:隔离→取证→分析→恢复→改进闭环流程