Защита контроллера паролем, проблемы с wb-gpio

Устанавливаю по инструкции пароль на mqtt
https://wiki.wirenboard.com/wiki/MQTT#Установка_пароля_на_MQTT_брокер
Нашел также тему

Не помогло
В чем проблема - периодически отваливается питание реле и датчиков после перезагрузки контроллера.
Не работает датчик температуры 1W.
Недоступен виджет Discrete I/O и соответствующие топики.

Проблема в том, что даже если мы задаем

listener 1883
allow_anonymous true

то после добавления пользователя в acl файл /etc/mosquitto/acl/default.conf

user mqtt_secured_user
topic readwrite #
topic readwrite $SYS/#

mqtt не позволяет коннектится. Проверяю через программу MQTT Explorer.
Точнее коннект происходит, а топики не отдаются. Отдаются, если только заполнить логин и пароль в настройках коннекта MQTT Explorer.
Соответственно, перестают работать и внутренние процессы, так как не могут авторизоваться в брокере, несмотря на allow_anonymous true

Подскажите, как корректно создать конфиг mosquitto, чтобы работали все внутренние процессы и при этом он не был открыт снаружи?

Еще вопрос к разработчикам внутреннего ПО касательно блока с вебсокет:

# Default Websockets listener.
#
# It is used by Wiren Board Web interface.
#
# It allows anonymous listeners by default to be compatible with
# old Wiren Board mosquitto configuration.
#
# It is recommended to add password authentication for security.

# Changed to localhost-only for security reasons for now

listener 18883 lo
protocol websockets
allow_anonymous true
acl_file /etc/mosquitto/acl/default.conf
password_file /etc/mosquitto/passwd/default.conf

Он же тоже перестает работать, когда добавляется юзер в acl файл, и приходится городить костыль в виде пары логин/пароль в веб-интерфейсе, хотя стоит allow_anonymous true и в инструкции строго настрого так написано оставлять. Если вебсокет слушает только lo-интерфейс, а вы к нему проксируете доступ через nginx, то какой смысл тут использовать строки

acl_file /etc/mosquitto/acl/default.conf
password_file /etc/mosquitto/passwd/default.conf

??

Мне кажется, что более корректным было бы вообще закоментить эти строки и по 1883 и по вебсокет порту.
Кто захочет - добавит слушателей на 1884 и 18884 порты с доступом по паролю и аксесс-листу извне.
Кто захочет запаролить вебинтерфейс - тот одной командой авторизации на nginx закроет доступ к /mqtt и не надо будет каждый раз вводить пароль/логин для подключения к вебсокетам в вебинтерфейсе контроллера.

Нет, не перестает.
Контроллер на 2507.
Файл listner10.conf не меняю.
listner11.conf

listener 1885
allow_anonymous false
acl_file /etc/mosquitto/acl/default.conf
password_file /etc/mosquitto/passwd/default.conf

Создал

mosquitto_passwd -c /etc/mosquitto/passwd/default.conf testuser
Password: 
Reenter password: 

В acl дописываю

user testuser
topic readwrite #
topic readwrite $SYS/#

После перезапуска вижу (как раз по теме вопроса)

Sep 10 17:36:23 wirenboard-AC4U5OVN mosquitto[1449972]: 1757514983: New client connected from 127.0.0.1:34918 as wb-gpio (p2, c0, k60).

Ну и на том же контроллере

mosquitto_sub -v -h 127.0.0.1 -t /# -C 3
/rpc/v1/diag/main/diag 1
/rpc/v1/diag/main/status 1
/rpc/v1/confed/Editor/List 1

с компьютера:

mosquitto_sub -v -h 10.0.0.85 -t /#
Error: Connection refused

И на добавленный listner

mosquitto_sub -v -h 10.0.0.85 -p 1885 -u testuser -P XXXXXX -t /# -C 4
/rpc/v1/db_logger/history/get_channels 1
/rpc/v1/db_logger/history/get_values 1
/rpc/v1/wbrules/Editor/ChangeState 1
/rpc/v1/wbrules/Editor/List 1

