GNU/Linux >> Tutoriels Linux >  >> Ubuntu

Comment installer et sécuriser le courtier de messagerie Mosquitto MQTT sur Ubuntu 20.04

Mosquitto est un courtier de messages open source qui utilise le transport de télémétrie Message Queuing (MQTT ) Protocole. Le protocole est conçu pour fournir une communication légère à l'Internet des objets (IoT ) dispositifs. Il est couramment utilisé pour le suivi GPS des véhicules, la domotique, les capteurs environnementaux et la collecte de données à grande échelle.

Le protocole MQTT s'exécute au-dessus du modèle TCP/IP. Étant léger, sa petite empreinte de code vous permet de créer des applications pour des appareils avec un minimum de ressources. Il s'appuie sur le modèle de publication/abonnement. Dans ce modèle, le client se connecte au serveur Mosquitto, qui agit comme un courtier pour envoyer des informations à d'autres clients abonnés à un canal.

Dans ce didacticiel, vous allez installer Mosquitto et configurer le courtier pour qu'il utilise SSL pour protéger les communications.

Prérequis

  • Un serveur Ubuntu 20.04 avec un utilisateur non root avec des privilèges sudo.
  • Un nom de domaine (myqtt.example.com ) pointé vers votre serveur.

Étape 1 - Installer le serveur et le client Mosquitto

Ubuntu est livré avec l'ancienne version 1.6 de Mosquitto. Pour installer la dernière version, ajoutez le dépôt officiel de Mosquitto.

$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa

Installez le serveur Mosquitto et le client.

$ sudo apt install mosquitto mosquitto-clients

Vérifiez l'état du serveur.

$ sudo systemctl status mosquitto
? mosquitto.service - Mosquitto MQTT Broker
     Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-01-25 09:18:40 UTC; 25s ago
       Docs: man:mosquitto.conf(5)
             man:mosquitto(8)
   Main PID: 119694 (mosquitto)
      Tasks: 1 (limit: 2274)
     Memory: 1.0M
     CGroup: /system.slice/mosquitto.service
             ??119694 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

Jan 25 09:18:39 <userid> systemd[1]: Starting Mosquitto MQTT Broker...
Jan 25 09:18:40 <userid> systemd[1]: Started Mosquitto MQTT Broker.

Étape 2 - Configurer l'authentification par mot de passe MQTT

Mosquitto est livré avec un utilitaire pour générer un fichier de mot de passe appelé mosquitto_passwd . Mosquitto stocke toutes les configurations dans le /etc/mosquitto répertoire.

Exécutez la commande suivante pour générer un fichier de mot de passe crypté dans /etc/mosquitto/passwd pour le nom d'utilisateur username . Entrez un mot de passe de votre choix.

$ sudo mosquitto_passwd -c /etc/mosquitto/passwd username
Password:
Reenter password:

Ensuite, créez un default.conf fichier sous /etc/mosquitto/conf.d répertoire et ouvrez-le pour le modifier.

$ sudo nano /etc/mosquitto/conf.d/default.conf

Collez les lignes suivantes pour spécifier l'emplacement du fichier de mot de passe. Si vous omettez le champ d'écoute, il se connectera toujours de manière anonyme, quelle que soit la configuration.

listener 1883
password_file /etc/mosquitto/passwd

Enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité.

Redémarrez le serveur Mosquitto pour mettre en œuvre le changement.

$ sudo systemctl restart mosquitto

Étape 3 - Tester le client Mosquitto

Selon le cas d'utilisation, vous pouvez utiliser le client Mosquitto pour envoyer et recevoir des messages sur différents sujets. Un client est soit un abonné, soit un éditeur.

L'étape suivante consiste à s'abonner à un sujet. Dans le protocole MQTT, un sujet fait référence à une chaîne utilisée par le serveur/broker pour filtrer les messages pour les clients connectés. Voici quelques exemples de rubriques que vous pouvez utiliser dans une application domotique.

  • home/lights/sitting_room
  • maison/lumières/cuisine
  • accueil/lumières/chambre_principale
  • accueil/lumières/chambre_enfants

