Comment installer et sécuriser Mosquitto MQTT Messaging Broker sur Ubuntu 18.04 [Quickstart]

introduction

MQTT est un protocole de messagerie de machine à machine, conçu pour fournir une communication de publication / abonnement légère aux périphériques «Internet des objets». Mosquitto est un serveur MQTT populaire (oubroker, dans le langage MQTT) qui bénéficie d'un excellent support communautaire et est facile à installer et à configurer.

Dans ce didacticiel de démarrage rapide condensé, nous installerons et configurerons Mosquitto et utiliserons les certificats SSL de Let’Encrypt pour sécuriser notre trafic MQTT. Si vous avez besoin d'une couverture plus approfondie de l'une des étapes, veuillez consulter les didacticiels suivants:

Conditions préalables

Avant de commencer ce tutoriel, vous aurez besoin de:

  • Un serveur Ubuntu 18.04 avec un utilisateur non root, compatible sudo et un pare-feu de base configuré, comme détaillé dansthis Ubuntu 18.04 server setup tutorial

  • Un nom de domaine pointé sur votre serveur. Ce didacticiel utilisera l'espace réservémqtt.example.com tout au long

  • Le port 80 doit être inutilisé sur votre serveur. Si vous installez Mosquitto sur une machine avec un serveur Web qui occupe ce port, vous devrez utiliser une méthode différente pour récupérer les certificats, comme leswebroot mode de Certbot.

[[step-1 -—- installation-du-logiciel]] == Étape 1 - Installation du logiciel

Nous allons d’abord installer un référentiel logiciel personnalisé pour obtenir la dernière version de Certbot, le client Let’s Encrypt:

sudo add-apt-repository ppa:certbot/certbot

Appuyez surENTER pour accepter, puis installez les packages logiciels pour Mosquitto et Certbot:

sudo apt install certbot mosquitto mosquitto-clients

Ensuite, nous allons chercher notre certificat SSL.

[[step-2 -—- download-an-ssl-certificate]] == Étape 2 - Téléchargement d'un certificat SSL

Ouvrez le port80 dans votre pare-feu:

sudo ufw allow 80

Ensuite, exécutez Certbot pour récupérer le certificat. Assurez-vous de remplacer le nom de domaine de votre serveur ici:

sudo certbot certonly --standalone --preferred-challenges http -d mqtt.example.com

Vous serez invité à entrer une adresse électronique et à accepter les conditions d'utilisation. Après cela, vous devriez voir un message vous informant que le processus a abouti et où vos certificats sont stockés.

Nous allons configurer Mosquitto pour utiliser ces certificats ensuite.

[[step-3 -—- configuring-mosquitto]] == Étape 3 - Configuration de Mosquitto

Nous allons d’abord créer un fichier de mots de passe que Mosquitto utilisera pour authentifier les connexions. Utilisezmosquitto_passwd pour ce faire, en veillant à remplacer votre propre nom d'utilisateur préféré:

sudo mosquitto_passwd -c /etc/mosquitto/passwd your-username

Vous serez invité deux fois pour un mot de passe.

Ouvrez maintenant un nouveau fichier de configuration pour Mosquitto:

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

Cela ouvrira un fichier vide. Coller dans ce qui suit:

/etc/mosquitto/conf.d/default.conf

allow_anonymous false
password_file /etc/mosquitto/passwd

listener 1883 localhost

listener 8883
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

listener 8083
protocol websockets
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

Assurez-vous de remplacer le nom de domaine que vous avez utilisé à l'étape 2 parmqtt.example.com. Enregistrez et fermez le fichier lorsque vous avez terminé.

Ce fichier fait ce qui suit:

  • Désactiver les connexions anonymes

  • Utilise notre fichier de mots de passe pour activer l'authentification par mot de passe

  • Configure un écouteur non sécurisé sur le port 1883 pourlocalhost uniquement

  • Configure un écouteur sécurisé sur le port8883

  • Configure un écouteur sécurisé basé sur Websocket sur le port8083

Redémarrez Mosquitto pour prendre en compte les modifications de configuration:

sudo systemctl restart mosquitto

Vérifiez que le service fonctionne à nouveau:

