Как установить и обезопасить Mosquitto MQTT Messaging Broker в Ubuntu 18.04

Вступление

MQTT - это протокол обмена сообщениями между машинами, предназначенный для облегчения обмена данными по публикации / подписке с устройствами «Интернета вещей». Он обычно используется для геотрекинга транспортных средств, домашней автоматизации, сетей датчиков окружающей среды и сбора данных в масштабах предприятия.

Mosquitto - популярный сервер MQTT (илиbroker, на языке MQTT), который имеет отличную поддержку сообщества и прост в установке и настройке.

В этом руководстве мы установим Mosquitto и настроим нашего брокера на использование SSL для защиты наших защищенных паролем сообщений MQTT.

Предпосылки

Перед началом этого урока вам понадобится:

  • Сервер Ubuntu 18.04 с пользователем без полномочий root, с поддержкой sudo и базовым брандмауэром, как описано вthis Ubuntu 18.04 server setup tutorial.

  • Доменное имя, указывающее на ваш сервер, согласноHow to Set Up a Host Name with DigitalOcean. В этом руководстве будет использоватьсяmqtt.example.com.

  • Автообновляемый SSL-сертификат Let Encrypt для использования с вашим доменом и Mosquitto, созданный с помощью инструмента Certbot. Вы можете узнать, как настроить это вHow To Use Certbot Standalone Mode to Retrieve Let’s Encrypt SSL Certificates on Ubuntu 18.04

    1. Вы можете добавитьsystemctl restart mosquitto какrenew_hook на шаге 4. Убедитесь, что вы используете тот же домен, который был настроен в предыдущем шаге.

[[step-1 -—- install-mosquitto]] == Шаг 1 - Установка Mosquitto

Ubuntu 18.04 имеет довольно свежую версию Mosquitto в своем репозитории программного обеспечения по умолчанию, поэтому мы можем установить ее оттуда.

Сначала войдите в систему под своим пользователем без полномочий root и обновите списки пакетов, используяapt update:

sudo apt update

Теперь установите Mosquitto, используяapt install:

sudo apt install mosquitto mosquitto-clients

По умолчанию Ubuntu запускает службу Mosquitto после установки. Давайте проверим конфигурацию по умолчанию. Мы будем использовать одного из только что установленных клиентов Mosquitto, чтобы подписаться на тему нашего брокера.

Topics - это ярлыки, на которые вы публикуете сообщения и на которые подписываетесь. Они организованы в виде иерархии, например, у вас могут бытьsensors/outside/temp иsensors/outside/humidity. Как вы организуете темы, зависит от вас и ваших потребностей. В этом уроке мы будем использовать простой тестовый раздел для проверки изменений конфигурации.

Войдите на свой сервер второй раз, чтобы у вас было два терминала рядом. В новом терминале используйтеmosquitto_sub, чтобы подписаться на тестовую тему:

mosquitto_sub -h localhost -t test

-h используется для указания имени хоста сервера MQTT, а-t - это имя темы. Вы не увидите вывода после нажатияENTER, потому чтоmosquitto_sub ожидает прибытия сообщений. Вернитесь к другому терминалу и опубликуйте сообщение:

mosquitto_pub -h localhost -t test -m "hello world"

Параметры дляmosquitto_pub такие же, как дляmosquitto_sub, хотя на этот раз мы используем дополнительную опцию-m для указания нашего сообщения. НажмитеENTER, и вы должны увидеть всплывающее окноhello world в другом терминале. Вы отправили свое первое сообщение MQTT!

ВведитеCTRL+C во втором терминале, чтобы выйти изmosquitto_sub, но оставьте соединение с сервером открытым. Мы будем использовать его снова для другого теста в Шаге 5.

Затем мы обеспечим безопасность нашей установки с помощью аутентификации на основе пароля.

[[step-2 -—- configuring-mqtt-passwords]] == Шаг 2 - Настройка паролей MQTT

Давайте настроим Mosquitto для использования паролей. Mosquitto включает утилиту для создания специального файла паролей с именемmosquitto_passwd. Эта команда предложит вам ввести пароль для указанного имени пользователя и поместить результаты в/etc/mosquitto/passwd.

sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy

Теперь мы откроем новый файл конфигурации для Mosquitto и скажем ему использовать этот файл паролей, чтобы требовать входа в систему для всех подключений:

