Mosquitto 完整安全配置指南
以下是一份可直接用于生产环境的完整配置,涵盖密码认证、ACL权限控制、TLS/SSL加密。
一、配置架构总览
/etc/mosquitto/
├── mosquitto.conf # 主配置文件(引用所有子配置)
├── conf.d/
│ ├── listener.conf # 监听器配置
│ ├── auth.conf # 密码认证配置
│ ├── acl.conf # ACL 权限配置
│ ├── tls.conf # TLS/SSL 加密配置
│ └── performance.conf # 性能优化配置
├── passwd # 密码文件
├── aclfile # ACL 权限文件
└── certs/
├── ca.crt # CA 证书
├── server.crt # 服务器证书
└── server.key # 服务器私钥
二、安装 Mosquitto
# 安装
sudo apt update
sudo apt install mosquitto mosquitto-clients -y
# 验证
sudo systemctl status mosquitto
三、生成 TLS 证书
3.1 创建证书目录
sudo mkdir -p /etc/mosquitto/certs
cd /etc/mosquitto/certs
3.2 生成 CA 根证书
# 生成 CA 私钥
sudo openssl genrsa -out ca.key 2048
# 生成 CA 证书(有效期 10 年)
sudo openssl req -new -x509 -days 3650 -key ca.key -out ca.crt \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=MQTT-CA"
3.3 生成服务器证书
# 生成服务器私钥
sudo openssl genrsa -out server.key 2048
# 生成证书签名请求
sudo openssl req -new -key server.key -out server.csr \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=mqtt.example.com"
# 签发服务器证书(有效期 1 年)
sudo openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out server.crt -days 365
3.4 生成客户端证书(可选,双向 TLS 用)
# 生成客户端私钥
sudo openssl genrsa -out client.key 2048
# 生成客户端证书签名请求
sudo openssl req -new -key client.key -out client.csr \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=client_device_001"
# 签发客户端证书
sudo openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out client.crt -days 365
3.5 设置证书权限
sudo chmod 600 server.key client.key
sudo chown -R mosquitto:mosquitto /etc/mosquitto/certs
四、创建密码文件
4.1 添加用户
# 创建密码文件并添加第一个用户(-c 表示创建新文件)
sudo mosquitto_passwd -c /etc/mosquitto/passwd admin
# 添加更多用户(不需要 -c)
sudo mosquitto_passwd /etc/mosquitto/passwd sensor_001
sudo mosquitto_passwd /etc/mosquitto/passwd sensor_002
sudo mosquitto_passwd /etc/mosquitto/passwd mobile_app
sudo mosquitto_passwd /etc/mosquitto/passwd guest
# 设置安全权限
sudo chmod 600 /etc/mosquitto/passwd
sudo chown mosquitto:mosquitto /etc/mosquitto/passwd
4.2 验证密码文件
# 查看用户列表(密码是加密的)
sudo cat /etc/mosquitto/passwd
五、创建 ACL 权限文件
sudo nano /etc/mosquitto/aclfile
# ================================================================
# Mosquitto ACL 权限配置文件
# ================================================================
#
# 语法说明:
# user <用户名> - 指定后续规则属于哪个用户
# topic [read|write|readwrite|deny] <主题过滤器>
# pattern [read|write|readwrite|deny] <动态模式>
#
# 权限说明:
# read = 订阅权限
# write = 发布权限
# readwrite = 发布 + 订阅
# deny = 拒绝(优先级最高)
#
# 动态变量:
# %u = 当前用户名
# %c = 当前客户端 ID
# ================================================================
# ================================================================
# 第一部分:全局黑名单(最高优先级)
# ================================================================
# 禁止任何人访问系统主题
topic deny $SYS/#
# 禁止任何人访问管理员主题
topic deny admin/#
# 禁止任何人访问敏感配置主题
topic deny config/secret/#
# ================================================================
# 第二部分:管理员用户(全部权限)
# ================================================================
user admin
topic readwrite #
topic readwrite $SYS/broker/clients/connected
topic readwrite $SYS/broker/load/#
# ================================================================
# 第三部分:传感器设备(只发布,不订阅)
# ================================================================
# 传感器 001
user sensor_001
topic write sensors/temperature/001/data
topic write sensors/humidity/001/data
topic write sensors/status/001
# 传感器 002
user sensor_002
topic write sensors/temperature/002/data
topic write sensors/humidity/002/data
topic write sensors/status/002
# 通用传感器权限(使用 pattern 动态匹配)
# 用户 sensor_xxx 自动拥有 sensors/xxx/# 的写入权限
pattern write sensors/%u/#
# ================================================================
# 第四部分:手机 APP(发布命令 + 订阅响应)
# ================================================================
user mobile_app
# 发布控制命令
topic write cmd/light/+
topic write cmd/ac/+
topic write cmd/lock/+
# 订阅状态更新
topic read telemetry/+/status
topic read telemetry/+/temperature
topic read notification/+
# 订阅自己的命令响应
topic read response/+
# 通配符批量授权
topic read home/+/+/status
# ================================================================
# 第五部分:访客用户(只读公开主题)
# ================================================================
user guest
topic read public/#
topic read weather/#
topic read news/#
# 访客禁止写入
topic deny write #
# ================================================================
# 第六部分:动态设备授权(高级用法)
# ================================================================
# 为每个设备自动分配专属主题
# 例如:client_id=device_001 自动拥有 devices/device_001/telemetry 的写入权限
pattern write devices/%c/telemetry
pattern write devices/%c/status
pattern read devices/%c/config
pattern read devices/%c/command/+
# 为每个用户自动分配专属主题
# 例如:username=alice 自动拥有 user/alice/outbox 的写入权限
pattern write user/%u/outbox
pattern read user/%u/inbox
# ================================================================
# 第七部分:审计日志用户(只读监控主题)
# ================================================================
user auditor
topic read $SYS/broker/#
topic read telemetry/+/status
topic read devices/+/status
# ================================================================
# 第八部分:规则优先级说明
# ================================================================
#
# 1. deny 规则 > allow 规则(拒绝优先)
# 2. 特定用户规则 > 全局规则
# 3. 规则按顺序匹配,先匹配到的生效
# 4. 未匹配到任何规则 = 无权限(拒绝)
#
# 测试命令:
# mosquitto_sub -h localhost -t "test" -u 用户名 -P 密码
# mosquitto_pub -h localhost -t "test" -m "hello" -u 用户名 -P 密码
# ================================================================
六、创建配置文件
6.1 主配置文件(引用所有子配置)
sudo tee /etc/mosquitto/mosquitto.conf << 'EOF'
# ================================================================
# Mosquitto 主配置文件
# ================================================================
# 包含所有子配置
include_dir /etc/mosquitto/conf.d
# 基础运行配置
user mosquitto
connection_messages true
log_timestamp true
log_timestamp_format %Y-%m-%dT%H:%M:%S
# 持久化配置
persistence true
persistence_location /var/lib/mosquitto/
persistence_file mosquitto.db
autosave_interval 300
autosave_on_changes false
store_retained_messages true
# 日志配置(基础)
log_dest file /var/log/mosquitto/mosquitto.log
log_dest syslog
log_type error
log_type warning
log_type notice
log_type information
# 禁用订阅/取消订阅日志(减少日志量)
# log_type subscribe
# log_type unsubscribe
# PID 文件
pid_file /run/mosquitto/mosquitto.pid
EOF
6.2 监听器配置
sudo tee /etc/mosquitto/conf.d/listener.conf << 'EOF'
# ================================================================
# 监听器配置
# ================================================================
# ---------- 内网监听(明文,仅内网访问) ----------
listener 1883 192.168.1.10
# 可选:限制内网连接数
max_connections 1000
# ---------- 公网监听(TLS 加密) ----------
listener 8883 0.0.0.0
max_connections 5000
# ---------- WebSocket 监听(浏览器客户端) ----------
listener 8083 0.0.0.0
protocol websockets
max_connections 500
# ---------- WebSocket Secure(加密) ----------
listener 8084 0.0.0.0
protocol websockets
max_connections 500
# ---------- 本地管理端口(仅本机) ----------
listener 1884 127.0.0.1
max_connections 5
EOF
6.3 安全认证配置
sudo tee /etc/mosquitto/conf.d/auth.conf << 'EOF'
# ================================================================
# 安全认证配置
# ================================================================
# 禁止匿名访问(生产环境必须)
allow_anonymous false
# 密码文件路径
password_file /etc/mosquitto/passwd
# 每个客户端只能有一个连接
# per_listener_settings false
EOF
6.4 ACL 权限配置
sudo tee /etc/mosquitto/conf.d/acl.conf << 'EOF'
# ================================================================
# ACL 权限配置
# ================================================================
# ACL 文件路径
acl_file /etc/mosquitto/aclfile
# 允许空密码(安全起见,保持 false)
# allow_zero_length_clientid false
EOF
6.5 TLS/SSL 加密配置
sudo tee /etc/mosquitto/conf.d/tls.conf << 'EOF'
# ================================================================
# TLS/SSL 加密配置
# ================================================================
# ---------- TLS 加密(公网监听器 8883 使用) ----------
# 注意:listener 8883 已在 listener.conf 中定义
# 服务器证书和私钥
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
# CA 证书(验证客户端证书用)
cafile /etc/mosquitto/certs/ca.crt
# TLS 版本(推荐 tlsv1.2 或 tlsv1.3)
tls_version tlsv1.2
# 加密套件(推荐安全套件)
ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256
# ---------- 双向 TLS(客户端也需要提供证书) ----------
# 取消注释以下行以启用双向 TLS
# require_certificate true
# use_identity_as_username true
# ---------- WebSocket Secure(8084 端口) ----------
# 注意:listener 8084 已在 listener.conf 中定义
# WebSocket 使用相同的证书文件
EOF
6.6 性能优化配置
sudo tee /etc/mosquitto/conf.d/performance.conf << 'EOF'
# ================================================================
# 性能优化配置
# ================================================================
# ---------- 连接限制 ----------
max_connections 10000
# ---------- 消息队列 ----------
max_inflight_messages 20
max_queued_messages 1000
queue_qos0_messages true
# ---------- 内存限制 ----------
memory_limit 256
# ---------- 网络缓冲区 ----------
socket_recv_buffer 65536
socket_send_buffer 65536
# ---------- 超时配置 ----------
max_keepalive 65535
# ---------- WebSocket ----------
websockets_log_level 0
# ---------- 服务端通知 ----------
# connection_messages true
EOF
七、设置文件权限
# 设置所有配置文件的权限
sudo chown -R mosquitto:mosquitto /etc/mosquitto/
sudo chmod 644 /etc/mosquitto/mosquitto.conf
sudo chmod 644 /etc/mosquitto/conf.d/*.conf
sudo chmod 600 /etc/mosquitto/passwd
sudo chmod 644 /etc/mosquitto/aclfile
sudo chmod 600 /etc/mosquitto/certs/*.key
sudo chmod 644 /etc/mosquitto/certs/*.crt
# 创建日志文件
sudo touch /var/log/mosquitto/mosquitto.log
sudo chown mosquitto:mosquitto /var/log/mosquitto/mosquitto.log
sudo chmod 640 /var/log/mosquitto/mosquitto.log
八、配置语法检查与启动
8.1 检查配置语法
# 检查主配置
sudo mosquitto -c /etc/mosquitto/mosquitto.conf --test-check
# 正常输出示例:
# Config loaded from /etc/mosquitto/mosquitto.conf.
# Configuration check passed.
8.2 启动服务
# 重启服务加载新配置
sudo systemctl restart mosquitto
# 检查状态
sudo systemctl status mosquitto
# 查看日志
sudo journalctl -u mosquitto -f
8.3 检查端口监听
# 检查所有端口
sudo ss -tlnp | grep mosquitto
# 预期输出:
# LISTEN 0 4096 0.0.0.0:8883 0.0.0.0:* users:(("mosquitto",pid=xxx))
# LISTEN 0 4096 0.0.0.0:8083 0.0.0.0:* users:(("mosquitto",pid=xxx))
# LISTEN 0 4096 0.0.0.0:8084 0.0.0.0:* users:(("mosquitto",pid=xxx))
# LISTEN 0 4096 192.168.1.10:1883 0.0.0.0:* users:(("mosquitto",pid=xxx))
# LISTEN 0 4096 127.0.0.1:1884 0.0.0.0:* users:(("mosquitto",pid=xxx))
九、客户端连接测试
9.1 内网连接(明文,1883 端口)
# 测试发布
mosquitto_pub -h 192.168.1.10 -p 1883 \
-t "sensors/temperature/001/data" \
-m '{"value":23.5,"unit":"celsius"}' \
-u sensor_001 -P 密码
# 测试订阅
mosquitto_sub -h 192.168.1.10 -p 1883 \
-t "telemetry/+/status" \
-u mobile_app -P 密码 -v
9.2 公网 TLS 连接(加密,8883 端口)
# 订阅(单向 TLS)
mosquitto_sub -h mqtt.example.com -p 8883 \
-t "telemetry/+/status" \
-u mobile_app -P 密码 \
--cafile /etc/mosquitto/certs/ca.crt \
-v
# 发布
mosquitto_pub -h mqtt.example.com -p 8883 \
-t "cmd/light/livingroom" \
-m "on" \
-u mobile_app -P 密码 \
--cafile /etc/mosquitto/certs/ca.crt
9.3 双向 TLS 连接(需提供客户端证书)
# 双向 TLS 订阅
mosquitto_sub -h mqtt.example.com -p 8883 \
-t "devices/device_001/command/+" \
--cafile /etc/mosquitto/certs/ca.crt \
--cert /etc/mosquitto/certs/client.crt \
--key /etc/mosquitto/certs/client.key \
-v
9.4 WebSocket 连接
# 使用 wscat 测试 WebSocket
npm install -g wscat
wscat -c "ws://mqtt.example.com:8083" -H "username: mobile_app" -H "password: 密码"
十、ACL 权限验证测试
10.1 测试传感器发布权限
# ✅ 传感器 001 发布到自己的主题(应该成功)
mosquitto_pub -h localhost -t "sensors/temperature/001/data" \
-m "23.5" -u sensor_001 -P 密码
# ❌ 传感器 001 发布到其他主题(应该失败)
mosquitto_pub -h localhost -t "sensors/temperature/002/data" \
-m "23.5" -u sensor_001 -P 密码
# 预期:Connection Refused: not authorised
10.2 测试 App 发布命令和订阅响应
# ✅ App 发布命令(应该成功)
mosquitto_pub -h localhost -t "cmd/light/livingroom" \
-m "on" -u mobile_app -P 密码
# ✅ App 订阅状态(应该成功)
mosquitto_sub -h localhost -t "telemetry/+/status" \
-u mobile_app -P 密码 -C 1 -W 2
# ❌ App 尝试写入系统主题(应该失败)
mosquitto_pub -h localhost -t "$SYS/broker/version" \
-m "test" -u mobile_app -P 密码
# 预期:Connection Refused: not authorised
10.3 测试访客权限
# ✅ 访客读取公开主题(应该成功)
mosquitto_sub -h localhost -t "public/news" \
-u guest -P 密码 -C 1 -W 2
# ❌ 访客尝试写入(应该失败)
mosquitto_pub -h localhost -t "public/news" \
-m "test" -u guest -P 密码
# 预期:Connection Refused: not authorised
十一、常见问题排查
| 问题 | 检查项 | 解决方案 |
|---|---|---|
| 无法连接 8883 | TLS 证书是否正确 | 检查证书路径和权限 |
| 认证失败 | 密码是否正确 | 用 mosquitto_passwd -v 验证 |
| ACL 拒绝 | 用户权限是否匹配 | 检查 aclfile 中的规则顺序 |
| 证书过期 | 检查证书有效期 | openssl x509 -in server.crt -noout -dates |
| 端口未监听 | 配置是否加载 | 查看日志:journalctl -u mosquitto -f |
十二、配置清单汇总
# 查看所有配置文件
ls -la /etc/mosquitto/
ls -la /etc/mosquitto/conf.d/
# 确认以下文件都存在:
# /etc/mosquitto/mosquitto.conf
# /etc/mosquitto/conf.d/listener.conf
# /etc/mosquitto/conf.d/auth.conf
# /etc/mosquitto/conf.d/acl.conf
# /etc/mosquitto/conf.d/tls.conf
# /etc/mosquitto/conf.d/performance.conf
# /etc/mosquitto/passwd
# /etc/mosquitto/aclfile
# /etc/mosquitto/certs/ca.crt
# /etc/mosquitto/certs/server.crt
# /etc/mosquitto/certs/server.key
总结
| 安全层 | 配置项 | 状态 |
|---|---|---|
| 身份认证 | password_file | ✅ 已配置 |
| 匿名访问 | allow_anonymous false | ✅ 已禁用 |
| 权限控制 | acl_file | ✅ 已配置 |
| 传输加密 | TLS 8883 端口 | ✅ 已配置 |
| 内网隔离 | 1883 绑定内网 IP | ✅ 已配置 |
| 证书权限 | 600 私钥权限 | ✅ 已配置 |
| 防火墙 | 仅开放必要端口 | 需自行配置 |