La sécurisation du protocole MQTT

Comme pour toute mise en place de service, il est important d'appliquer les bonnes pratiques en terme de sécurité, pour s'assurer que nous sommes les seuls à l'utiliser.

La sécurisation du protocole MQTT

Nous avons vu dans une première série d'articles ce qu'était le protocole MQTT, comment mettre en place un broker, comment publier des informations vers des modules ou encore comment souscrire à des topics depuis une solution domotique.

Nous allons maintenant nous intéresser à la sécurisation des communications entre le broker et les différents périphériques ou logiciels qui vont souscrire et/ou publier aux topics !

On part du postulat que vous avez suivi notre tutorial pour mettre en place votre broker MQTT :

MQTT, un protocole pour tous les rassembler - Partie 1 : le broker
MQTT (Message Queuing Telemetry Transport) est un protocole de messagerie de type publication-abonnement basé sur le protocole TCP/IP et assure une communication bi-directionnelle entre 2 appareils.

Nous allons voir ensemble les nouveautés apportées par la version 2.0 de Mosquitto, sortie en décembre 2020 (voir le changelog complet). Cette version sécurise par défaut le broker, notamment en limitant l'écoute des connexions MQTT sur l'hôte local ou encore en n'autorisant pas les connexions anonymes.

Que ce soit pour ceux qui installent Mosquitto pour la première fois ou encore pour ceux qui migrent de la version 1 à la version 2, certains ajustements dans la configuration sont nécessaires.

Parmi les différentes étapes de la sécurisation de notre broker, nous allons mettre en place des identifiants de connexion, ce qui permettra de nous assurer que seuls les périphériques autorisés publieront et / ou souscriront dans les topics du broker, ou encore interdire les connexions sans identifiants. Nous pouvons également décider de n'autoriser les connexions venant que de certains périphériques.

Le broker mosquitto utilise un fichier de configuration mosquitto.conf, et nous allons nous intéresser à son contenu. Par défaut, tout le contenu du fichier de configuration est commenté, et il faut décommenter les paramètres que l'on souhaite modifier. J'ai choisi de créer un nouveau fichier, pour qu'il n'y ait que le nécessaire et mieux m'y repérer.

Le contenu de mon fichier de configuration mosquitto.conf est le suivant :

persistence true
persistence_file mosquitto.db
persistence_location /mosquitto/data/

per_listener_settings false

listener 1883
protocol mqtt
allow_anonymous false
password_file /mosquitto/config/passwd

En voici les explications ligne par ligne :

  • On indique avec le paramètre persistence qu'on active la sauvegarde des données reçues / envoyées en MQTT. On précise le nom du fichier avec persistence_file ainsi que son emplacement avec persistence_location.
  • La ligne listener 1883 crée un nouveau listener qui va écouter sur le port 1883 pour toutes les interfaces réseaux (et non pas seulement sur l´hôte local comme par défaut) et on indique avec le paramètre protocol qu'il s'agit de mqtt.
  • allow_anonymous false désactivera toutes les connexions non authentifiées pour le listener et on précise avec le paramètre password_file le chemin complet du fichier qui stockera les identifiants / mots de passe étant autorisés à se connecter et à publier / souscrire sur notre broker.
  • Enfin, le paramètre per_listener_settings vous permet de préciser que les paramètres d'authentification définis précédemment sont globaux ou à appliquer par listener.

Passons maintenant à la génération de ce fichier stockant nos identifiants. Pour cela, commencez par vous connecter dans le conteneur mosquitto avec la commande :

docker exec -it mosquitto ash

Et générons le fichier des identifiants (vous pouvez en générer autant que vous le souhaitez) :

mosquitto_passwd -c -b /chemin/complet/du/fichier NomDUtilisateur VotreMotDePasse

On redémarre notre broker avec la commande docker restart mosquitto et on peut vérifier avec MQTT Explorer que notre broker n'est plus accessible sans identifiant mais pleinement fonctionnel avec les identifiants configurés.

La prochaine étape sera de modifier les connexions existantes pour leur indiquer les identifiants de connexion au broker pour qu'elles continuent de fonctionner.

Dans le cas de Zigbee2MQTT, modifiez le fichier de configuration configuration.yaml avec les informations suivantes :

mqtt:
  base_topic: zigbee2mqtt
  server: 'mqtt://IP.DE.VOTRE.BROKER'
  user: NomDUtilisateur
  password: VotreMotDePasse

On procède de la même manière pour les équipements Shelly :


Une amélioration supplémentaire de la sécurité peut être implémentée, en mettant en place des certificats pour chiffrer les communications. Je n'aborde volontairement pas ce point pour la bonne raison que dans le cadre d'une utilisation personnelle, les objets connectés ou logiciels que nous pouvons utiliser ne supportent pas tous ce chiffrement.

A savoir, le paramètre per_listener_settings s'applique aussi à la configuration des certificats et vous permet donc de choisir quels sont les listener dont vous souhaiter chiffrer les communications ou non.

Néanmoins, si vous souhaitez quand même le faire sur votre installation, je vous conseille le tutoriel suivant :

MQTTS : Comment utiliser MQTT avec TLS ? – Openest
Utilisez Mosquitto et paho MQTT pour chiffrer votre communication avec TLS et OpenSSL. Découvrez comment configurer le broker et les clients pour MQTTS.

Conclusion

Cet article arrive à sa fin, et même si vous vous demandez si c'est vraiment utile, il est indispensable de toujours penser à sécuriser les logiciels que vous mettez en place, même s'ils ne seront utilisés que sur votre réseau local et que vous pensez être à l'abri. Comme le dit l'adage, il est toujours mieux de prévenir que de guérir !

Comme pour chaque article, nous vous invitons à poser vos questions dans les commentaires ou à venir échanger sur notre groupe Telegram.