Pour vous abonner à un sujet, exécutez le mosquitto_sub -t commande suivie du sujet. Par exemple, pour s'abonner à home/lights/kitchen sujet, exécutez la commande suivante.

$ mosquitto_sub -u username -P YOUR_PASSWORD -t "home/lights/kitchen"

Ne fermez pas la fenêtre existante. Ouvrir une nouvelle fenêtre de terminal pour publier un message sur home/lights/kitchen sujet à l'aide de la commande suivante.

$ mosquitto_pub -u username -P YOUR_PASSWORD -m "ON" -t "home/lights/kitchen"

Retournez à la première fenêtre du terminal et vous recevrez ON charge utile.

ON

Ensuite, envoyez le OFF message sur le même sujet depuis le second terminal.

$ mosquitto_pub -u username -P YOUR_PASSWORD -m "OFF" -t "home/lights/kitchen"

Le premier terminal affichera le message nouvellement publié.

ON
OFF

Si vous essayez d'envoyer un commentaire non authentifié, cela échouera. Par exemple, essayez la commande suivante.

$ mosquitto_sub -t "home/lights/sitting_room"
Connection error: Connection Refused: not authorised.

Ce n'est pas recommandé, mais vous devez ajouter la ligne suivante au /etc/mosquitto/conf.d/default.conf fichier si vous souhaitez exécuter les commandes sans authentification.

allow_anonymous true

Étape 4 - Installer SSL

Pour installer un certificat SSL avec Let's Encrypt, nous devons télécharger l'outil Certbot. Nous utiliserons le programme d'installation du package Snapd pour cela.

Installez le programme d'installation de Snap.

$ sudo apt install snapd

Assurez-vous que votre version de Snapd est à jour.

$ sudo snap install core 
$ sudo snap refresh core

Installez Certbot.

$ sudo snap install --classic certbot

Utilisez la commande suivante pour vous assurer que la commande Certbot s'exécute en créant un lien symbolique vers /usr/bin répertoire.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Générez un certificat SSL.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d mqtt.example.com

La commande ci-dessus téléchargera un certificat sur /etc/letsencrypt/live/mqtt.example.com répertoire sur votre serveur.

Générer un groupe Diffie-Hellman certificat.

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Créez un répertoire racine Web de défi pour le renouvellement automatique de Let's Encrypt.

$ sudo mkdir -p /var/lib/letsencrypt

Créez une tâche Cron pour renouveler le SSL. Il s'exécutera tous les jours pour vérifier le certificat et le renouveler si nécessaire. Pour cela, créez d'abord le fichier /etc/cron.daily/certbot-renew et ouvrez-le pour le modifier.

$ sudo nano /etc/cron.daily/certbot-renew

Collez le code suivant.

#!/bin/sh
certbot renew --cert-name mqtt.example.com --webroot -w /var/lib/letsencrypt/

Enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité.

Modifiez les autorisations sur le fichier de tâche pour le rendre exécutable.

$ sudo chmod +x /etc/cron.daily/certbot-renew

Étape 5 - Configurer SSL MQTT

Maintenant que nous avons les certificats SSL prêts, nous devons leur fournir un accès Mosquitto. Pour cela, nous devons copier les certificats dans un emplacement à partir duquel Mosquitto peut y accéder.

$ sudo cp /etc/letsencrypt/live/mqtt.example.com/fullchain.pem /etc/mosquitto/certs/server.pem
$ sudo cp /etc/letsencrypt/live/mqtt.example.com/privkey.pem /etc/mosquitto/certs/server.key

Changer la propriété du /etc/mosquitto/certs répertoire vers le mosquitto utilisateur créé lors de l'installation.

