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

Вступление

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

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

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

Предпосылки

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

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

Пакет Debian + mosquitto + не поддерживает некоторые из необходимых нам функций, поэтому мы установим из более современного репозитория, предоставленного проектом Mosquitto. Сначала загрузите их ключ подписи репозитория.

wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key

Затем установите ключ с помощью + apt-key +.

sudo apt-key add mosquitto-repo.gpg.key

Это позволяет + apt-get + проверять целостность любого программного обеспечения, которое вы устанавливаете из нового репозитория.

Теперь скажите + apt-get +, где найти программное обеспечение, добавив URL-адрес хранилища в файл в + / etc / apt / sources.list.d / +.

sudo nano /etc/apt/sources.list.d/mosquitto.list

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

/etc/apt/sources.list.d/mosquitto.list

deb http://repo.mosquitto.org/debian jessie main

Сохраните и закройте редактор, затем обновите с помощью + apt-get, чтобы получить информацию о новом пакете.

sudo apt-get update

И, наконец, установите пакет + mosquitto + и его клиентское программное обеспечение.

sudo apt-get install mosquitto mosquitto-clients

По умолчанию Debian запускает службу 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.

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

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

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

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

Сначала откройте новый файл в + / etc / apt / sources.list.d / +.

sudo nano /etc/apt/sources.list.d/backports.list

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

/etc/apt/sources.list.d/backports.list

deb http://mirrors.digitalocean.com/debian jessie-backports main

Сохраните файл и закройте редактор. После этого обновите информацию о пакете.

sudo apt-get update

И, наконец, установите официальный клиент Let Encrypt, называемый Certbot, который говорит APT использовать + jessie-backports + в качестве источника:

sudo apt-get install certbot -t jessie-backports

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

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

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

sudo ufw allow http
OutputRule added
Rule added (v6)

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

sudo certbot certonly --standalone --standalone-supported-challenges http-01 -d

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

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

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

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

Для ежедневной проверки обновлений мы будем использовать https://www.digitalocean.com/community/tutorials/how-to-use-cron-to-automate-tasks-on-a-vps [+ cron +], стандартная системная служба для запуска периодических заданий. Мы сообщаем + cron +, что делать, открывая и редактируя файл с именем + crontab +.

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 Encrypt, и почему мы устанавливали из бэкпортов вместо стандартного репозитория Debian. Без него нам пришлось бы перезапускать Mosquitto каждый день, даже если на самом деле сертификаты не обновлялись. Хотя ваши клиенты MQTT должны быть настроены на автоматическое переподключение, разумно избегать их ежедневного прерывания без уважительной причины.

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

Шаг 5 - Настройка паролей 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.

Шаг 6 - Настройка 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 + и сообщает ему, где искать корневые сертификаты. Обычно они устанавливаются вашей операционной системой, поэтому путь для macOS, Windows и т. Д. Отличается. + mosquitto_pub использует корневой сертификат для проверки того, что сертификат сервера Mosquito был надлежащим образом подписан центром сертификации Let Encrypt. Важно отметить, что + mosquitto_pub + и + mosquitto_sub + не будут пытаться установить SSL-соединение без этой опции (или аналогичной опции + - cafile +), даже если вы подключаетесь к стандартному безопасному порту `+ 8883 + `.

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

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

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

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

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 на основе браузера. Их там несколько, но mqtt-admin прост и понятен. Open mqtt-admin в вашем браузере. Вы увидите следующее:

изображение: https: //assets.digitalocean.com/articles/mosquitto-debian/SJRJgLX.png [начальный экран mqtt-admin]

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

  • * Протокол * должен быть * wss * (что означает w eb s ocket s ecure).

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

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

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

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

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

После нажатия * Сохранить настройки *, + mqtt-admin + подключится к вашему серверу Mosquitto. На следующем экране заполните * Тема * как * тест *, введите любое сообщение для * Полезная нагрузка *, затем нажмите * Опубликовать *. Сообщение будет отображаться в терминале + mosquitto_sub +.

Заключение

Теперь мы настроили защищенный, защищенный паролем MQTT-сервер с автоматическим обновлением SSL-сертификатов от службы Let Encrypt. Это послужит надежной и безопасной платформой обмена сообщениями для любых проектов, о которых вы мечтаете. Некоторые популярные программные и аппаратные средства, которые хорошо работают с протоколом 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