如何配置Mosquitto动态安全插件,使订阅未授权主题的客户端断开连接?
Mosquitto动态安全插件:未授权订阅时强制断开客户端连接
当前配置
listener 1883 allow_anonymous true per_listener_settings false plugin /usr/lib/mosquitto_dynamic_security.so plugin_opt_config_file /mosquitto/config/dynamic-security.json
问题现象
需实现客户端尝试订阅未授权主题时立即断开连接,但当前Broker未拒绝订阅请求,反而返回SUBACK,仅后续发布操作被拒绝。相关日志:
1689767044: Received SUBSCRIBE from testDyn1689766685806 1689767044: asd/qw (QoS 0) 1689767044: Sending SUBACK to testDyn1689766685806 1689767044: Received PINGREQ from f676724b-e1d6-4770-b37c 1689767044: Sending PINGRESP to f676724b-e1d6-4770-b37c 1689767050: Denied PUBLISH from testDyn1689766685806 (d0, q0, r0, m0, 'asd/as', ... (3 bytes)) 1689767050: Denied PUBLISH from testDyn1689766685806 (d0, q0, r0, m0, 'asd/as', ... (3 bytes))
解决方案
1. 调整Mosquitto主配置
- 将
allow_anonymous设为false:开启身份验证,确保所有客户端都受动态安全插件管控 - 将
per_listener_settings设为true:允许针对监听器单独配置权限规则
修改后的配置:
listener 1883 allow_anonymous false per_listener_settings true plugin /usr/lib/mosquitto_dynamic_security.so plugin_opt_config_file /mosquitto/config/dynamic-security.json
2. 配置动态安全插件规则
使用mosquitto_ctrl工具配置插件,启用未授权断开功能,并设置严格的订阅权限:
启用未授权操作断开
mosquitto_ctrl dynsec setGlobalConfig disconnect_on_unauthorized true
配置角色订阅权限
先添加拒绝所有主题订阅的规则(低优先级),再添加允许的特定主题规则(高优先级,覆盖拒绝规则)。假设客户端所属角色为testRole:
# 拒绝所有未授权主题的订阅请求 mosquitto_ctrl dynsec addRoleACL testRole subscribe deny "#" # 允许订阅指定授权主题 mosquitto_ctrl dynsec addRoleACL testRole subscribe allow "your/authorized/topic/#"
3. 验证效果
重启Mosquitto服务后,测试未授权订阅:
mosquitto_sub -h localhost -p 1883 -u testDyn1689766685806 -P your_password -t "asd/qw"
此时日志会显示Broker拒绝订阅请求并断开客户端连接。
内容的提问来源于stack exchange,提问作者Mohammed Mahmoud
相关产品推荐
相关产品推荐