$ sudo chown mosquitto: /etc/mosquitto/certs

La prochaine étape pour activer le cryptage SSL pour Mosquitto consiste à spécifier l'emplacement des certificats SSL. Ouvrez le fichier de configuration pour le modifier.

$ sudo nano /etc/mosquitto/conf.d/default.conf

Collez le code suivant à la fin du fichier.

. . .
listener 8883
certfile /etc/mosquitto/certs/server.pem
cafile  /etc/ssl/certs/ISRG_Root_X1.pem
keyfile /etc/mosquitto/certs/server.key
dhparamfile /etc/ssl/certs/dhparam.pem

Enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité. Assurez-vous de laisser une nouvelle ligne à la fin du fichier.

L'listener 8883 partie configure le programme d'écoute chiffré. Il s'agit du port standard pour MQTT + SSL, appelé MQTTS. Les quatre lignes suivantes spécifient l'emplacement des fichiers SSL.

Redémarrez Mosquitto pour mettre à jour les paramètres.

$ sudo systemctl restart mosquitto

Vous devrez mettre à jour le pare-feu pour autoriser les connexions au port 8883.

$ sudo ufw allow 8883

Ensuite, nous devons tester la fonctionnalité en utilisant le mosquitto_pub commande.

$ mosquitto_pub -h mqtt.example.com -t "home/lights/kitchen" -m "hello" -p 8883 --capath /etc/ssl/certs/ -u username -P YOUR_PASSWORD

Comme vous pouvez le constater, nous avons inclus certains paramètres supplémentaires, notamment le numéro de port et le chemin d'accès aux certificats SSL. Chaque fois que vous aurez besoin d'utiliser SSL, vous devrez toujours spécifier le nom d'hôte complet, c'est-à-dire mqtt.example.com au lieu de localhost sinon, cela donnerait une erreur.

Vous devrez également ajouter le --capath directif à chaque fois. Il indique au client Mosquitto de rechercher les certificats racine installés par le système d'exploitation.

Étape 6 - Configurer le renouvellement SSL

Certbot renouvellera automatiquement votre certificat avant son expiration. Mais il faut lui dire de copier les certificats renouvelés dans le /etc/mosquitto/certs répertoire et redémarrez le service Mosquitto.

Nous allons le faire en créant un script shell. Créer un fichier mosquitto-copy.sh dans le /etc/letsencrypt/renewal-hooks/deploy répertoire.

$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh

Collez-y le code suivant. Remplacez la valeur du MY_DOMAIN variable avec votre domaine. Le ${RENEWED_LINEAGE} la variable pointe vers /etc/letsencrypt/live/mqtt.example.com répertoire lors du renouvellement.

# Set which domain this script will be run for
MY_DOMAIN=mqtt.example.com
# Set the directory that the certificates will be copied to.
CERTIFICATE_DIR=/etc/mosquitto/certs

if [ "${RENEWED_DOMAINS}" = "${MY_DOMAIN}" ]; then
	# Copy new certificate to Mosquitto directory
	cp ${RENEWED_LINEAGE}/fullchain.pem ${CERTIFICATE_DIR}/server.pem
	cp ${RENEWED_LINEAGE}/privkey.pem ${CERTIFICATE_DIR}/server.key

	# Set ownership to Mosquitto
	chown mosquitto: ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key

	# Ensure permissions are restrictive
	chmod 0600 ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key

	# Tell Mosquitto to reload certificates and configuration
	pkill -HUP -x mosquitto
fi

Enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité.

Rendre le fichier exécutable.

$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh

Ce script sera automatiquement exécuté à chaque renouvellement réussi du certificat.

Si vous utilisez Mosquitto et un serveur Web comme Nginx, vous devez demander à Certbot d'arrêter le serveur avant le renouvellement et de le redémarrer une fois terminé. Pour cela, ouvrez le fichier etc/letsencrypt/renewal/mqtt.example.com.conf .

$ sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf

Ajoutez les lignes suivantes à la fin du fichier. Modifiez les commandes en fonction du serveur Web que vous utilisez.

pre_hook = systemctl stop nginx
post_hook = systemctl start nginx

Enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité.

Exécutez une simulation Certbot pour vérifier.

$ sudo certbot renew --dry-run

Si vous ne voyez aucune erreur, cela signifie que tout est défini.

Étape 7 - Configurer les Websockets

Vous pouvez configurer Mosquitto pour utiliser le protocole MQTT à partir de navigateurs utilisant Javascript à l'aide de la fonctionnalité Websockets. Pour l'activer, ouvrez le fichier de configuration.

$ sudo nano /etc/mosquitto/conf.d/default.conf

Collez les lignes suivantes à la fin du fichier.

. . .
listener 8083
protocol websockets
certfile /etc/mosquitto/certs/server.pem
cafile  /etc/ssl/certs/ISRG_Root_X1.pem
keyfile /etc/mosquitto/certs/server.key
dhparamfile /etc/ssl/certs/dhparam.pem

Enregistrez le fichier en appuyant sur Ctrl + X et en saisissant Y lorsque vous y êtes invité.

Si vous remarquez, il s'agit du même bloc que celui que nous avons utilisé pour activer SSL, à l'exception des champs de numéro de port et de protocole. 8083 est le port le plus couramment utilisé par MQTT pour communiquer avec WebSockets.

Redémarrez le service Mosquitto.

$ sudo systemctl restart mosquitto

Ouvrez le port 8083.

$ sudo ufw allow 8083

Nous devons utiliser un client MQTT basé sur un navigateur pour tester la fonctionnalité WebSockets. Il existe de nombreux clients disponibles, mais nous utiliserons le client HiveMQ Websocket pour notre objectif. Lancez le client dans votre navigateur et vous verrez ce qui suit.

Comme indiqué dans la capture d'écran ci-dessus, remplissez les champs comme indiqué.

  • L'hôte doit être le domaine de votre serveur Mosquitto, mqtt.example.com.
  • Le port doit être 8083.
  • Le champ ClientID peut rester tel quel.
  • Le nom d'utilisateur doit être votre nom d'utilisateur Mosquitto.
  • Le mot de passe doit être le mot de passe que vous avez créé ci-dessus.
  • Vérifiez le SSL boîte.

Appuyez sur Connecter et le client HiveMQ sera connecté à votre serveur Mosquitto.

Une fois connecté, entrez home/lights/kitchen comme sujet, entrez n'importe quel message et appuyez sur Publier .

Le message apparaîtra dans votre mosquitto_sub fenêtre de terminal confirmant la connexion réussie.

Cela montre que la mise en œuvre de Websockets est réussie.

Conclusion

Ceci conclut notre configuration d'un serveur MQTT sécurisé, protégé par mot de passe et crypté SSL sur une machine basée sur Ubuntu 20.04. Si vous avez des questions, postez-les dans les commentaires ci-dessous.


Ubuntu
  1. Comment installer et sécuriser phpMyAdmin sur Ubuntu

  2. Comment installer Node.js et NPM sur Ubuntu 18.04 et 20.04

  3. Comment installer PHP 7.4 et 8.0 sur Ubuntu 18.04 ou 20.04

  4. Comment installer et sécuriser Redis sur Ubuntu 20.04

  5. Comment installer et sécuriser Redis sur Ubuntu 18.04

Comment installer et utiliser R sur Ubuntu

Comment installer et utiliser la commande Exa sur Ubuntu 20.04

Comment installer Mosquitto MQTT sur Ubuntu 20.04 LTS

Comment installer et sécuriser phpMyAdmin dans Ubuntu 14.04

Comment installer et sécuriser Memcached sur Ubuntu 18.04

Comment installer Signal Messaging sur Ubuntu 20.04