GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

So installieren und sichern Sie den Mosquitto MQTT Messaging Broker unter Ubuntu 20.04

Mosquitto ist ein Open-Source-Message-Broker, der den Message Queuing Telemetry Transport (MQTT) verwendet ) Protokoll. Das Protokoll wurde entwickelt, um eine leichte Kommunikation mit dem Internet der Dinge (IoT) bereitzustellen ) Geräte. Es wird häufig für die GPS-Verfolgung von Fahrzeugen, die Heimautomatisierung, Umweltsensoren und die groß angelegte Datenerfassung verwendet.

Das MQTT-Protokoll läuft auf dem TCP/IP-Modell. Da es leicht ist, ermöglicht Ihnen sein kleiner Code-Fußabdruck, Anwendungen für Geräte mit minimalen Ressourcen zu erstellen. Es basiert auf dem Publish/Subscribe-Modell. Bei diesem Modell verbindet sich der Client mit dem Mosquitto-Server, der als Broker fungiert, um Informationen an andere Clients zu senden, die einen Kanal abonniert haben.

In diesem Tutorial installieren Sie Mosquitto und richten den Broker so ein, dass er SSL zum Schutz der Kommunikation verwendet.

Voraussetzungen

  • Ein Ubuntu 20.04-Server mit einem Nicht-Root-Benutzer mit sudo-Berechtigungen.
  • Ein Domänenname (myqtt.example.com ) auf Ihren Server verwiesen.

Schritt 1 – Mosquitto Server und Client installieren

Ubuntu wird mit der älteren Version 1.6 von Mosquitto ausgeliefert. Um die neueste Version zu installieren, fügen Sie das offizielle Mosquitto-Repository hinzu.

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

Installieren Sie den Mosquitto-Server und den Client.

$ sudo apt install mosquitto mosquitto-clients

Überprüfen Sie den Status des Servers.

$ sudo systemctl status mosquitto? mosquitto.service – Mosquitto MQTT Broker Geladen:geladen (/lib/systemd/system/mosquitto.service; aktiviert; Herstellervoreinstellung:aktiviert) Aktiv:aktiv (läuft) seit Di 2022-01-25 09:18:40 UTC; vor 25s Dokumente:man:mosquitto.conf(5) man:mosquitto(8) Haupt-PID:119694 (Mosquitto) Aufgaben:1 (Limit:2274) Speicher:1,0 MB CGroup:/system.slice/mosquitto.service ??119694 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf Jan 25 09:18:39  systemd[1]:Mosquitto MQTT Broker wird gestartet ... Jan 25 09:18:40  systemd[1 ]:Mosquitto MQTT Broker gestartet.

Schritt 2 – MQTT-Passwortauthentifizierung konfigurieren

Mosquitto enthält ein Dienstprogramm zum Generieren einer Kennwortdatei namens mosquitto_passwd . Mosquitto speichert alle Konfigurationen in /etc/mosquitto Verzeichnis.

Führen Sie den folgenden Befehl aus, um eine verschlüsselte Passwortdatei unter /etc/mosquitto/passwd zu generieren für den Benutzernamen username . Geben Sie ein Passwort Ihrer Wahl ein.

$ sudo mosquitto_passwd -c /etc/mosquitto/passwd BenutzernamePasswort:Passwort erneut eingeben:

Als nächstes erstellen Sie eine default.conf Datei unter /etc/mosquitto/conf.d Verzeichnis und öffnen Sie es zum Bearbeiten.

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

Fügen Sie die folgenden Zeilen ein, um den Speicherort der Kennwortdatei anzugeben. Wenn Sie das Listener-Feld weglassen, wird die Verbindung immer anonym hergestellt, unabhängig von der Konfiguration.

Listener 1883Passwortdatei /etc/mosquitto/passwd

Speichern Sie die Datei, indem Sie Strg + X drücken und geben Sie Y ein wenn Sie dazu aufgefordert werden.

Starten Sie den Mosquitto-Server neu, um die Änderung zu implementieren.

$ sudo systemctl Mosquitto neu starten

Schritt 3 – Testen Sie den Mosquitto-Client

Je nach Anwendungsfall können Sie mit dem Mosquitto-Client Nachrichten zu unterschiedlichen Themen senden und empfangen. Ein Kunde ist entweder ein Abonnent oder ein Herausgeber.