sudo nano /etc/mosquitto/conf.d/default.conf

Это должно открыть пустой файл. Вставьте в следующее:

/etc/mosquitto/conf.d/default.conf

allow_anonymous false
password_file /etc/mosquitto/passwd

Не забудьте оставить завершающий символ новой строки в конце файла.

allow_anonymous false отключит все неаутентифицированные соединения, а строкаpassword_file сообщает Mosquitto, где искать информацию о пользователе и пароле. Сохраните и выйдите из файла.

Теперь нам нужно перезапустить Mosquitto и проверить наши изменения.

sudo systemctl restart mosquitto

Попробуйте опубликовать сообщение без пароля:

mosquitto_pub -h localhost -t "test" -m "hello world"

Сообщение должно быть отклонено:

OutputConnection Refused: not authorised.
Error: The connection was refused.

Прежде чем мы попытаемся снова с паролем, снова переключитесь на второе окно терминала и подпишитесь на тему «test», используя на этот раз имя пользователя и пароль:

mosquitto_sub -h localhost -t test -u "sammy" -P "password"

Стоит подключиться и сидеть, ждать сообщений. Вы можете оставить этот терминал открытым и подключенным до конца учебника, так как мы будем периодически отправлять ему тестовые сообщения.

Теперь опубликуйте сообщение на другом терминале, снова используя имя пользователя и пароль:

mosquitto_pub -h localhost -t "test" -m "hello world" -u "sammy" -P "password"

Сообщение должно пройти как в Шаге 1. Мы успешно добавили защиту паролем в Mosquitto. К сожалению, мы отправляем незашифрованные пароли через Интернет. Мы исправим это дальше, добавив SSL-шифрование в Mosquitto.

[[step-3 -—- configuring-mqtt-ssl]] == Шаг 3 - Настройка MQTT SSL

Чтобы включить шифрование SSL, мы должны сообщить Mosquitto, где хранятся наши сертификаты Let Encrypt. Откройте файл конфигурации, который мы ранее запустили:

sudo nano /etc/mosquitto/conf.d/default.conf

Вставьте следующее в конец файла, оставив две строки, которые мы уже добавили:

/etc/mosquitto/conf.d/default.conf

. . .
listener 1883 localhost

listener 8883
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

Опять же, обязательно оставьте завершающий символ новой строки в конце файла.

Мы добавляем в конфигурацию два отдельных блокаlistener. Первый,listener 1883 localhost, обновляет прослушиватель MQTT по умолчанию на порту1883, к которому мы до сих пор подключались. 1883 - стандартный незашифрованный порт MQTT. Часть строкиlocalhost указывает Mosquitto привязать этот порт только к интерфейсу localhost, поэтому он недоступен извне. Внешние запросы были бы заблокированы нашим брандмауэром в любом случае, но это хорошо, чтобы быть явным.

listener 8883 устанавливает зашифрованный прослушиватель на порт8883. Это стандартный порт для MQTT + SSL, часто называемый MQTTS. Следующие три строки,certfile,cafile иkeyfile, указывают Mosquitto на соответствующие файлы Let’s Encrypt для установки зашифрованных соединений.

Сохраните и выйдите из файла, затем перезапустите Mosquitto, чтобы обновить настройки:

sudo systemctl restart mosquitto

Обновите брандмауэр, чтобы разрешить подключения к порту8883.

sudo ufw allow 8883
OutputRule added
Rule added (v6)

Теперь мы снова тестируем, используяmosquitto_pub, с несколькими разными вариантами SSL:

mosquitto_pub -h mqtt.example.com -t test -m "hello again" -p 8883 --capath /etc/ssl/certs/ -u "sammy" -P "password"

Обратите внимание, что мы используем полное имя хоста вместоlocalhost. Поскольку наш SSL-сертификат выпущен дляmqtt.example.com, если мы попытаемся установить безопасное соединение сlocalhost, мы получим ошибку о том, что имя хоста не соответствует имени хоста сертификата (даже если они оба указывают на один и тот же Mosquitto). сервер).

--capath /etc/ssl/certs/ включает SSL дляmosquitto_pub и сообщает ему, где искать корневые сертификаты. Обычно они устанавливаются вашей операционной системой, поэтому путь для Mac OS, Windows и т. Д. Отличается. mosquitto_pub использует корневой сертификат для проверки того, что сертификат сервера Mosquitto был правильно подписан центром сертификации Let’s Encrypt. Важно отметить, чтоmosquitto_pub иmosquitto_sub не будут пытаться установить SSL-соединение без этой опции (или аналогичной опции--cafile), даже если вы подключаетесь к стандартному безопасному порту8883с.

