Comment installer et sécuriser Mosquitto MQTT Messaging Broker sur Debian 8

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 of Things». Il est couramment utilisé pour la géolocalisation de parcs de véhicules, la domotique, les réseaux de capteurs environnementaux et la collecte de données à grande échelle.

Mosquitto est un serveur MQTT populaire (ou broker, dans le jargon MQTT) qui bénéficie d’un excellent support de la communauté et qui est facile à installer et à configurer.

Dans ce didacticiel, nous allons installer Mosquitto, récupérer les certificats SSL de Let’s Encrypt et configurer notre courtier pour qu’il utilise SSL pour sécuriser nos communications MQTT protégées par mot de passe.

Conditions préalables

Avant de commencer ce tutoriel, vous aurez besoin de:

Étape 1 - Installation de Mosquitto

Le paquet «+ mosquitto +» de Debian ne supporte pas certaines des fonctionnalités dont nous avons besoin, nous allons donc l’installer à partir d’un référentiel plus à jour fourni par le projet Mosquitto. Tout d’abord, téléchargez leur clé de signature du référentiel.

wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key

Puis installez la clé avec + apt-key +.

sudo apt-key add mosquitto-repo.gpg.key

Cela permet à + ​​apt-get + de vérifier l’intégrité de tout logiciel installé à partir du nouveau référentiel.

Indiquez maintenant + apt-get + où trouver le logiciel en ajoutant l’URL du référentiel à un fichier dans + / etc / apt / sources.list.d / +.

sudo nano /etc/apt/sources.list.d/mosquitto.list

Cela ouvrira un nouveau fichier vierge. Collez la ligne suivante dans le fichier.

/etc/apt/sources.list.d/mosquitto.list

deb http://repo.mosquitto.org/debian jessie main

Sauvegardez et fermez l’éditeur, puis mettez à jour avec + apt-get + pour extraire les informations du nouveau paquet.

sudo apt-get update

Et enfin, installez le paquet + mosquitto + et son logiciel client.

sudo apt-get install mosquitto mosquitto-clients

Par défaut, Debian démarrera le service Mosquitto après l’installation. Testons la configuration par défaut. Nous utiliserons l’un des clients que nous venons d’installer pour souscrire à un sujet de notre courtier.

Topics sont des étiquettes pour lesquelles vous publiez des messages et auxquelles vous vous abonnez. Ils sont organisés en une hiérarchie, vous pouvez donc avoir, par exemple, + capteurs / extérieur / température + et + capteurs / extérieur / humidité +. La façon dont vous organisez les sujets dépend de vous et de vos besoins. Tout au long de ce tutoriel, nous utiliserons un sujet de test simple pour tester nos modifications de configuration.

Connectez-vous une seconde fois à votre serveur pour disposer de deux terminaux côte à côte. Dans le nouveau terminal, utilisez + mosquitto_sub + pour vous abonner à la rubrique de test:

mosquitto_sub -h localhost -t test

L’indicateur + -h + spécifie le nom d’hôte du serveur MQTT, et + -t + est le nom de la rubrique. Vous ne verrez aucune sortie après avoir tapé + ENTER + car + mosquitto_sub + attend les messages. Revenez sur votre autre terminal et publiez un message:

mosquitto_pub -h localhost -t test -m "hello world"

Les options de + mosquitto_pub + sont identiques à celles de + mosquitto_sub +, bien que cette fois, nous utilisions l’option additionnelle + -m + pour spécifier notre message. Appuyez sur + ENTER +, et vous devriez voir * hello world * apparaître dans l’autre terminal. Vous avez envoyé votre premier message MQTT!

Appuyez sur + CTRL + C + dans le deuxième terminal pour sortir de + mosquitto_sub +, mais laissez la connexion au serveur ouverte. Nous allons l’utiliser à nouveau pour un autre test à l’étape 5.

Nous sécuriserons ensuite notre installation avec SSL à l’aide de Certbot, le nouveau client Let’s Encrypt.

Étape 2 - Installation de Certbot pour les certificats Let Encrypt

Let’s Encrypt est un nouveau service proposant des certificats SSL gratuits via une API automatisée. De nombreux clients peuvent communiquer avec l’API et Debian inclut le client officiel dans son référentiel par défaut, mais c’est un peu obsolète et il lui manque une fonctionnalité importante dont nous avons besoin.

Au lieu de cela, nous installerons le client à partir du référentiel + backports + de Debian. C’est un référentiel officiel qui rend les nouvelles versions de certains logiciels disponibles pour les versions déjà publiées de Debian. Nous devons ajouter le référentiel à notre liste de sources APT, comme nous l’avons fait à l’étape précédente.

