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.con
f, сохранив внесённые изменения, и перезапустите службу 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 вы можете отправить сообщение, которое будет получено брокером на вашем виртуальном сервере.
