You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 23:02:44