Commencez par ouvrir un nouveau fichier dans + / etc / apt / sources.list.d / +.

sudo nano /etc/apt/sources.list.d/backports.list

Collez la ligne suivante dans le fichier:

/etc/apt/sources.list.d/backports.list

deb http://mirrors.digitalocean.com/debian jessie-backports main

Enregistrez le fichier et fermez l’éditeur. Ensuite, mettez à jour les informations sur le package.

sudo apt-get update

Et enfin, installez le client officiel Let’s Encrypt, appelé Certbot, ordonnant à APT d’utiliser + jessie-backports + comme source:

sudo apt-get install certbot -t jessie-backports

Maintenant que Certbot est installé, exécutons-le pour obtenir notre certificat.

Étape 3 - Exécution de Certbot

Certbot doit répondre à un défi cryptographique émis par l’API Let’s Encrypt afin de prouver que nous contrôlons notre domaine. Il utilise pour cela les ports + 80 + (HTTP) et / ou + 443 + (HTTPS). Nous utiliserons uniquement le port + 80 +, alors autorisez le trafic entrant sur ce port.

sudo ufw allow http
OutputRule added
Rule added (v6)

Nous pouvons maintenant exécuter Certbot pour obtenir notre certificat. Nous utiliserons l’option + - standalone + pour indiquer à Certbot de gérer lui-même la demande de challenge HTTP, et + - standalone-supported-challenges http-01 + limite la communication avec le port + 80 + . + -d + spécifie le domaine pour lequel vous souhaitez un certificat et + certonly + indique à Certbot de simplement récupérer le certificat sans effectuer aucune autre étape de configuration.

sudo certbot certonly --standalone --standalone-supported-challenges http-01 -d

Lors de l’exécution de la commande, vous serez invité à entrer une adresse électronique et à accepter les conditions d’utilisation. Après cela, vous verrez un message vous indiquant que le processus a abouti et où vos certificats sont stockés.

Nous avons nos certificats. Nous devons maintenant nous assurer que Certbot les renouvelle automatiquement au moment de leur expiration.

Étape 4 - Configuration des renouvellements automatiques de Certbot

Les certificats de Let Encrypt ne sont valables que quatre-vingt-dix jours. Cela encourage les utilisateurs à automatiser leur processus de renouvellement des certificats. Nous devrons mettre en place une commande qui vérifie régulièrement les certificats expirés et les renouvelle automatiquement.

Pour effectuer la vérification de renouvellement quotidiennement, nous utiliserons https://www.digitalocean.com/community/tutorials/how-to-use-cron-to-automate-tasks-on-a-vps [+ cron +], un service système standard pour l’exécution de travaux périodiques. Nous disons + cron + que faire en ouvrant et modifiant un fichier appelé + crontab +.

sudo crontab -e

Vous serez invité à sélectionner un éditeur de texte. Choisissez votre favori et on vous présentera la valeur par défaut + crontab + qui contient du texte d’aide. Collez la ligne suivante à la fin du fichier, puis enregistrez-le et fermez-le.

crontab

. . .
15 3 * * * certbot renew --noninteractive --post-hook "systemctl restart mosquitto"

La partie +15 3 * * * + 'de cette ligne signifie« exécutez la commande suivante à 3 h 15, tous les jours ». La commande `+ renew + pour Certbot vérifie tous les certificats installés sur le système et met à jour ceux qui sont définis pour expirer dans moins de trente jours. + - noninteractive + indique à Certbot de ne pas attendre l’entrée de l’utilisateur.

+ - post-hook" systemctl restart mosquitto "+ redémarre Mosquitto pour récupérer le nouveau certificat, mais uniquement si le certificat a été renouvelé. Cette fonctionnalité + post-hook + correspond aux anciennes versions du client Let’s Encrypt et explique pourquoi nous avons installé à partir de backports au lieu du référentiel Debian par défaut. Sans cela, nous devrions redémarrer Mosquitto tous les jours, même si aucun certificat n’a été mis à jour. Bien que vos clients MQTT doivent être configurés pour se reconnecter automatiquement, il est conseillé d’éviter de les interrompre quotidiennement sans raison valable.

Maintenant que le renouvellement automatique du certificat est terminé, nous allons revenir à la configuration de Mosquitto pour qu’il soit plus sécurisé.

Étape 5 - Configuration des mots de passe MQTT

