Как установить и обезопасить брокера обмена сообщениями Mosquitto MQTT на Debian 9

Вступление

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

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

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

Предпосылки

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

  • Сервер Debian 9 с пользователем без полномочий root, пользователем sudo и базовым брандмауэром, как описано в https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-9[this Учебное пособие по настройке сервера Debian 9.

  • Доменное имя, указывающее на ваш сервер, как описано в нашей DigitalOcean документации по DNS-продуктам. Этот урок будет использовать ++ повсюду.

  • Автообновляемый SSL-сертификат Let Encrypt для использования с вашим доменом и Mosquitto, созданный с помощью инструмента Certbot. Вы можете узнать, как настроить это в https://www.digitalocean.com/community/tutorials/how-to-use-certbot-standalone-mode-to-retrieve-let-s-encrypt-ssl-certificates-on -debian-9 [Как использовать Certbot в автономном режиме для получения давайте зашифруем SSL-сертификаты в Debian 9
    ]. Вы можете добавить + systemctl restart mosquitto + как + renew_hook + на шаге 4. Убедитесь, что вы используете тот же домен, который был настроен в предыдущем шаге.

Шаг 1 - Установка Mosquitto

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

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

sudo apt update

Теперь установите Mosquitto с помощью + apt install:

sudo apt install mosquitto mosquitto-clients

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

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

Войдите на свой сервер второй раз, чтобы у вас было два терминала рядом. В новом терминале используйте + 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.

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

Шаг 2 - Настройка паролей MQTT

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

sudo mosquitto_passwd -c /etc/mosquitto/passwd

Теперь мы откроем новый файл конфигурации для 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 "" -P ""

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

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

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

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

Шаг 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//cert.pem
cafile /etc/letsencrypt/live//chain.pem
keyfile /etc/letsencrypt/live//privkey.pem

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

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

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

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

sudo systemctl restart mosquitto

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

sudo ufw allow 8883
OutputRule added
Rule added (v6)

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

mosquitto_pub -h  -t test -m "hello again" -p 8883 --capath /etc/ssl/certs/ -u "" -P ""

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

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

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

Шаг 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//cert.pem
cafile /etc/letsencrypt/live//chain.pem
keyfile /etc/letsencrypt/live//privkey.pem

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

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

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

sudo systemctl restart mosquitto

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

sudo ufw allow 8083

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

изображение: http: //assets.digitalocean.com/articles/mosquitto/paho.png [экран клиента Paho]

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

  • * Host * должен быть доменом для вашего сервера Mosquitto, ++.

  • * Порт * должен быть + 8083 +.

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

  • * Путь * можно оставить равным значению по умолчанию * / ws *.

  • * Имя пользователя * должно быть вашим именем пользователя Mosquitto; здесь мы использовали * Сэмми *.

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

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

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

Чтобы опубликовать сообщение, перейдите на панель * Опубликовать сообщение *, заполните * Тема * как * тест * и введите любое сообщение в разделе * Сообщение *. Далее нажмите * Опубликовать *. Сообщение появится в вашем терминале + mosquitto_sub.

Заключение

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

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

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

  • Https://espressif.com/en/products/hardware/esp8266ex/overview[ESP8266] - недорогой Wi-Fi микроконтроллер с возможностями MQTT. Вы можете подключить один из них, чтобы опубликовать данные о температуре в теме, или, возможно, подписаться на тему атмосферного давления и подать звуковой сигнал, когда надвигается гроза!

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

Related