Der nächste Schritt besteht darin, ein Thema zu abonnieren. Im MQTT-Protokoll bezieht sich ein Thema auf eine Zeichenfolge, die vom Server/Broker verwendet wird, um Nachrichten für die verbundenen Clients zu filtern. Hier sind einige Beispielthemen, die Sie in einer Heimautomatisierungsanwendung verwenden können.

  • home/lights/sitting_room
  • Haus/Licht/Küche
  • home/lights/master_bedroom
  • home/lights/kids_bedroom

Um ein Thema zu abonnieren, führen Sie mosquitto_sub -t aus Befehl gefolgt vom Thema. Zum Beispiel, um home/lights/kitchen zu abonnieren Thema, führen Sie den folgenden Befehl aus.

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

Schließen Sie das vorhandene Fenster nicht. Öffnen Sie ein neues Terminalfenster, um eine Nachricht an home/lights/kitchen zu veröffentlichen Thema mit dem folgenden Befehl.

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

Gehen Sie zurück zum ersten Terminalfenster und Sie erhalten ON Nutzlast.

EIN

Als nächstes senden Sie den OFF Nachricht zum gleichen Thema vom zweiten Terminal.

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

Das erste Terminal zeigt die neu veröffentlichte Nachricht.

EINAUS

Wenn Sie versuchen, einen nicht authentifizierten Kommentar zu senden, schlägt dies fehl. Versuchen Sie beispielsweise den folgenden Befehl.

$ mosquitto_sub -t "home/lights/sitting_room"Verbindungsfehler:Verbindung abgelehnt:nicht autorisiert.

Es wird nicht empfohlen, aber Sie müssen die folgende Zeile zu /etc/mosquitto/conf.d/default.conf hinzufügen Datei, wenn Sie die Befehle ohne Authentifizierung ausführen möchten.

allow_anonymous true

Schritt 4 – SSL installieren

Um ein SSL-Zertifikat mit Let’s Encrypt zu installieren, müssen wir das Certbot-Tool herunterladen. Wir werden dafür das Snapd-Paketinstallationsprogramm verwenden.

Installieren Sie das Snap-Installationsprogramm.

$ sudo apt install snapd

Stellen Sie sicher, dass Ihre Version von Snapd auf dem neuesten Stand ist.

$ sudo snap install core $ sudo snap refresh core

Certbot installieren.

$ sudo snap install --classic certbot

Verwenden Sie den folgenden Befehl, um sicherzustellen, dass der Certbot-Befehl ausgeführt wird, indem Sie einen symbolischen Link zu /usr/bin erstellen Verzeichnis.

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

Generieren Sie ein SSL-Zertifikat.

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

Der obige Befehl lädt ein Zertifikat in /etc/letsencrypt/live/mqtt.example.com herunter Verzeichnis auf Ihrem Server.

Erstellen Sie eine Diffie-Hellman-Gruppe Zertifikat.

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

Erstellen Sie ein Challenge-Web-Root-Verzeichnis für die automatische Verlängerung von Let's Encrypt.

$ sudo mkdir -p /var/lib/letsencrypt

Erstellen Sie einen Cron-Job, um das SSL zu erneuern. Es wird jeden Tag ausgeführt, um das Zertifikat zu überprüfen und bei Bedarf zu erneuern. Erstellen Sie dazu zunächst die Datei /etc/cron.daily/certbot-renew und zum Bearbeiten öffnen.

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

Fügen Sie den folgenden Code ein.

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

Speichern Sie die Datei, indem Sie Strg + X drücken und geben Sie Y ein wenn Sie dazu aufgefordert werden.

Ändern Sie die Berechtigungen für die Aufgabendatei, um sie ausführbar zu machen.

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

Schritt 5 – MQTT SSL konfigurieren

Nachdem wir nun die SSL-Zertifikate bereit haben, müssen wir Mosquitto Zugriff darauf gewähren. Dazu müssen wir die Zertifikate an einen Ort kopieren, von dem aus Mosquitto darauf zugreifen kann.

$ 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

Ändern Sie den Besitz von /etc/mosquitto/certs Verzeichnis zum mosquitto Benutzer, der während der Installation erstellt wurde.

$ sudo chown mosquitto:/etc/mosquitto/certs

Der nächste Schritt zum Aktivieren der SSL-Verschlüsselung für Mosquitto besteht darin, den Speicherort der SSL-Zertifikate anzugeben. Öffnen Sie die Konfigurationsdatei zum Bearbeiten.

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

