Аутентификация и авторизация протокола MQTT

Настройки аутентификации и авторизации по протоколу MQTT не являются составной частью LoRaWAN.Server I/Q, за их реализацию отвечает MQTT-брокер Mosquitto. Рекомендуется настроить проверку подлинности и авторизацию по протоколу MQTT для защиты передачи данных через базовые станции и приложения сервера.

Можно назначить каждой базовой станции свой собственный логин, ограничив доступ определенным набором MQTT топиков, а также дать каждому пользователю свой логин для MQTT, ограничив его доступ к приложениям сервера.

Для брокера Mosquitto существует несколько способов настройки аутентификации и авторизации:

  1. статически - пароль и файлы ACL (список контроля доступа)
  2. динамически из пользовательской таблицы сервера приложений LoRa, которая хранится в базе данных. В этом случае пользователи сервера приложений LoRa могут входить через личную учетную запись при подключении к брокеру MQTT и они будут ограничены приложениями и данными, к которым имеют доступ в веб-интерфейсе сервера приложений LoRa.

Эти шаги описывают, как установить и настроить брокер Mosquitto со статическим паролем и файлом ACL (с помощью статического пароля и файла с расширением ACL). Если вы хотите настроить брокер Mosquitto таким образом, чтобы пользователи и разрешения были получены с сервера приложений LoRa, перейдите к следующим разделам, чтобы узнать, как настроить модули Mosquitto Auth или Mosquitto Go Auth.

Пароли

Используйте утилиту mosquitto_passwd для генерирования файла паролей для аутентификации. Пример создания файла паролей и добавления имени пользователя (используйте -c только в первый раз, поскольку он создаст новый файл):

# Создайте файл с паролями для пользователей loraserver_gw, loraserver_ns, loraserver_as # и admin
sudo mosquitto_passwd -c /etc/mosquitto/passwd loraserver_gw
sudo mosquitto_passwd /etc/mosquitto/passwd loraserver_ns
sudo mosquitto_passwd /etc/mosquitto/passwd loraserver_as
sudo mosquitto_passwd /etc/mosquitto/passwd admin
# Ограничьте доступ к файлу паролей в операционной системе
sudo chmod 600 /etc/mosquitto/passwd

Файл списка контроля доступа будет сопоставлять имена пользователей с набором топиков. Запишите этот файл в /etc/mosquitto/acls. Пример:

user loraserver_gw
topic write gateway/+/stats
topic write gateway/+/rx
topic read gateway/+/tx
topic write gateway/+/ack
topic read gateway/+/config

user loraserver_ns
topic read gateway/+/stats
topic write gateway/+/tx
topic read gateway/+/rx
topic read gateway/+/ack
topic write gateway/+/config

user loraserver_as
topic write application/+/device/+/rx
topic write application/+/device/+/join
topic write application/+/device/+/ack
topic write application/+/device/+/error
topic read application/+/device/+/tx
topic write application/+/device/+/status
topic write application/+/device/+/location

user admin
topic read application/123/device/+/+
topic write application/123/device/+/tx

Параметр доступа (параметр указательного типа) для каждой темы может быть прочитан, записан или перезаписан. Обратите внимание, что + — это подстановочный знак (например, все шлюзы, приложения или устройства в приведенном выше примере).

Конфигурация брокера Mosquitto

Затем добавьте новый файл конфигурации с именем /etc/mosquitto/conf.d/auth.conf со следующей конфигурацией:


allow_anonymous false
password_file /etc/mosquitto/passwd
acl_file /etc/mosquitto/acls

Чтобы установить и настроить брокер Mosquitto таким образом, чтобы он получал пользователей и разрешения из базы данных сервера приложений LoRa, необходимо настроить плагин mosquitto-auth-plug. Этот проект обеспечивает аутентификацию и авторизацию брокера Mosquitto с использованием различных бэкендов (Backend-серверов). В нашем случае мы заинтересованы в PostgreSQL и бэкенд-файлах.

Компиляция mosquitto-auth-plug

Перед тем, как Mosquitto-auth-plugin будет скомпилирован, вам необходимо установить следующие дополнительные компоненты (в Ubuntu с помощью sudo apt install …, в CentOS с помощью sudo yum install …):

  • Git
  • mosquitto-dev
  • libmosquitto-dev
  • postgresql-server-dev-9.6
  • build-essential
  • libssl-dev

Следующим шагом клонируйте репозиторий mosquitto-auth-plug:


cd /opt
sudo git clone https://github.com/jpmens/mosquitto-auth-plug.git

Напишите следующее содержание /opt/mosquitto-auth-plug/config.mk:

# Select your backends from this list (Выберите ваши бэкенды из этого списка)
BACKEND_CDB ?= no
BACKEND_MYSQL ?= no
BACKEND_SQLITE ?= no
BACKEND_REDIS ?= no
BACKEND_POSTGRES ?= yes
BACKEND_LDAP ?= no
BACKEND_HTTP ?= no
BACKEND_JWT ?= no
BACKEND_MONGO ?= no
BACKEND_FILES ?= yes
BACKEND_MEMCACHED ?= no

