Добрый день!
Если вы не используете TLS как транспортный уровень, то логин-пароль передаются по сети просто текстом, что не очень безопасно.
Как включить TLS на брокере:
http://www.steves-internet-guide.com/mosquitto-tls/
Как использовать mosquitto_sub с TLS:
Как добавить защиту логином и паролем:
http://www.steves-internet-guide.com/mqtt-username-password-example/
Начал с добавления логина и пароля.
Но что-то пошло не так.
-
На компьютере в mosquitto сделал файл с логином “user” и паролем
Создался файлpasswordfile
:
user:$6$xSei+vfRibHo3sRF$+9cm8u1z6B/UaGnd0grgQqR+sLoLjTHzSZ2eqEpcw1QjP2T7OdhjohC/Tz0cj+ka4krIuA8Xqd/E2CplPIYSog==
-
Зашел в /etc/mosquitto/mosquitto.conf
В нем содержится:# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.examplepid_file /var/run/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/log_dest file /var/log/mosquitto/mosquitto.log
include_dir /etc/mosquitto/conf.d
К сожалению подробного описание по адресу /usr/share/doc/mosquitto/examples/mosquitto.conf.example нет.
3. В файле /etc/mosquitto/conf.d/auth.conf, который лежит /mnt/data/etc/mosquitto/conf.d/auth.conf содержится:
acl_file /etc/mosquitto/acl.conf
password_file /etc/mosquitto/passwd.conf
allow_anonymous true
allow_anonymous_localhost true
Я в нем заменил allow_anonymous false
4. В файлы
/mnt/data/etc/mosquitto/acl.conf
/mnt/data/etc/mosquitto/passwd.conf
Которые по умолчанию пустые записал соответственно
user
- в первый файл
user:$6$xSei+vfRibHo3sRF$+9cm8u1z6B/UaGnd0grgQqR+sLoLjTHzSZ2eqEpcw1QjP2T7OdhjohC/Tz0cj+ka4krIuA8Xqd/E2CplPIYSog==
- во второй
5. Перезапустил в контроллере службу командой service mosquitto restart
После этого контроллер начал перезагружаться с периодичностью в 3-5 минут. В момент между перезагрузками стер содержимое файлов из 4 пункта. И перезагрузка прекратилась.
Подскажите, что сделано не так? Как правильно поставить логин и пароль?
Пробовал по другой инструкции установить логин и пароль, но безуспешно:
Открываем файл настроек
sudo nano /etc/mosquitto/mosquitto.conf
и заменяем его содержимое на следующее:
# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example
pid_file /var/run/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/
log_dest topic
log_type error
log_type warning
log_type notice
log_type information
connection_messages true
log_timestamp true
include_dir /etc/mosquitto/conf.d
Добавил логин и пароль:
mosquitto_passwd -c /etc/mosquitto/passwd majordomo
nano /etc/mosquitto/conf.d/default.conf
В пустом файле вписываю:
allow_anonymous false
password_file /etc/mosquitto/passwd
Перезагружаю MQTT сервер
sudo systemctl restart mosquitto
В результате
После чего контроллер начинает перезагружаться как и в предыдущем сценарии.
Как исправить или что делаю не так?
Перезагружается контроллер, скорее всего, из-за https://wirenboard.com/wiki/index.php/Watchdog, его можно отключить.
А фундаментальная причина глубже, и, видимо, такая: наши внутренние сервисы, например, wb-mqtt-serial
, который опрашивает Modbus-устройства и передаёт значения с них в MQTT, тоже пытаются подключиться к брокеру - а он запаролен. При этом в том же wb-mqtt-serial
пароль никак не задать, насколько я знаю.
Поэтому нужно подумать, как сделать так, чтобы локальные сервисы работали с брокером без пароля, а внешние подключения - с паролем.
Я пока придумал только обходной манёвр:
- поднять ещё один брокер, уже с паролем,
- на брокере Wiren Board разрешить только локальные подключения (но без пароля),
- настроить бридж между брокерами.
Вот бы такая возможность была в mosquitto по-умолчанию, очевидная же фича
Ох, стоп! Давайте всё-же посмотрим маны на москито
В терминале наберём
nano /etc/mosquitto/conf.d/auth.conf
а затем поменяем содержимое на
acl_file /etc/mosquitto/acl.conf
password_file /etc/mosquitto/passwd.conf
allow_anonymous false
allow_anonymous_localhost true
Допустим.
- Как правильно поднять второй брокер?
Один mosquitto уже установлен
- Чтоб на WB были только локальные подключения достаточно ли прописать следующее в /mnt/data/etc/mosquitto/conf.d/listeners.conf
#change 0.0.0.0 to to limit listener to localhost
listener 1883 127.0.0.1
example:
#listener 1883 0.0.0.0
#change 0.0.0.0 to 127.0.0.1 to limit listener to localhost
listener 18883 127.0.0.1
protocol websockets
- Как правильно пробросить мост между ними?
На сайте инструкция проброса между контроллером и облаком.
Да не надо вам поднимать второй брокер!
Я чуть выше написал, вам надо в конфиге auth.conf добавить allow_anonymous_localhost true
В этом файле уже была это строчка
Менял только allow_anonymous false
Всё, после этого у вас всё будет в порядке и для локалхоста безпарольное подключение будет доступно.
Посмотрел вашу тему с самого начала. Абсолютно очевидно, что проблема в том, что у вас не стартует сам брокер. При чём тут “mqtt-serial” и локалхост я не знаю.
- service watchdog stop - останавливаем watchdog чтоб вайронсброд не перезагружался (я хз почему этого способа нет в вики)
- nano /etc/mosquitto/passwd.conf пишете туда пользователь:пароль
- mosquitto_passwd -U /etc/mosquitto/passwd.conf - генерим хэш на указанный пароль, начиная с этого этапа пароль будет напоминать кракозябры.
- service mosquitto restart
- смотрим что всё поднялось.
- только после этого service watchdog start
Отлично! Спасибо за помощь
Кстати, переписал статью про watchdog: https://wirenboard.com/wiki/index.php?title=Watchdog
Если к ней остались замечания, пишите.
Да, так лучше. Но единственное что я бы добавил “напишите service watchdog start для того, чтобы запустить его обратно.” Оно вроде как и очевидно, а вроде как инструкции пишутся в том числе для тех, кто не может в очевидное
Здравствуйте.
Произвел действия как в первом посте. Так же проделал операции как рекомендовал PavelSolovev
Собственно вопрос так у меня и остался. Через браузер webUI вижу, все отображается, управлять могу.
А вот в приложении на смартфоне ввожу ip, port, login, passwd - а соединения нет.
Разжуйте, пожалуйста, еще раз как сделать возможным подключение к порту 18883 с приложения.
P.S. IP выделенный, проброс на порт 18883 настроен, внешний порт для доступа к 18883 пингуется и видно что открыт.
Спасибо.
Добрый день. Получилось настроить? Судя по описанию у меня точно такая же проблема
Здравствуйте.
У меня все заработало.
в /etc/mosquitto/conf.d/auth.conf
allow_anonymous false
allow_anonymous_localhost true
@PavelSolovev а подскажите, пожалуйста, в каких манах вы нашли опцию allow_anonymous_localhost
?) Гугл выдает только два результата: эта страница и вики WB (скорее всего поправленная после этого обсуждения). Даже в исходниках mosquitto ничего похожего не нашел🤔
Оно, работает, но совершенно непонятно каким образом.
ага, этот я видел, спасибо. мне интересен именно allow_anonymous_localhost
. откуда берется этот суффикс _localhost
и почему с ним все начинает работать как надо?