Fügen Sie den folgenden Code am Ende der Datei ein.

. . .listener 8883certfile /etc/mosquitto/certs/server.pemcafile /etc/ssl/certs/ISRG_Root_X1.pemkeyfile /etc/mosquitto/certs/server.keydhparamfile /etc/ssl/certs/dhparam.pem

Speichern Sie die Datei, indem Sie Strg + X drücken und geben Sie Y ein wenn Sie dazu aufgefordert werden. Achten Sie darauf, am Ende der Datei einen abschließenden Zeilenumbruch zu hinterlassen.

Der listener 8883 Teil richtet den verschlüsselten Listener ein. Es ist der Standardport für MQTT + SSL, der als MQTTS bezeichnet wird. Die nächsten vier Zeilen geben den Speicherort der SSL-Dateien an.

Starten Sie Mosquitto neu, um die Einstellungen zu aktualisieren.

$ sudo systemctl Mosquitto neu starten

Sie müssen die Firewall aktualisieren, um Verbindungen zu Port 8883 zuzulassen.

$ sudo ufw erlauben 8883

Als nächstes müssen wir die Funktionalität mit mosquitto_pub testen Befehl.

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

Wie Sie sehen können, haben wir bestimmte zusätzliche Parameter hinzugefügt, darunter die Portnummer und den Pfad zu den SSL-Zertifikaten. Wann immer Sie SSL verwenden müssen, müssen Sie immer den vollständigen Hostnamen angeben, d. h. mqtt.example.com statt localhost andernfalls würde es einen Fehler geben.

Sie müssen auch --capath hinzufügen Anweisung jedes Mal. Es weist den Mosquitto-Client an, nach Root-Zertifikaten zu suchen, die vom Betriebssystem installiert wurden.

Schritt 6 – SSL-Verlängerung konfigurieren

Certbot erneuert Ihr Zertifikat automatisch, bevor es abläuft. Aber es muss gesagt werden, dass es die erneuerten Zertifikate nach /etc/mosquitto/certs kopieren soll Verzeichnis und starten Sie den Mosquitto-Dienst neu.

Wir werden das tun, indem wir ein Shell-Skript erstellen. Erstellen Sie eine Datei mosquitto-copy.sh in /etc/letsencrypt/renewal-hooks/deploy Verzeichnis.

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

Fügen Sie den folgenden Code darin ein. Ersetzen Sie den Wert von MY_DOMAIN Variable mit Ihrer Domain. Der ${RENEWED_LINEAGE} Variable zeigt auf /etc/letsencrypt/live/mqtt.example.com Verzeichnis während der Erneuerung.

# Legen Sie fest, für welche Domain dieses Skript ausgeführt werden sollMY_DOMAIN=mqtt.example.com# Legen Sie das Verzeichnis fest, in das die Zertifikate kopiert werden.CERTIFICATE_DIR=/etc/mosquitto/certsif [ "${RENEWED_DOMAINS}" ="${ MEINE_DOMAIN}" ]; then # Neues Zertifikat ins Mosquitto-Verzeichnis kopieren cp ${RENEWED_LINEAGE}/fullchain.pem ${CERTIFICATE_DIR}/server.pem cp ${RENEWED_LINEAGE}/privkey.pem ${CERTIFICATE_DIR}/server.key # Eigentümerschaft auf Mosquitto chown mosquitto setzen:${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Sicherstellen, dass die Berechtigungen restriktiv sind chmod 0600 ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Mosquitto anweisen, Zertifikate und Konfiguration neu zu laden pkill -HUP -x mosquittofi

Speichern Sie die Datei, indem Sie Strg + X drücken und geben Sie Y ein wenn Sie dazu aufgefordert werden.

Machen Sie die Datei ausführbar.

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

Dieses Skript wird automatisch bei jeder erfolgreichen Verlängerung des Zertifikats ausgeführt.

Wenn Sie Mosquitto und einen Webserver wie Nginx ausführen, müssen Sie Certbot anweisen, den Server vor der Erneuerung zu stoppen und nach Abschluss erneut zu starten. Öffnen Sie dazu die Datei etc/letsencrypt/renewal/mqtt.example.com.conf .

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

