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

Вступление

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

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

Предпосылки

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

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

  • Доменное имя указывает на ваш сервер. В этом руководстве будет использоваться заполнительmqtt.example.com

  • Порт 80 должен быть не использован на вашем сервере. Если вы устанавливаете Mosquitto на машину с веб-сервером, который занимает этот порт, вам нужно будет использовать другой метод для получения сертификатов, напримерwebroot mode Certbot.

[[step-1 -—- install-the-software]] == Шаг 1. Установка программного обеспечения

Сначала мы установим специальный репозиторий программного обеспечения, чтобы получить последнюю версию Certbot, клиента Let Encrypt:

sudo add-apt-repository ppa:certbot/certbot

НажмитеENTER, чтобы принять, затем установите пакеты программного обеспечения для Mosquitto и Certbot:

sudo apt install certbot mosquitto mosquitto-clients

Затем мы получим наш сертификат SSL.

[[step-2 -—- download-an-ssl-certificate]] == Шаг 2. Загрузка сертификата SSL

Откройте порт80 в брандмауэре:

sudo ufw allow 80

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

sudo certbot certonly --standalone --preferred-challenges http -d mqtt.example.com

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

Мы настроим Mosquitto для использования этих сертификатов дальше.

[[step-3 -—- configuring-mosquitto]] == Шаг 3. Настройка Mosquitto

Сначала мы создадим файл паролей, который Mosquitto будет использовать для аутентификации соединений. Используйте для этогоmosquitto_passwd, не забудьте подставить ваше собственное предпочтительное имя пользователя:

sudo mosquitto_passwd -c /etc/mosquitto/passwd your-username

Вам будет дважды предложено ввести пароль.

Теперь откройте новый файл конфигурации для Mosquitto:

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

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

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

allow_anonymous false
password_file /etc/mosquitto/passwd

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

Обязательно замените доменное имя, которое вы использовали на шаге 2, наmqtt.example.com. Сохраните и закройте файл, когда вы закончите.

Этот файл делает следующее:

  • Отключить анонимные логины

  • Использует наш файл паролей для включения аутентификации по паролю

  • Устанавливает незащищенный приемник на порт 1883 только дляlocalhost

  • Устанавливает безопасный приемник на порт8883

  • Устанавливает безопасный прослушиватель на основе веб-сокетов на порт8083

Перезапустите Mosquitto, чтобы получить изменения конфигурации:

sudo systemctl restart mosquitto

Убедитесь, что служба снова работает:

sudo systemctl status mosquitto
Output● mosquitto.service - LSB: mosquitto MQTT v3.1 message broker
   Loaded: loaded (/etc/init.d/mosquitto; generated)
   Active: active (running) since Mon 2018-07-16 15:03:42 UTC; 2min 39s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 6683 ExecStop=/etc/init.d/mosquitto stop (code=exited, status=0/SUCCESS)
  Process: 6699 ExecStart=/etc/init.d/mosquitto start (code=exited, status=0/SUCCESS)
    Tasks: 1 (limit: 1152)
   CGroup: /system.slice/mosquitto.service
           └─6705 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

Статус должен бытьactive (running). Если это не так, проверьте файл конфигурации и перезапустите снова. Некоторая дополнительная информация может быть доступна в файле журнала Mosquitto:

sudo tail /var/log/mosquitto/mosquitto.log

Если все в порядке, используйтеufw, чтобы пропустить два новых порта через брандмауэр:

sudo ufw allow 8883
sudo ufw allow 8083

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

[[step-4 -—- configuring-certbot-Renewals]] == Шаг 4. Настройка продлений Certbot

Certbot автоматически продлит срок действия наших SSL-сертификатов до истечения срока их действия, но после этого необходимо указать, что необходимо перезапустить службу Mosquitto.

Откройте файл конфигурации обновления Certbot для вашего доменного имени:

sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf

Добавьте следующую опциюrenew_hook в последнюю строку:

/etc/letsencrypt/renewal/mqtt.example.com.conf

renew_hook = systemctl restart mosquitto

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

sudo certbot renew --dry-run

Если вы не видите ошибок, все готово. Давайте протестируем наш MQTT-сервер дальше.

[[step-5 -–- testing-mosquitto]] == Шаг 5 - Тестирование Mosquitto

На шаге 1 мы установили несколько клиентов MQTT для командной строки. Мы можем подписаться на темуtest в прослушивателе localhost следующим образом:

mosquitto_sub -h localhost -t test -u "your-user" -P "your-password"

И мы можем публиковать сmosquitto_pub:

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

Чтобы подписаться с помощью защищенного прослушивателя на порт 8883, выполните следующие действия:

mosquitto_sub -h mqtt.example.com -t test -p 8883 --capath /etc/ssl/certs/ -u "your-username" -P "your-password"

И вот как вы публикуете для защищенного слушателя:

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

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

Для тестирования функциональности веб-сокета мы будем использовать общедоступный клиент MQTT на основе браузера. Open the Eclipse Paho javascript client utility in your browser и заполните информацию о подключении следующим образом:

  • Host - это домен вашего сервера Mosquitto,mqtt.example.com

  • Port равно8083

  • ClientId можно оставить случайным значением по умолчанию

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

  • Username - ваше имя пользователя Mosquitto из шага 3

  • Password - это пароль, который вы выбрали на шаге 3

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

После нажатияConnect клиент подключится к вашему серверу. Вы можете опубликовать и подписаться с помощью панелейSubscribe иPublish Message под панельюConnection.

Заключение

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

Related