Configurons Mosquitto pour utiliser des mots de passe afin de contrôler qui peut publier des messages. Mosquitto inclut un utilitaire permettant de générer un fichier de mot de passe spécial appelé + mosquitto_passwd +. Cette commande vous invitera à entrer un mot de passe pour le nom d’utilisateur spécifié et à placer les résultats dans + / etc / mosquitto / passwd +.

sudo mosquitto_passwd -c /etc/mosquitto/passwd

Créez maintenant un nouveau fichier de configuration pour Mosquitto et indiquez-lui d’utiliser ce fichier de mots de passe pour exiger des connexions pour toutes les connexions.

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

Cela devrait ouvrir un fichier vide. Coller dans ce qui suit:

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

allow_anonymous false
password_file /etc/mosquitto/passwd

+ allow_anonymous false + désactive toutes les connexions non authentifiées et la ligne + password_file + indique à Mosquitto où rechercher les informations sur l’utilisateur et le mot de passe. Enregistrez et quittez le fichier.

Vous devez maintenant redémarrer Mosquitto et tester vos modifications.

sudo systemctl restart mosquitto

Tout d’abord, essayez de publier un message sans mot de passe.

mosquitto_pub -h localhost -t "test" -m "hello world"

Le message devrait être rejeté:

OutputConnection Refused: not authorised.
Error: The connection was refused.

Avant de réessayer avec le mot de passe, revenez à la fenêtre de votre deuxième terminal et abonnez-vous à la rubrique * test * en utilisant le nom d’utilisateur et le mot de passe cette fois-ci:

mosquitto_sub -h localhost -t test -u "" -P ""

Il devrait se connecter et s’asseoir, en attente de messages. Vous pouvez laisser ce terminal ouvert et connecté pendant le reste du didacticiel, car nous lui enverrons périodiquement des messages de test.

Publiez maintenant un message avec votre autre terminal, à l’aide du nom d’utilisateur et du mot de passe.

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

Le message devrait passer comme à l’étape 1. Nous avons ajouté avec succès la protection par mot de passe à Mosquitto. Malheureusement, nous envoyons des mots de passe non cryptés sur Internet. Nous allons résoudre ce problème en ajoutant le cryptage SSL à Mosquitto.

Étape 6 - Configuration de MQTT SSL

Pour activer le cryptage SSL, nous devons indiquer à Mosquitto où sont stockés nos certificats Let’s Encrypt. Ouvrez le fichier de configuration que nous avons précédemment lancé.

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

Collez ce qui suit à la fin du fichier, en laissant les deux lignes que nous avons déjà ajoutées:

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

. . .
listener 1883 localhost

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

Nous ajoutons deux blocs + auditeur + distincts à la configuration. Le premier, + listener 1883 localhost +, met à jour le programme d’écoute MQTT par défaut sur le port + 1883 +, ce à quoi nous nous sommes connectés jusqu’à présent. + 1883 + est le port MQTT standard non chiffré. La partie + localhost + de la ligne indique à Mosquitto de n’associer que ce port à l’interface localhost, de sorte qu’il ne soit pas accessible de l’extérieur. Les demandes externes auraient de toute façon été bloquées par notre pare-feu, mais il est bon d’être explicite.

+ listener 8883 + configure un auditeur crypté sur le port + 8883 +. Il s’agit du port standard pour MQTT + SSL, souvent appelé MQTTS. Les trois lignes suivantes, + certfile +, '+ cafile + , et' + keyfile +, toutes dirigent Mosquitto vers les fichiers Let’s Encrypt appropriés pour configurer les connexions chiffrées.

Enregistrez et quittez le fichier, puis redémarrez Mosquitto pour mettre à jour les paramètres.

sudo systemctl restart mosquitto

Mettez à jour le pare-feu pour autoriser les connexions au port + 8883 +.

sudo ufw allow 8883
OutputRule added
Rule added (v6)

Maintenant testez à nouveau en utilisant + mosquitto_pub +, avec quelques options différentes pour SSL:

mosquitto_pub -h  -t test -m "hello again" -p 8883 --capath /etc/ssl/certs/ -u "" -P ""

Notez que nous utilisons le nom d’hôte complet au lieu de + localhost +. Comme notre certificat SSL est émis pour ++, si nous essayons 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 (même s’ils pointent tous deux vers le même serveur Mosquitto). .