Если все пройдет успешно, мы увидим, чтоhello again появится в другом терминалеmosquitto_sub. Это означает, что ваш сервер полностью настроен! Если вы хотите расширить протокол MQTT для работы с веб-сокетами, вы можете выполнить последний шаг.

[[step-4 -—- configuring-mqtt-over-websockets-optional]] == Шаг 4. Настройка MQTT через веб-сокеты (необязательно)

Чтобы говорить на MQTT с использованием JavaScript из веб-браузеров, протокол был адаптирован для работы над стандартными веб-сокетами. Если вам не нужны эти функции, вы можете пропустить этот шаг.

Нам нужно добавить еще один блокlistener в нашу конфигурацию Mosquitto:

sudo nano /etc/mosquitto/conf.d/default.conf

В конце файла добавьте следующее:

/etc/mosquitto/conf.d/default.conf

. . .
listener 8083
protocol websockets
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

Опять же, обязательно оставьте завершающий символ новой строки в конце файла.

Это в основном то же самое, что и в предыдущем блоке, за исключением номера порта и строкиprotocol websockets. Нет официального стандартизированного порта для MQTT через веб-сокеты, но8083 является наиболее распространенным.

Сохраните и выйдите из файла, затем перезапустите Mosquitto.

sudo systemctl restart mosquitto

Теперь откройте порт8083 в брандмауэре.

sudo ufw allow 8083

Чтобы протестировать эту функцию, мы будем использовать общедоступный клиент MQTT на основе браузера. Их несколько, ноEclipse Paho JavaScript Client прост и понятен в использовании. Open the Paho client in your browser. Вы увидите следующее:

Paho Client Screen

Заполните информацию о соединении следующим образом:

  • Host должен быть доменом вашего сервера Mosquitto,mqtt.example.com.

  • Port должно быть8083.

  • ДляClientId можно оставить значение по умолчаниюjs-utility-DI1m6.

  • ДляPath можно оставить значение по умолчанию/ws.

  • Username должно быть вашим именем пользователя Mosquitto; здесь мы использовалиsammy.

  • Password должен быть выбранным вами паролем.

Остальные поля могут быть оставлены с их значениями по умолчанию.

После нажатияConnect клиент на базе браузера Paho подключится к вашему серверу Mosquitto.

Чтобы опубликовать сообщение, перейдите на панельPublish Message, заполнитеTopic какtest и введите любое сообщение в разделеMessage. Затем нажмитеPublish. Сообщение появится в вашем терминалеmosquitto_sub.

Заключение

Теперь мы настроили защищенный, защищенный паролем и защищенный SSL MQTT-сервер. Это может служить надежной и безопасной платформой обмена сообщениями для любых проектов, о которых вы мечтаете. Некоторые популярные программные и аппаратные средства, которые хорошо работают с протоколом MQTT, включают:

  • OwnTracks, приложение с открытым исходным кодом для гео-отслеживания, которое вы можете установить на свой телефон. OwnTracks будет периодически сообщать информацию о местоположении на ваш MQTT-сервер, который вы затем сможете хранить и отображать на карте, или создавать оповещения и активировать оборудование IoT в зависимости от вашего местоположения.

  • Node-RED - это графический интерфейс на основе браузера для «связывания» Интернета вещей. Вы перетаскиваете выходные данные одного узла на вход другого и можете направлять информацию через фильтры, между различными протоколами, в базы данных и т. Д. MQTT очень хорошо поддерживается Node-RED.

  • ESP8266 - недорогой микроконтроллер Wi-Fi с возможностями MQTT. Вы можете подключить один из них, чтобы опубликовать данные о температуре в теме, или, возможно, подписаться на тему атмосферного давления и подать звуковой сигнал, когда надвигается гроза!

Это всего лишь несколько популярных примеров из экосистемы MQTT. Существует гораздо больше аппаратного и программного обеспечения, которое говорит на протоколе. Если у вас уже есть любимая аппаратная платформа или программный язык, возможно, у него есть возможности MQTT. Получайте удовольствие, разговаривая друг с другом своими «вещами»!

Related