ACL (Access Control List) – механизм управления доступом, который позволяет ограничивать права клиентов MQTT-брокера Mosquitto на чтение, запись или доступ к определённым топикам. Поскольку брокер, установленный на VPS, доступен из публичной сети, использование файла ACL становится особенно важно для обеспечения безопасности ваших данных. В статье разберём дополнительные меры безопасности в Mosquitto, в том числе управление ACL и настройки брандмауэра UFW.
Создание и настройка ACL
Для создания файла ACL перейдите в каталог Mosquitto:
$ cd /etc/mosquitto/
И там создайте файл при помощи текстового редактора nano
:
$ sudo nano acl
Файл ACL имеет примерно следующую структуру:
# Формат записи правила в файле ACL:
# user <имя-пользователя>
# topic [read|write|readwrite] <MQTT-топик>
# Разрешить пользователю 'mosquitto-user' полный доступ ко всем топикам
user mosquitto-user
topic readwrite #
# Разрешить пользователю 'another-mosquitto-user' публиковать записи в топики sensors/+
user another-mosquitto-user
topic write sensors/+
# Разрешить пользователю 'monitor-mosquitto-user' читать записи в топиках sensors/+
user monitor-mosquitto-user
topic read sensors/+
# Запретить доступ к системным топикам
topic read $SYS/#
После создания файла внесите изменения в конфигурацию Mosquitto:
$ sudo nano /etc/mosquitto/mosquitto.conf
А именно, добавьте в файл конфигурации строку, указывающую путь к файлу ACL:
acl_file /etc/mosquitto/acl
После чего перезапустите Mosquitto:
$ sudo systemctl restart mosquitto
В файле ACL можно использовать подстановочные знаки:
+
– заменяет любой один подуровень, например, записьdevices/+/data
означает, что вместо+
будет использоваться любой уровень:devices/sensors/data
,devices/device1/data
и т.п.;#
– заменяет любое количество уровней, например, записьdevices/#
означает, что вместо#
будет использоваться любое количество уровней:devices/sensors/data
,devices/device1
и т.п.
Кроме того, в файле ACL вы можете применять такой инструмент, как pattern
. Это механизм динамического управления доступом к MQTT-топикам. Он позволяет автоматически назначать права пользователям без явного указания их имён в файле ACL. Другими словами, вместо явного задания топиков для каждого пользователя можно использовать pattern
с подстановочными переменными:
%u
– имя пользователя MQTT-клиента;%c
– идентификатор MQTT-клиента.
Например, строка pattern readwrite devices/%u/#
означает, что, когда подключается пользователь sensor1
, он получает доступ к devices/sensor1/#
. В свою очередь, когда подключается пользователь sensor
2, он может работать с devices/sensor2/#
. Таким образом, нет необходимости вручную добавлять правила для каждого из пользователей.
Если же аутентификация идёт без логина, а устройства используют уникальные идентификаторы, то удобно использовать правила, типа:
pattern readwrite devices/%c/#
При добавлении правил в файл ACL следует помнить, что применяется первое совпадающее правило, а остальные правила игнорируются. Например, если сначала разрешить доступ к #
, а потом запретить devices/#
, то в этом случае запрет работать не будет.
Настройка брандмауэра
Дополнительной мерой, позволяющей повысить уровень безопасности виртуального сервера, является открытие только используемых портов в брандмауэре UFW. По умолчанию Mosquitto использует порт 1883 для незашифрованного соединения и порт 8883 для TLS. Исходя из этого, необходимо создать в UFW правила, разрешающие доступ к серверу через данные порты, или через порт, используемый в вашей конфигурации:
$ sudo ufw allow 1883/tcp
$ sudo ufw allow 8883/tcp
Чтобы убедиться в наличии данных правил в брандмауэре, выведите состояние UFW командой:
$ sudo ufw status

Таким образом, брандмауэр позволит ограничить доступ к серверу только через использование разрешённых портов и служб.