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/#. В свою очередь, когда подключается пользователь sensor2, он может работать с 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

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