sudo systemctl status mosquitto
Output● mosquitto.service - LSB: mosquitto MQTT v3.1 message broker
   Loaded: loaded (/etc/init.d/mosquitto; generated)
   Active: active (running) since Mon 2018-07-16 15:03:42 UTC; 2min 39s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 6683 ExecStop=/etc/init.d/mosquitto stop (code=exited, status=0/SUCCESS)
  Process: 6699 ExecStart=/etc/init.d/mosquitto start (code=exited, status=0/SUCCESS)
    Tasks: 1 (limit: 1152)
   CGroup: /system.slice/mosquitto.service
           └─6705 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

L'état doit êtreactive (running). Si ce n’est pas le cas, vérifiez votre fichier de configuration et redémarrez-le à nouveau. Certaines informations supplémentaires peuvent être disponibles dans le fichier journal de Mosquitto:

sudo tail /var/log/mosquitto/mosquitto.log

Si tout va bien, utilisezufw pour autoriser les deux nouveaux ports à traverser le pare-feu:

sudo ufw allow 8883
sudo ufw allow 8083

Maintenant que Mosquitto est configuré, nous allons configurer Certbot pour qu'il redémarre Mosquitto après le renouvellement de nos certificats.

[[step-4 -—- configuring-certbot-renewals]] == Étape 4 - Configuration des renouvellements de Certbot

Certbot renouvellera automatiquement nos certificats SSL avant leur expiration, mais il faut lui demander de redémarrer le service Mosquitto après l'avoir fait.

Ouvrez le fichier de configuration du renouvellement de Certbot pour votre nom de domaine:

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

Ajoutez l'optionrenew_hook suivante sur la dernière ligne:

/etc/letsencrypt/renewal/mqtt.example.com.conf

renew_hook = systemctl restart mosquitto

Enregistrez et fermez le fichier, puis exécutez une analyse à blanc pour vérifier que la syntaxe est correcte:

sudo certbot renew --dry-run

Si vous ne voyez aucune erreur, vous êtes tous ensemble. Essayons ensuite notre serveur MQTT.

[[step-5 -–- testing-mosquitto]] == Étape 5 - Test de Mosquitto

Nous avons installé des clients MQTT en ligne de commande à l’étape 1. Nous pouvons nous abonner au sujettest sur l'écouteur localhost comme ceci:

mosquitto_sub -h localhost -t test -u "your-user" -P "your-password"

Et nous pouvons publier avecmosquitto_pub:

mosquitto_pub -h localhost -t test -m "hello world" -u "your-user" -P "your-password"

Pour vous abonner à l'aide de l'écouteur sécurisé sur le port 8883, procédez comme suit:

mosquitto_sub -h mqtt.example.com -t test -p 8883 --capath /etc/ssl/certs/ -u "your-username" -P "your-password"

Et voici comment vous publiez sur l'auditeur sécurisé:

mosquitto_pub -h mqtt.example.com -t test -m "hello world" -p 8883 --capath /etc/ssl/certs/ -u "your-username" -P "your-password"

Notez que nous utilisons le nom d'hôte complet au lieu delocalhost. Comme notre certificat SSL est émis pourmqtt.example.com, si nous tentons une connexion sécurisée àlocalhost, nous obtiendrons une erreur indiquant que le nom d'hôte ne correspond pas au nom d'hôte du certificat.

Pour tester la fonctionnalité websocket, nous utiliserons un client MQTT public basé sur un navigateur. Open the Eclipse Paho javascript client utility in your browser et remplissez les informations de connexion comme suit:

  • Host est le domaine de votre serveur Mosquitto,mqtt.example.com

  • Port est8083

  • ClientId peut être laissé à la valeur aléatoire par défaut

  • Path peut être laissé à la valeur par défaut de/ws

  • Username est votre nom d'utilisateur Mosquitto de l'étape 3

  • Password est le mot de passe que vous avez choisi à l'étape 3

Les champs restants peuvent être laissés à leurs valeurs par défaut.

Après avoir appuyé surConnect, le client se connectera à votre serveur. Vous pouvez publier et vous abonner à l'aide des voletsSubscribe etPublish Message sous le voletConnection.

Conclusion

Nous avons maintenant configuré et testé un serveur MQTT sécurisé, protégé par un mot de passe et chiffré par SSL. Cela peut servir de plate-forme de messagerie robuste et sécurisée pour vos projets IoT, domotique ou autres.