Не совсем понимаю… По умолчанию и так доступ снаружи закрыт.

Раз уж меня упомянули - я в результате сделал у себя следующий скрипт конфигурации пароля MQTT (заменить USER и PaSsWoRd на свои):

# отключаем внешний анонимный доступ на 1883 если был включен
sed -i 's/^listener 1883$/listener 1883 127.0.0.1/' /etc/mosquitto/conf.d/10listeners.conf

# создаем неанонимный порт 1884
cat <<'EOF' > /etc/mosquitto/conf.d/11listeners_ext.conf
listener 1884
allow_anonymous false
acl_file /etc/mosquitto/acl/external.conf
password_file /etc/mosquitto/passwd/external.conf
EOF

# задаем права пользователя для 1884
cat <<'EOF' > /etc/mosquitto/acl/external.conf
user USER
topic readwrite #
topic readwrite $SYS/#
EOF

# создаем пользователя
mosquitto_passwd -b -c /etc/mosquitto/passwd/external.conf USER PaSsWoRd
chown mosquitto:mosquitto /etc/mosquitto/passwd/external.conf

systemctl restart mosquitto
1 лайк

По умолчанию 1883 слушает снаружи и на нем разрешен анонимный доступ

По умолчанию с завода открыт доступ на 1883 и на :80/mqtt через прокси nginx
Добавлением 127.0.0.1 закрывается доступ к 1883, но к вебсокетам он остается открыт через конфиг nginx

А, точно, перепроверил.
Это у меня плейбук ansible меняет.

И при добавлении в acl юзера лог уходит в цикл:

Sep 10 15:29:56 wirenboard-AGLPZPUI mosquitto[8078]: 1757518196: New connection from 127.0.0.1:47282 on port 1883.
Sep 10 15:29:56 wirenboard-AGLPZPUI mosquitto[8078]: 1757518196: New client connected from 127.0.0.1:47282 as wb-gpio (p2, c0, k60).
Sep 10 15:29:56 wirenboard-AGLPZPUI mosquitto[8078]: 1757518196: Bad socket read/write on client wb-gpio: Quota exceeded
Sep 10 15:29:57 wirenboard-AGLPZPUI mosquitto[8078]: 1757518197: New connection from 127.0.0.1:47286 on port 1883.
Sep 10 15:29:57 wirenboard-AGLPZPUI mosquitto[8078]: 1757518197: New client connected from 127.0.0.1:47286 as wb-gpio (p2, c0, k60).
Sep 10 15:29:57 wirenboard-AGLPZPUI mosquitto[8078]: 1757518197: Bad socket read/write on client wb-gpio: Quota exceeded

Там и так lo.

Рекомендую все ж проверить - с компьютера и с контроллера. Используя mosquitto_sub.

Проверил.
Сбросил контроллер к заводским, используя 202508111043_wb-2507_bullseye_wb7x.fit
выполнил следующее сразу после перезагрузки: (добавил пользователя, слушателя не менял)

