Ce tutoriel suppose une connaissance préalable de MQTT, MQTT 5 et des bases d'EMQ X.
Le plugin emqx-auth-pgsql gère l'accès des terminaux en vérifiant que le nom d'utilisateur et le mot de passe fournis lors de la connexion correspondent aux informations stockées dans une base de données PostgreSQL que vous spécifiez. Le processus est le suivant :
Nous partons du principe que PostgreSQL est installé et accessible depuis votre machine.
Configuraton du plugin
| Paramètre | Description |
|---|---|
auth.pgsql.server |
Hôte et port du serveur PostgreSQL à connecter, format : host[:port]. Le port par défaut est 5432 s'il n'est pas spécifié. |
auth.pgsql.username |
Nom d'utilisateur pour la connexion à PostgreSQL. |
auth.pgsql.password |
Mot de passe pour la connexion à PostgreSQL. |
auth.pgsql.database |
Base de données à interroger. |
auth.pgsql.ssl |
Indique si une connexion SSL doit être utilisée (par défaut : false). |
auth.pgsql.auth_query |
Requête SQL pour rechercher le mot de passe d'un utilisateur donné. |
auth.pgsql.password_hash |
Algorithme de chiffrement et méthode de salage utilisés pour les mots de passe stockés dans la table (par exemple, plain pour aucun chiffrement). |
auth.pgsql.super_query |
Requête SQL pour vérifier si un utilisateur est un super-utilisateur. Les super-utilisateurs peuvent publier et s'abonner à n'importe quel sujet. |
auth.pgsql.acl_query |
Requête SQL utilisée lors de la vérification des listes de contrôle d'accès (ACL). |
Fichier mqtt.sql
Le plugin emqx-auth-pgsql inclut un fichier mqtt.sql pour simplifier la mise en place de l'environnnement de base de données. Ce script crée les tables mqtt_user et mqtt_acl dans la base de données spécifiée par auth.pgsql.database. Il ajoute également des règles par défaut à la table mqtt_acl :
mqtt=# select * from mqtt_acl;
id | allow | ipaddr | username | clientid | access | topic
----+-------+-----------+-----------+----------+--------+--------
1 | 1 | | $all | | 2 | #
2 | 0 | | $all | | 1 | $SYS/#
3 | 0 | | $all | | 1 | eq #
4 | 1 | 127.0.0.1 | | | 2 | $SYS/#
5 | 1 | 127.0.0.1 | | | 2 | #
6 | 1 | | dashboard | | 1 | $SYS/#
(6 rows)
La signification de ces règles est expliquée dans un article similaire traitant de l'authentification et des ACL avec MySQL.
Vérification des fonctionnalités d'authentification et d'ACL
1. Installation de Mosquitto sur macOS
brew install mosquitto
2. Insertion manuelle de données après l'exécution de mqtt.sql
mqtt=# insert into mqtt_user (id, is_superuser, username, password, salt) values (1, false, 'test', 'password', 'salt');
mqtt=# insert into mqtt_acl (id, allow, ipaddr, username, clientid, access, topic) values (7, 0, NULL, 'test', NULL, 1, 'mytopic');
3. Modification du fichier de configuration d'EMQ X
Désactiver l'accès anonyme :
## .../etc/emqx.conf
allow_anonymous = false
Configurer le chiffreemnt de mot de passe comme plain (aucun chiffrement) dans le fichier de configuration du plugin :
## .../etc/plugins/emqx_auth_pgsql.conf
auth.pgsql.password_hash = plain
Spécifier les informations de connexion à la base de données :
## .../etc/plugins/emqx_auth_pgsql.conf
auth.pgsql.username = root
auth.pgsql.password = public
auth.pgsql.database = mqtt
4. Démarrage d'EMQ X et chargement du plugin emqx-auth-pgsql
$ ./_rel/emqx/bin/emqx start
emqx 3.1 is started successfully!
$ ./_rel/emqx/bin/emqx_ctl plugins load emqx_auth_pgsql
5. Tests
a. Connexion réussie avec authentification valide et abonnement à 'topic'
$ mosquitto_sub -p 1883 -u test -P password -t 'topic' -d
Client mosqsub|4119-zhouzibode sending CONNECT
Client mosqsub|4119-zhouzibode received CONNACK
Client mosqsub|4119-zhouzibode sending SUBSCRIBE (Mid: 1, Topic: topic, QoS: 0)
Client mosqsub|4119-zhouzibode received SUBACK
Subscribed (mid: 1): 0
Résultat : Connexion et abonnement réussis.
b. Échec de connexion avec authentification invalide
$ mosquitto_sub -p 1883 -u bad_user -P password -t 'topic' -d
Client mosqsub|4363-zhouzibode sending CONNECT
Client mosqsub|4363-zhouzibode received CONNACK
Connection Refused: not authorised.
Résultat : Connexion refusée.
c. Connexion réussie mais abonnement échoué à '#'
$ mosquitto_sub -p 1883 -u test -P password -t '#' -d
Client mosqsub|4392-zhouzibode sending CONNECT
Client mosqsub|4392-zhouzibode received CONNACK
Client mosqsub|4392-zhouzibode sending SUBSCRIBE (Mid: 1, Topic: #, QoS: 0)
Client mosqsub|4392-zhouzibode received SUBACK
Subscribed (mid: 1): 128
Résultat : Connexion réussie, abonnement échoué avec code de raison 128 (Ressource non disponible).
d. Connexion réussie mais abonnement échoué à 'mytopic'
$ mosquitto_sub -p 1883 -u test -P password -t 'mytopic' -d
Client mosqsub|4428-zhouzibode sending CONNECT
Client mosqsub|4428-zhouzibode received CONNACK
Client mosqsub|4428-zhouzibode sending SUBSCRIBE (Mid: 1, Topic: mytopic, QoS: 0)
Client mosqsub|4428-zhouzibode received SUBACK
Subscribed (mid: 1): 128
Résultat : Connexion réussie, abonnement échoué avec code de raison 128.