Mosquitto − популярный брокер сообщений MQTT, широко используемый для IoT-устройств и распределённых систем. Установленный с настройками по умолчанию, Mosquitto не обеспечивает надёжной защиты данных, что делает его уязвимым для атак. В этой статье мы начнём рассматривать основные методы защиты Mosquitto на Ubuntu 24.04, в частности, разберём, как производится настройка аутентификации и шифрования соединений с помощью TLS. Два данных аспекта, описанные далее, позволят повысить безопасность созданной вами MQTT-инфраструктуры.
Настройка аутентификации
Первоначально мы запустили Mosquitto, используя анонимное подключение, то есть без какой-либо аутентификации. Теперь же необходимо обеспечить доступ к брокеру с помощью строго определённых учётных записей. Исходя из этого, на первом этапе настройки аутентификации нужно будет создать новый файл для хранения паролей:
$ sudo mosquitto_passwd -c /etc/mosquitto/passwd mosquitto-user
Здесь:
- опция
-cуказывает на то, что в ходе выполнения команды будет создан именно новый файл, и если такой файл на данный существует, он будет перезаписан; /etc/mosquitto/passwd− создаваемый файл паролей;mosquitto-user− пользователь, при помощи которого будет осуществляться подключение к брокеру.
В ходе выполнения команда попросит указать пароль для создаваемой учётной записи.
Если нужно в уже существующий файл добавить ещё одного пользователя, используйте подобную команду, но уже без опции -c:
$ sudo mosquitto_passwd /etc/mosquitto/passwd another-mosquitto-user
Для того, чтобы процессы Mosquitto получили доступ к файлу паролей, измените его владельца и группу на пользователя и группу mosquitto:
$ sudo chown mosquitto:mosquitto /etc/mosquitto/passwd
Далее, откройте для редактирования конфигурационный файл Mosquitto, чтобы внести в него некоторые изменения:
$ sudo nano /etc/mosquitto/mosquitto.conf
А именно необходимо закрыть анонимный доступ к брокеру и указать путь к файлу паролей:
allow_anonymous false
password_file /etc/mosquitto/passwd
Если в файле присутствует строка allow_anonymous true, удалите её или закомментируйте. После чего закройте файл mosquitto.conf, сохранив внесённые изменения, и перезапустите службу mosquitto:
$ sudo systemctl restart mosquitto
С этого момента запуск подписки на тестовый MQTT-топик test от брокера Mosquitto нужно будет производить с указанием соответствующих имени пользователя и пароля:
$ mosquitto_sub -h X.X.X.X -t test -u "mosquitto-user" -P "Password"
В данном случае X.X.X.X − IP-адрес или имя хоста, на котором производится запуск брокера, Password − пароль, указанный при создании пользователя mosquitto-user.
Шифрование данных с помощью TLS
Для обеспечения конфиденциальности и безопасности передаваемых данных между клиентами и MQTT-брокером в Mosquitto рекомендуется использовать шифрование данных. Без использования шифрования данные передаются в открытом виде. Это делает их уязвимыми для перехвата и несанкционированного доступа.
Для шифрования данных Mosquitto использует протокол TLS/SSL (Transport Layer Security/Secure Sockets Layer). При установлении безопасного соединения клиент и сервер обмениваются сертификатами и ключами. При этом сервер предоставляет свой сертификат, чтобы клиент мог убедиться в его подлинности.
Создание конфигурационного файла OpenSSL
Соответственно, сначала необходимо на сервере сгенерировать сертификат и приватный ключ Центра сертификации (CA, Certificate Authority), которые будут использоваться в инфраструктуре с использованием TLS/SSL. Чтобы упростить работу с ключами, создайте конфигурационный файл для OpenSSL, который будет определять параметры создания сертификатов и ключей:
$ sudo nano /etc/mosquitto/certs/openssl.cnf
Содержимое файла должно выглядеть примерно следующим образом:
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[dn]
C = RU
ST = Moscow Region
L = Moscow
O = Your Organization
OU = Your Unit
CN = X.X.X.X
[v3_ca]
subjectAltName = @alt_names
[alt_names]
IP.1 = X.X.X.X
В данном случае
[req]− раздел, содержащий основные параметры запроса, в том числе:default_bits = 2048− размер ключа;prompt = no− параметр, отключающий интерактивный ввод данных;default_md = sha256− алгоритм хеширования;distinguished_name = dn− ссылка на секцию[dn];
[dn]− раздел, содержащий информацию о сертификате;C = RU− код страны в формате ISO 3166-1;ST = Moscow Region− регион, то есть, область, край или штат;L = Moscow− город или населённый пункт;O = Your Organization− название организации;OU = Your Unit− подразделение организации;CN = X.X.X.X− основное имя, обычно, имя домена или IP-адрес сервера, для которого создаётся сертификат (в данном случае заменитеX.X.X.Xна IP-адрес вашего брокера Mosquitto);
[v3_ca]− раздел, содержащий настройки расширенных полей сертификата;subjectAltName = @alt_names− параметр означает, что поле Subject Alternative Name (SAN) будет заполнено значениями из секции[alt_names];
[alt_names]− альтернативные имена или IP-адрес сервера;IP.1 = X.X.X.X− параметр, указывающий на то, что сертификат может использоваться для конкретного IP.
Сохраните изменения в файле, после чего закройте его.
Создание корневого сертификата (CA)
Для дальнейшей работы перейдите в каталог, в котором будут создаваться ключи и сертификаты:
$ cd /etc/mosquitto/certs/
После чего сгенерируйте закрытый ключ, который будет использоваться для выпуска TLS-сертификатов:
$ sudo openssl genpkey -algorithm RSA -out ca.key
Затем создайте самоподписанный сертификат CA. Его можно будет использовать для подписи сертификатов серверов и клиентов:
$ sudo openssl req -new -x509 -days 365 -key ca.key -out ca.crt -config openssl.cnf
Создание сертификата сервера
Далее сгенерируйте закрытый ключ для TLS-шифрования сервера Mosquitto:
$ sudo openssl genpkey -algorithm RSA -out server.key
Создайте запрос на сертификат (CSR), который можно подписать у CA для получения действующего SSL-сертификата:
$ sudo openssl req -new -key server.key -out server.csr -config openssl.cnf
И, наконец, подпишите запрос на сертификат server.csr с использованием собственного центра сертификации:
$ sudo openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -extfile openssl.cnf -extensions v3_ca
Чтобы у Mosquitto был доступ к созданным файлам, измените владельца и группу директории /etc/mosquitto/certs/ и её содержимого на пользователя и группу mosquitto:
$ sudo chown mosquitto:mosquitto -R /etc/mosquitto/certs/
Изменение конфигурации Mosquitto
Теперь необходимо внести изменения в конфигурацию Mosquitto. Для чего откройте файл /etc/mosquitto/mosquitto.conf при помощи текстового редактора nano:
$ sudo nano /etc/mosquitto/mosquitto.conf
И добавьте в него следующие строки:
listener 8883
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
При этом, если вы хотите, чтобы в Mosquitto перестал использоваться порт 1883, удалите или закомментируйте строку listener 1883.
Закройте файл с сохранением изменений и перезапустите сервис mosquitto:
$ sudo systemctl restart mosquitto
Проверка подключения с использованием MQTTX
Теперь для запуска подписки на тестовый MQTT-топик test будет выглядеть следующим образом:
$ mosquitto_sub -h X.X.X.X -p 8883 -t test -u "mosquitto-user" -P "Password" --cafile /etc/mosquitto/certs/ca.crt
Здесь:
X.X.X.X− IP-адрес сервера Mosquitto;8883− порт, используемый для подключения;mosquitto-user− имя пользователя для подключения к Mosquitto;Password− пароль учётной записиmosquitto-user;/etc/mosquitto/certs/ca.crt− путь к файлу сертификата центра сертификации.
Чтобы воспользоваться защищённым соединением, например, из такого MQTT-клиента, как MQTTX, необходимо сделать так, чтобы MQTT-клиент доверял серверному сертификату при установке зашифрованного соединения. Для этого необходимо скопировать файл сертификата центра сертификации ca.crt на компьютер, с которого будет осуществляться подключение к брокеру. Сделать это можно, например, с использованием приложения WinSCP.

В интерфейсе MQTTX кликните значок создания нового подключения, где укажите:
- название нового подключения в строке
Name; - протокол
mqtts://и IP-адрес сервера в строкеHost; - номер используемого порта, а именно, 8883, в строке
Port.
Также в строках Username и Password укажите имя пользователя и пароля пользователя, используемые для подключения к брокеру. Переключатели SSL/TLS и SSL Secure оставьте во включённом состоянии. В разделе Certificate активируйте опцию CA or Self signed certificates, и наконец, в поле CA File выберите скопированный ранее файл сертификата центра сертификации. Для того, чтобы сохранить изменения и подключиться к брокеру, кликните Connect.

После подключения к Mosquitto при помощи MQTTX вы можете отправить сообщение, которое будет получено брокером на вашем виртуальном сервере.