root@wirenboard-AGLPZPUI:~# mosquitto_sub -v -h 127.0.0.1 -t /# -C 3
/devices/wb-gpio/meta {"driver":"wb-gpio","title":{"en":"Discrete I/O"}}
/devices/wb-gpio/meta/driver wb-gpio
/devices/wb-gpio/meta/name Discrete I/O
root@wirenboard-AGLPZPUI:~# ^C
root@wirenboard-AGLPZPUI:~# mosquitto_passwd -c /etc/mosquitto/passwd/default.conf testuser
Password:
Reenter password:
Warning: File /mnt/data/etc/mosquitto/passwd/default.conf owner is not root. Future versions will refuse to load this file.To fix this, use `chown root /mnt/data/etc/mosquitto/passwd/default.conf`.Warning: File /mnt/data/etc/mosquitto/passwd/default.conf group is not root. Future versions will refuse to load this file.root@wirenboard-AGLPZPUI:~# nano /etc/mosquitto/acl/default.conf
root@wirenboard-AGLPZPUI:~# nano /etc/mosquitto/acl/default.conf
root@wirenboard-AGLPZPUI:~# cat /etc/mosquitto/acl/default.conf
user testuser
topic readwrite #
topic readwrite $SYS/#
root@wirenboard-AGLPZPUI:~# systemctl restart mosquitto
root@wirenboard-AGLPZPUI:~# mosquitto_sub -v -h 127.0.0.1 -t /# -C 3
^Croot@wirenboard-AGLPZPUI:~# mosquitto_sub -v -h 127.0.0.1 -p 1883 -u testuser -P test -t /# -C 4
/rpc/v1/db_logger/history/get_values 1
/rpc/v1/db_logger/history/get_channels 1
/rpc/v1/wb_logs/logs/List 1
/rpc/v1/wb_logs/logs/Load 1
root@wirenboard-AGLPZPUI:~#

То есть, просто добавляя testuser в acl файл, не меняя конфиг слушателя, поведение ломается. Диагностический файл прилагаю.

приложен диагностический архив, доступен только сотрудникам поддержки
(164,1 КБ)

Да, отличный вариант.
Я сначала хотел комментить строки в 10listeners и добавлять в него же своих запароленных слушателей, но с вашим решением это сделать гораздо проще.
Тем более, что можно у себя подготовить
/etc/mosquitto/acl/external.conf
/etc/mosquitto/passwd/external.conf
/etc/mosquitto/conf.d/11listeners_ext.conf и просто копировать их на контроллер при инсталляции вместе с другими файлами

Sep 10 15:52:46 wirenboard-AGLPZPUI mosquitto[4569]: 1757519566: Config loaded from /etc/mosquitto/mosquitto.conf.
Sep 10 15:52:46 wirenboard-AGLPZPUI mosquitto[4569]: 1757519566: Error: Invalid line in acl_file "/etc/mosquitto/acl/default.conf": testuser.
Sep 10 15:52:46 wirenboard-AGLPZPUI mosquitto[4569]: 1757519566: Error opening acl file "/etc/mosquitto/acl/default.conf".
Sep 10 15:52:46 wirenboard-AGLPZPUI systemd[1]: mosquitto.service: Main process exited, code=exited, status=3/NOTIMPLEMENTED

А что за запись такая в файле?
У меня что-то создается впечатление что редактируете файлы какой-то странной командой, причем по сети и с хоста на котором ужасно настроена кодировка. Лучше так не надо делать…

А где оригниальные, дефолтные разрешения описанные в файле?

Пожалуйста - прочитайте документацию к mosquitto.

это запись когда я по ошибке написал вместо “user testuser” просто “testuser” в первой строке acl файла. Естественно, mosquitto не запустился, я ее исправил и он стартанул.
Редактирую я командой nano через putty с виндовса.

Что вы имеете в виду? файл /etc/mosquitto/acl/default.conf ?
Его вывод приведен выше, могу его повторить тут:

root@wirenboard-AGLPZPUI:~# cat /etc/mosquitto/acl/default.conf
user testuser
topic readwrite #
topic readwrite $SYS/#

он совпадает с тем, что указан в вашей инструкции и отличается от оригинального после прошивки только строкой “user testuser”.

Я специально сделал сброс на заводские настройки, и все действия, что я сделал это добавил пользователя и задал его в /etc/mosquitto/acl/default.conf по вашей инструкции.

Вопроса у меня теперь два:

  1. Почему у вас работает gpio при добавлении user testuser, а у меня даже после сброса не работает? Я могу предоставить доступ к контроллеру через облако. Эта ситуация у меня случалась и с другими контроллерами, поэтому я хотел бы понять, в чем дело.
  2. Если при добавлении user testuser перед топиками закрывает к ним доступ, согласно документации mosquitto, несмотря на анонимный доступ, то стоит обновить инструкцию, и управлять доступом через отдельные файлы, как это делает Korden