防止 systemctl restart mosquitto.service 重置动态安全
Prevent systemctl restart mosquitto.service from resetting Dynamic Security
我正在试用 mosquitto 的动态安全模块,只要我从不 systemctl restart mosquitto.service
,一切似乎都能正常工作。安装 mosquitto 并启用动态安全模块后,我 运行 这两个命令:
mosquitto_ctrl dynsec init /etc/mosquitto/dynamic-security.json steve
systemctl restart mosquitto.service
然后我可以创建用户、角色、订阅和发布主题,如下所示:
mosquitto_ctrl -u steve -P Pass1234 dynsec createClient john0
mosquitto_ctrl -u steve -P Pass1234 dynsec createRole role0
mosquitto_ctrl -u steve -P Pass1234 dynsec addClientRole john0 role0 1
mosquitto_ctrl -u steve -P Pass1234 dynsec addRoleACL role0 publishClientSend pizza allow
mosquitto_ctrl -u steve -P Pass1234 dynsec addRoleACL role0 subscribeLiteral pizza allow
mosquitto_sub -u john0 -P Pass1234 -t pizza
# then open a second terminal window and do this:
mosquitto_pub -u john0 -P Pass1234 -t pizza -m 'hi'
# result is the word `hi` appears in the first/original terminal window
我可以在 pizza
主题上与 john0
用户重复发布和订阅主题。
但是,当我必须重新启动我的服务器时,或者如果我 运行 一个 systemctl restart mosquitto.service
,那么 john0
客户端将不再存在。
如何防止 john0
用户以及所有角色和访问权限在 systemctl restart mosquitto.service
之后消失?
编辑
这是我的 /etc/mosquitto/mosquitto.conf
persistence true
persistence_location /var/lib/mosquitto/
log_dest file /var/log/mosquitto/mosquitto.log
include_dir /etc/mosquitto/conf.d
allow_anonymous false
per_listener_settings false
plugin /usr/lib/x86_64-linux-gnu/mosquitto_dynamic_security.so
plugin_opt_config_file /etc/mosquitto/dynamic-security.json
此外,在我的 /etc/mosquitto/dynamic-security.json
中,唯一存在的记录是 steve
。我在 dynamic-security.json
文件中没有看到任何其他客户端。
编辑
此外,如果我手动编辑 /etc/mosquitto/dynamic-security.json
,它似乎不会立即生效。我需要 运行 systemctl restart mosquitto.service
才能使更改生效。
所以我想现在我的问题是具体如何添加客户端和角色以使其满足所有这些条件:
- 我可以在 运行 时间内添加它们,它们会立即生效,无需
systemctl restart mosquitto.service
。
- 在
systemctl restart mosquitto.service
之后,客户端和角色仍然存在(即它们没有被删除)
Mosquitto 配置为将其动态安全状态存储在 /etc/mosquitto/dynamic-security.json
中。
不幸的是,出于安全原因,/etc/mosquitto
通常无法被 mosquitto 写入。状态通常存储在 /var/lib/mosquitto
中,Mosquitto 可以写入。
要解决此问题,请将配置更改为:
plugin_opt_config_file /var/lib/mosquitto/dynamic-security.json
如果您在 /etc/mosquitto
中已有 dynamic-security.json
文件,您可以将其移动到 /var/lib/mosquitto
并保留其中当前的任何内容:
mv /etc/mosquitto/dynamic-security.json /var/lib/mosquitto
chown mosquitto /var/lib/mosquitto/dynamic-security.json
chmod 700 /var/lib/mosquitto/dynamic-security.json
chown
行确保它归用户 mosquitto
所有 - 如果您 运行 mosquitto
作为其他用户,请将此行更改为您的用户运行它作为。
chmod
行确保只有文件的所有者(和 root)可以读取该文件。即使文件中的密码已加密,我们也不想让攻击者访问它变得比必要的更容易。
我正在试用 mosquitto 的动态安全模块,只要我从不 systemctl restart mosquitto.service
,一切似乎都能正常工作。安装 mosquitto 并启用动态安全模块后,我 运行 这两个命令:
mosquitto_ctrl dynsec init /etc/mosquitto/dynamic-security.json steve
systemctl restart mosquitto.service
然后我可以创建用户、角色、订阅和发布主题,如下所示:
mosquitto_ctrl -u steve -P Pass1234 dynsec createClient john0
mosquitto_ctrl -u steve -P Pass1234 dynsec createRole role0
mosquitto_ctrl -u steve -P Pass1234 dynsec addClientRole john0 role0 1
mosquitto_ctrl -u steve -P Pass1234 dynsec addRoleACL role0 publishClientSend pizza allow
mosquitto_ctrl -u steve -P Pass1234 dynsec addRoleACL role0 subscribeLiteral pizza allow
mosquitto_sub -u john0 -P Pass1234 -t pizza
# then open a second terminal window and do this:
mosquitto_pub -u john0 -P Pass1234 -t pizza -m 'hi'
# result is the word `hi` appears in the first/original terminal window
我可以在 pizza
主题上与 john0
用户重复发布和订阅主题。
但是,当我必须重新启动我的服务器时,或者如果我 运行 一个 systemctl restart mosquitto.service
,那么 john0
客户端将不再存在。
如何防止 john0
用户以及所有角色和访问权限在 systemctl restart mosquitto.service
之后消失?
编辑
这是我的 /etc/mosquitto/mosquitto.conf
persistence true
persistence_location /var/lib/mosquitto/
log_dest file /var/log/mosquitto/mosquitto.log
include_dir /etc/mosquitto/conf.d
allow_anonymous false
per_listener_settings false
plugin /usr/lib/x86_64-linux-gnu/mosquitto_dynamic_security.so
plugin_opt_config_file /etc/mosquitto/dynamic-security.json
此外,在我的 /etc/mosquitto/dynamic-security.json
中,唯一存在的记录是 steve
。我在 dynamic-security.json
文件中没有看到任何其他客户端。
编辑
此外,如果我手动编辑 /etc/mosquitto/dynamic-security.json
,它似乎不会立即生效。我需要 运行 systemctl restart mosquitto.service
才能使更改生效。
所以我想现在我的问题是具体如何添加客户端和角色以使其满足所有这些条件:
- 我可以在 运行 时间内添加它们,它们会立即生效,无需
systemctl restart mosquitto.service
。 - 在
systemctl restart mosquitto.service
之后,客户端和角色仍然存在(即它们没有被删除)
Mosquitto 配置为将其动态安全状态存储在 /etc/mosquitto/dynamic-security.json
中。
不幸的是,出于安全原因,/etc/mosquitto
通常无法被 mosquitto 写入。状态通常存储在 /var/lib/mosquitto
中,Mosquitto 可以写入。
要解决此问题,请将配置更改为:
plugin_opt_config_file /var/lib/mosquitto/dynamic-security.json
如果您在 /etc/mosquitto
中已有 dynamic-security.json
文件,您可以将其移动到 /var/lib/mosquitto
并保留其中当前的任何内容:
mv /etc/mosquitto/dynamic-security.json /var/lib/mosquitto
chown mosquitto /var/lib/mosquitto/dynamic-security.json
chmod 700 /var/lib/mosquitto/dynamic-security.json
chown
行确保它归用户 mosquitto
所有 - 如果您 运行 mosquitto
作为其他用户,请将此行更改为您的用户运行它作为。
chmod
行确保只有文件的所有者(和 root)可以读取该文件。即使文件中的密码已加密,我们也不想让攻击者访问它变得比必要的更容易。