Поиск по сайту:

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


Введение

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

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

В этом руководстве мы установим Mosquitto, получим SSL-сертификаты от Let’s Encrypt и настроим нашего брокера на использование SSL для защиты наших защищенных паролем соединений MQTT.

Предпосылки

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

  • Сервер Ubuntu 16.04 с пользователем без полномочий root, с поддержкой sudo и базовой настройкой брандмауэра, как подробно описано в этом руководстве по настройке сервера Ubuntu 16.04.
  • Доменное имя, указывающее на ваш сервер, в соответствии с инструкциями по настройке имени хоста в DigitalOcean. В этом руководстве будет использоваться mqtt.example.com.

Шаг 1 — Установка Москита

Ubuntu 16.04 имеет довольно свежую версию Mosquitto в репозитории программного обеспечения по умолчанию. Войдите под своим обычным пользователем и установите Mosquitto с помощью apt-get.

  1. sudo apt-get install mosquitto mosquitto-clients

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

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

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

  1. mosquitto_sub -h localhost -t test

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

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

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

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

Далее мы защитим нашу установку с помощью SSL, используя Certbot, новый клиент Let’s Encrypt.

Шаг 2 — Установка Certbot для сертификатов Let’s Encrypt

Let’s Encrypt — это новый сервис, предлагающий бесплатные SSL-сертификаты через автоматизированный API. Есть много клиентов, которые могут общаться с API, и Ubuntu включает официальный клиент в свой репозиторий по умолчанию, но он немного устарел и не имеет одной важной функции, которая нам нужна.

Вместо этого мы установим официальный клиент из Ubuntu PPA или Personal Package Archive. Это альтернативные репозитории, которые упаковывают более новое или малоизвестное программное обеспечение. Сначала добавьте репозиторий.

  1. sudo add-apt-repository ppa:certbot/certbot

Вам нужно будет нажать ENTER, чтобы принять. После этого обновите список пакетов, чтобы получить информацию о пакете нового репозитория.

  1. sudo apt-get update

И, наконец, установите официальный клиент Let’s Encrypt под названием certbot.

  1. sudo apt-get install certbot

Теперь, когда у нас установлен certbot, давайте запустим его, чтобы получить наш сертификат.

Шаг 3 — Запуск Certbot

certbot должен ответить на криптографический вызов, выданный Let’s Encrypt API, чтобы доказать, что мы контролируем наш домен. Для этого используются порты 80 (HTTP) и/или 443 (HTTPS). Мы будем использовать только порт 80, поэтому давайте сейчас разрешим входящий трафик на этот порт:

  1. sudo ufw allow http
Output
Rule added

Теперь мы можем запустить Certbot, чтобы получить наш сертификат. Мы будем использовать параметр --standalone, чтобы сообщить Certbot обработать HTTP-запрос самостоятельно, а --standalone-supported-challenges http-01 ограничивает связь. на порт 80. -d используется для указания домена, для которого вы хотите получить сертификат, и certonly указывает Certbot просто получить сертификат, не выполняя никаких других действий по настройке.

  1. sudo certbot certonly --standalone --standalone-supported-challenges http-01 -d mqtt.example.com

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

Мы получили свои сертификаты. Теперь нам нужно убедиться, что Certbot автоматически продлевает их, когда срок их действия подходит к концу.

Шаг 4 — Настройка автоматического продления Certbot

Сертификаты Let’s Encrypt действительны только в течение девяноста дней. Это сделано для того, чтобы пользователи автоматизировали процесс обновления своих сертификатов. Нам нужно настроить регулярно запускаемую команду для проверки сертификатов с истекающим сроком действия и их автоматического обновления.

Чтобы запускать проверку обновления ежедневно, мы будем использовать cron, стандартную системную службу для запуска периодических заданий. Мы сообщаем cron, что делать, открывая и редактируя файл с именем crontab.

  1. sudo crontab -e

Вам будет предложено выбрать текстовый редактор. Выберите свой любимый, и вам будет представлен crontab по умолчанию, в котором есть текст справки. Вставьте следующую строку в конец файла, затем сохраните и закройте его.

. . .
15 3 * * * certbot renew --noninteractive --post-hook "systemctl restart mosquitto"

Часть 15 3 * * * в этой строке означает «выполнять следующую команду в 3:15 утра каждый день». Команда renew для Certbot будет проверять все сертификаты. установленных в системе, и обновить те, срок действия которых истекает менее чем за тридцать дней. --noninteractive указывает Certbot не ждать ввода данных пользователем.

--post-hook systemctl restart mosquitto перезапустит Mosquitto, чтобы получить новый сертификат, но только если сертификат был обновлен. Эта функция post-hook — это то, чего не хватало в старых версиях клиента Let’s Encrypt, и почему мы установили его из репозитория PPA, а не из репозитория Ubuntu по умолчанию. Без него нам пришлось бы перезапускать Mosquitto каждый день, даже если на самом деле никакие сертификаты не обновлялись. Хотя ваши клиенты MQTT должны быть настроены на автоматическое повторное подключение, разумно избегать их ежедневного прерывания без уважительной причины.

Теперь, когда автоматическое обновление сертификата настроено, мы вернемся к настройке Mosquitto, чтобы сделать его более безопасным.

Шаг 5 — Настройка паролей MQTT

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

  1. sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy

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

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

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

allow_anonymous false
password_file /etc/mosquitto/passwd

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

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

  1. sudo systemctl restart mosquitto

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

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

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

Output
Connection Refused: not authorised. Error: The connection was refused.

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

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

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

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

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

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

Шаг 6 — Настройка MQTT SSL

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

  1. sudo nano /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, чтобы обновить настройки:

  1. sudo systemctl restart mosquitto

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

  1. sudo ufw allow 8883
Output
Rule added

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

  1. 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.

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

Шаг 7 — Настройка MQTT через веб-сокеты (необязательно)

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

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

  1. sudo nano /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.

  1. sudo systemctl restart mosquitto

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

  1. sudo ufw allow 8083

Чтобы протестировать эту функциональность, мы будем использовать общедоступный браузерный клиент MQTT. Их там несколько, но откройте клиент Paho в своем браузере. Вы увидите следующее:

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

  • Host должен быть доменом вашего сервера Mosquitto, mqtt.example.com.
  • Порт должен быть 8083.
  • Для ClientId можно оставить значение по умолчанию js-utility-DI1m6.
  • Путь можно оставить со значением по умолчанию, /ws.
  • Имя пользователя должно быть вашим именем пользователя Mosquitto; здесь мы использовали Сэмми.
  • Пароль должен быть выбранным вами паролем.

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

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

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

Заключение

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

  • OwnTracks – приложение для отслеживания местоположения с открытым исходным кодом, которое можно установить на свой телефон. OwnTracks будет периодически передавать информацию о местоположении на ваш MQTT-сервер, которую вы затем можете сохранить и отобразить на карте или создать оповещения и активировать оборудование IoT в зависимости от вашего местоположения.
  • Node-RED — это браузерный графический интерфейс для связывания Интернета вещей. Вы перетаскиваете вывод одного узла на ввод другого и можете направлять информацию через фильтры, между различными протоколами, в базы данных и так далее. Node-RED очень хорошо поддерживает MQTT.
  • ESP8266 — недорогой микроконтроллер Wi-Fi с возможностями MQTT. Вы можете подключить его, чтобы публиковать данные о температуре в теме, или, возможно, подписаться на тему атмосферного давления и включить зуммер, когда приближается шторм!

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