# Specify the path to the Mosquitto sources here (Укажите путь к источникам брокера Mosquitto здесь)
MOSQUITTO_SRC =

# Specify the path the OpenSSL here (Укажите путь OpenSSL здесь)
OPENSSLDIR = /usr

# Specify optional/additional linker/compiler flags here (Укажите выборочные / дополнительные флаги компоновщика / компилятора здесь)
# On macOS, add (в macOS добавить)
# CFG_LDFLAGS = -undefined dynamic_lookup
# as described in https://github.com/eclipse/mosquitto/issues/244 (как описано в https://github.com/eclipse/mosquitto/issues/244)
CFG_LDFLAGS =
CFG_CFLAGS = -DRAW_SALT

Скомпилируйте плагин:


cd /opt/mosquitto-auth-plug
sudo make

Установка и настройка mosquitto-auth-plug

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


sudo mkdir /etc/mosquitto/mosquitto-auth-plug
sudo touch /etc/mosquitto/mosquitto-auth-plug/passwords
sudo touch /etc/mosquitto/mosquitto-auth-plug/acls


Напишите следующее содержимое в /etc/mosquitto/conf.d/mosquitto-auth-plug.conf:

allow_anonymous false

auth_plugin /opt/mosquitto-auth-plug/auth-plug.so
auth_opt_backends files,postgres

auth_opt_host localhost
auth_opt_port 5432
auth_opt_dbname loraserver_as
auth_opt_user loraserver_as
auth_opt_pass loraserver_as
auth_opt_userquery select password_hash from «user» where username = $1 and is_active = true limit 1
auth_opt_superquery select count(*) from «user» where username = $1 and is_admin = true
auth_opt_aclquery select distinct 'application/' || a.id || '/#' from «user» u inner join organization_user ou on ou.user_id = u.id inner join organization o on o.id = ou.organization_id inner join application a on a.organization_id = o.id where u.username = $1 and $2 = $2

auth_opt_password_file /etc/mosquitto/mosquitto-auth-plug/passwords
auth_opt_acl_file /etc/mosquitto/mosquitto-auth-plug/acls



Измените следующие настройки, настроив в соответствие конфигурации серверу приложений LoRa:

  • auth_opt_host: database hostname
  • auth_opt_port: database port
  • auth_opt_dbname: database name
  • auth_opt_user: database username
  • auth_opt_pass: database password


Статические пароли
Поскольку компоненты сервер GW Bridge, LoRaServer и App Server также используют брокер MQTT, вы можете настроить статические пароли и для взаимодействия этих сервисов между собой.
Чтобы создать пароль, читаемый с помощью mosquitto-auth-plug, используйте следующую команду:

/opt/mosquitto-auth-plug/np


Будет предложено ввести пароль, вернув кэшированную версию, пример:
/opt/mosquitto-auth-plug/np
Введите пароль:
xxxxx

PBKDF2$sha256$901$MLnQ3iGgLsHQd8Ym$fXD7OFInOk31jAc28O9xSHoMue0zF1SR

Теперь вам нужно записать выходной файл в /etc/mosquitto/mosquitto-auth-plug/passwords, где каждая строка должна быть в формате USERNAME: PASSWORDHASH. В итоге ваш файл паролей должен выглядеть таким образом:

loraserver_gw:PBKDF2$sha256$100000$7GKPpz5FmcthzI8P$hNljou3w7CIoZMoIN7cj/H8CHnP9770t
loraserver_ns:PBKDF2$sha256$100000$jXjd9LKwjkLhec/m$qwhGxiPON/tKCXcfS6fpfAr1xQec8AQI
loraserver_as:PBKDF2$sha256$100000$AC51663HqjWlPisA$uV4WQmy0c6nMsLwEffXUeVqIFRDb4Y+h


Для статических паролей, созданных на предыдущем шаге, рекомендуется ограничить логины определенным набором доступных топиков. Для этого вы можете добавить правила ACL, чтобы ограничить набор тем для имени пользователя в файле /etc/mosquitto/mosquitto-auth-plug/acls. Пример:
user loraserver_gw
topic write gateway/+/stats
topic write gateway/+/rx
topic read gateway/+/tx
topic write gateway/+/ack
topic read gateway/+/config

user loraserver_ns
topic read gateway/+/stats
topic write gateway/+/tx
topic read gateway/+/rx
topic read gateway/+/ack
topic write gateway/+/config

user loraserver_as
topic write app/+/device/+/rx
topic write app/+/device/+/join
topic write app/+/device/+/ack
topic write app/+/device/+/error
topic read app/+/device/+/tx
topic write app/+/device/+/status
topic write app/+/device/+/location