+ - capath / etc / ssl / certs / + active SSL pour + mosquitto_pub +, et lui indique où rechercher les certificats racine. Celles-ci sont généralement installées par votre système d’exploitation, le chemin est donc différent pour macOS, Windows, etc. + mosquitto_pub utilise le certificat racine pour vérifier que le certificat du serveur Mosquito a été correctement signé par l’autorité de certification Let’s Encrypt. Il est important de noter que + mosquitto_pub + et + mosquitto_sub + ne tenteront pas une connexion SSL sans cette option (ou l’option similaire + - cafile +), même si vous vous connectez au port sécurisé standard de `+ 8883 + `.

Si tout se passe bien avec le test, vous verrez à nouveau * bonjour * apparaître dans l’autre terminal + mosquitto_sub +. Cela signifie que votre serveur est entièrement configuré! Si vous souhaitez étendre le protocole MQTT pour qu’il fonctionne avec des websockets, vous pouvez suivre la dernière étape.

Étape 7 - Configuration de MQTT sur Websockets (facultatif)

Afin de parler MQTT à l’aide de JavaScript à partir de navigateurs Web, le protocole a été adapté pour fonctionner sur des Websockets standard. Si vous n’avez pas besoin de cette fonctionnalité, vous pouvez ignorer cette étape.

Nous devons ajouter encore un bloc + auditeur + à notre config Mosqiutto.

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

A la fin du fichier, ajoutez ce qui suit:

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

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

Ceci est généralement identique au bloc précédent, à l’exception du numéro de port et de la ligne + protocole websockets +. Il n’y a pas de port officiel normalisé pour MQTT sur les websockets, mais + 8083 + est le plus courant.

Enregistrez et quittez le fichier, puis redémarrez Mosquitto.

sudo systemctl restart mosquitto

Maintenant, ouvrez le port + 8083 + dans le pare-feu.

sudo ufw allow 8083

Pour tester cette fonctionnalité, nous allons utiliser un client MQTT public basé sur un navigateur. Il en existe quelques-uns, mais mqtt-admin est simple et direct. Open mqtt-admin dans votre navigateur. Vous verrez ce qui suit:

image: https: //assets.digitalocean.com/articles/mosquitto-debian/SJRJgLX.png [écran initial de mqtt-admin]

Remplissez les informations de connexion comme suit:

  • * Le protocole * doit être * wss * (ce qui signifie w eb s ocket s ecure).

  • * Host * devrait être le domaine de votre serveur Mosquitto, ++.

  • * Le port * devrait être + 8083 +.

  • * Utilisateur * doit être votre nom d’utilisateur Mosquitto; ici, nous avons utilisé * sammy *.

  • * Password * devrait être le mot de passe que vous avez choisi.

  • * ClientId * peut être laissé à la valeur par défaut, * mqtt-admin *.

Après avoir appuyé sur * Save Settings *, + mqtt-admin + se connectera à votre serveur Mosquitto. Dans l’écran suivant, remplissez * Topic * comme * test *, entrez un message pour * Payload *, puis appuyez sur * Publish *. Le message sera affiché dans le terminal + mosquitto_sub +.

Conclusion

Nous avons maintenant configuré un serveur MQTT sécurisé, protégé par un mot de passe, avec renouvellement automatique des certificats SSL à partir du service Let’s Encrypt. Cela servira de plate-forme de messagerie robuste et sécurisée pour tous les projets que vous rêvez. Certains logiciels et matériels courants qui fonctionnent bien avec le protocole MQTT comprennent:

  • OwnTracks, une application de géolocalisation open source que vous pouvez installer sur votre téléphone. OwnTracks transmettra périodiquement des informations de position à votre serveur MQTT, que vous pourrez ensuite stocker et afficher sur une carte, ou créer des alertes et activer le matériel IoT en fonction de votre emplacement.

  • Node-RED est une interface graphique basée sur un navigateur permettant de «relier ensemble» l’Internet des objets. Vous faites glisser la sortie d’un nœud vers l’entrée d’un autre et vous pouvez acheminer des informations via des filtres, entre divers protocoles, dans des bases de données, etc. MQTT est très bien supporté par Node-RED.

  • Le ESP8266 est un microcontrôleur wifi peu coûteux doté de capacités MQTT. Vous pouvez en câbler une pour publier des données de température sur un sujet, ou peut-être souscrire à un sujet de pression barométrique et faire retentir une sonnerie lorsqu’un orage arrive!

Ce ne sont que quelques exemples populaires de l’écosystème MQTT. Il y a beaucoup plus de matériel et de logiciels qui parlent le protocole. Si vous avez déjà une plate-forme matérielle favorite ou un langage logiciel, celle-ci dispose probablement des fonctionnalités MQTT. Amusez-vous à parler de vos «choses»!