Fügen Sie die folgenden Zeilen am Ende der Datei hinzu. Passen Sie die Befehle entsprechend dem von Ihnen verwendeten Webserver an.

pre_hook =systemctl stoppt nginxpost_hook =systemctl startet nginx

Speichern Sie die Datei, indem Sie Strg + X drücken und geben Sie Y ein wenn Sie dazu aufgefordert werden.

Führen Sie zur Überprüfung einen Certbot-Trockenlauf durch.

$ sudo certbot renew --dry-run

Wenn Sie keine Fehler sehen, bedeutet dies, dass alles eingestellt ist.

Schritt 7 – Websockets konfigurieren

Sie können Mosquitto so konfigurieren, dass es das MQTT-Protokoll in Browsern verwendet, die Javascript verwenden, indem Sie die Websockets-Funktionalität verwenden. Um es zu aktivieren, öffnen Sie die Konfigurationsdatei.

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

Fügen Sie die folgenden Zeilen am Ende der Datei ein.

. . .listener 8083-Protokoll websocketscertfile /etc/mosquitto/certs/server.pemcafile /etc/ssl/certs/ISRG_Root_X1.pemkeyfile /etc/mosquitto/certs/server.keydhparamfile /etc/ssl/certs/dhparam.pem

Speichern Sie die Datei, indem Sie Strg + X drücken und geben Sie Y ein wenn Sie dazu aufgefordert werden.

Wie Sie bemerken, ist es derselbe Block wie der, den wir zum Aktivieren von SSL verwendet haben, mit Ausnahme der Portnummer und der Protokollfelder. 8083 ist der gebräuchlichste Port, der von MQTT verwendet wird, um mit WebSockets zu kommunizieren.

Starten Sie den Mosquitto-Dienst neu.

$ sudo systemctl Mosquitto neu starten

Öffnen Sie Port 8083.

$ sudo ufw erlauben 8083

Wir müssen einen browserbasierten MQTT-Client verwenden, um die WebSockets-Funktionalität zu testen. Es sind viele Clients verfügbar, aber wir werden den HiveMQ-Websocket-Client für unseren Zweck verwenden. Starten Sie den Client in Ihrem Browser und Sie werden Folgendes sehen.

Füllen Sie die Felder wie im obigen Screenshot gezeigt aus.

  • Der Host sollte die Domäne Ihres Mosquitto-Servers sein, mqtt.example.com.
  • Port sollte 8083 sein.
  • ClientID-Feld kann so belassen werden.
  • Der Benutzername sollte Ihr Mosquitto-Benutzername sein.
  • Passwort sollte das Passwort sein, das Sie oben erstellt haben.
  • Überprüfen Sie das SSL Feld.

Drücken Sie auf Verbinden klicken, und der HiveMQ-Client wird mit Ihrem Mosquitto-Server verbunden.

Sobald die Verbindung hergestellt ist, geben Sie home/lights/kitchen ein Geben Sie als Thema eine beliebige Nachricht ein und klicken Sie auf Veröffentlichen .

Die Nachricht wird in Ihrem mosquitto_sub angezeigt Terminalfenster, das die erfolgreiche Verbindung bestätigt.

Dies zeigt, dass die Websockets-Implementierung erfolgreich ist.

Schlussfolgerung

Damit ist unsere Einrichtung eines sicheren, passwortgeschützten und SSL-verschlüsselten MQTT-Servers auf einem Ubuntu 20.04-basierten Rechner abgeschlossen. Wenn Sie Fragen haben, posten Sie diese in den Kommentaren unten.


Ubuntu
  1. So installieren und sichern Sie phpMyAdmin unter Ubuntu

  2. So installieren Sie Node.js und NPM unter Ubuntu 18.04 und 20.04

  3. So installieren Sie PHP 7.4 und 8.0 auf Ubuntu 18.04 oder 20.04

  4. So installieren und sichern Sie Redis unter Ubuntu 20.04

  5. So installieren und sichern Sie Redis unter Ubuntu 18.04

So installieren und verwenden Sie R unter Ubuntu

So installieren und verwenden Sie den Exa-Befehl unter Ubuntu 20.04

So installieren Sie Mosquitto MQTT unter Ubuntu 20.04 LTS

So installieren und sichern Sie phpMyAdmin in Ubuntu 14.04

So installieren und sichern Sie Memcached unter Ubuntu 18.04

So installieren Sie Signal Messaging unter Ubuntu 20.04