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

Einführung

MQTT ist ein Messaging-Protokoll von Maschine zu Maschine, das eine einfache Publish / Subscribe-Kommunikation für „Internet of Things“ -Geräte ermöglicht. Es wird häufig für die Geoverfolgung von Fahrzeugflotten, für die Hausautomation, für Umweltsensornetzwerke und für die Datenerfassung im Versorgungsmaßstab verwendet.

Mosquitto ist ein beliebter MQTT-Server (oder broker im MQTT-Sprachgebrauch), der hervorragende Community-Unterstützung bietet und einfach zu installieren und zu konfigurieren ist.

In diesem Lernprogramm installieren wir Mosquitto und richten unseren Broker für die Verwendung von SSL ein, um unsere kennwortgeschützte MQTT-Kommunikation zu sichern.

Voraussetzungen

Bevor Sie dieses Tutorial starten können, benötigen Sie:

Schritt 1 - Installieren von Mosquitto

Ubuntu 18.04 hat eine relativ neue Version von Mosquitto in seinem Standard-Software-Repository, sodass wir sie von dort aus installieren können.

Melden Sie sich zuerst mit Ihrem Nicht-Root-Benutzer an und aktualisieren Sie die Paketlisten mit + apt update +:

sudo apt update

Installieren Sie jetzt Mosquitto mit + apt install:

sudo apt install mosquitto mosquitto-clients

Standardmäßig startet Ubuntu den Mosquitto-Dienst nach der Installation. Testen wir die Standardkonfiguration. Wir werden einen der Mosquitto-Clients verwenden, die wir gerade installiert haben, um ein Thema auf unserem Broker zu abonnieren.

Topics sind Labels, für die Sie Nachrichten veröffentlichen und die Sie abonnieren. Sie sind hierarchisch angeordnet, so dass Sie beispielsweise "+ Sensoren / Außen / Temperatur " und " Sensoren / Außen / Luftfeuchtigkeit +" haben können. Wie Sie Themen arrangieren, hängt von Ihnen und Ihren Bedürfnissen ab. In diesem Tutorial werden wir ein einfaches Testthema verwenden, um unsere Konfigurationsänderungen zu testen.

Melden Sie sich ein zweites Mal bei Ihrem Server an, sodass Sie zwei Terminals nebeneinander haben. Verwenden Sie im neuen Terminal "+ mosquitto_sub +", um das Testthema zu abonnieren:

mosquitto_sub -h localhost -t test

"+ -h " wird verwendet, um den Hostnamen des MQTT-Servers anzugeben, und " -t " ist der Themenname. Nach dem Drücken von " ENTER " wird keine Ausgabe angezeigt, da " mosquitto_sub +" auf das Eintreffen von Nachrichten wartet. Wechseln Sie zurück zu Ihrem anderen Terminal und veröffentlichen Sie eine Nachricht:

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

Die Optionen für "+ mosquitto_pub " sind die gleichen wie " mosquitto_sub ", allerdings verwenden wir dieses Mal die zusätzliche Option " -m ", um unsere Nachricht zu spezifizieren. Drücken Sie ` ENTER +`, und im anderen Terminal sollte * Hallo Welt * auftauchen. Sie haben Ihre erste MQTT-Nachricht gesendet.

Geben Sie im zweiten Terminal "+ STRG + C " ein, um " mosquitto_sub +" zu beenden, aber halten Sie die Verbindung zum Server offen. Wir werden es in Schritt 5 für einen weiteren Test erneut verwenden.

Als Nächstes sichern wir unsere Installation mit einer kennwortbasierten Authentifizierung.

Schritt 2 - Konfigurieren von MQTT-Kennwörtern

Lassen Sie uns Mosquitto für die Verwendung von Passwörtern konfigurieren. Mosquitto enthält ein Hilfsprogramm zum Generieren einer speziellen Kennwortdatei mit dem Namen "+ mosquitto_passwd ". Dieser Befehl fordert Sie auf, ein Kennwort für den angegebenen Benutzernamen einzugeben und die Ergebnisse in ` / etc / mosquitto / passwd +` abzulegen.

sudo mosquitto_passwd -c /etc/mosquitto/passwd

Jetzt öffnen wir eine neue Konfigurationsdatei für Mosquitto und teilen ihr mit, dass sie diese Kennwortdatei verwenden soll, um Anmeldungen für alle Verbindungen zu erfordern:

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

Dies sollte eine leere Datei öffnen. Fügen Sie Folgendes ein:

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

allow_anonymous false
password_file /etc/mosquitto/passwd

Stellen Sie sicher, dass am Ende der Datei ein Zeilenumbruch steht.

+ allow_anonymous false + deaktiviert alle nicht authentifizierten Verbindungen und die Zeile + password_file + teilt Mosquitto mit, wo nach Benutzer- und Kennwortinformationen gesucht werden soll. Speichern und schließen Sie die Datei.

Jetzt müssen wir Mosquitto neu starten und unsere Änderungen testen.

sudo systemctl restart mosquitto

Versuchen Sie eine Nachricht ohne Passwort zu veröffentlichen:

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

Die Nachricht sollte abgelehnt werden:

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

Bevor wir es mit dem Passwort erneut versuchen, wechseln Sie erneut in Ihr zweites Terminalfenster und abonnieren Sie das Thema "Test". Verwenden Sie dabei dieses Mal Benutzername und Passwort:

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

Es sollte sich verbinden und auf Nachrichten warten. Sie können dieses Terminal für den Rest des Lernprogramms geöffnet und verbunden lassen, da wir ihm regelmäßig Testnachrichten senden.

Veröffentlichen Sie nun eine Nachricht mit Ihrem anderen Terminal, und verwenden Sie dabei erneut den Benutzernamen und das Kennwort:

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

Die Nachricht sollte wie in Schritt 1 durchgehen. Wir haben Mosquitto erfolgreich mit einem Passwort geschützt. Leider senden wir Passwörter unverschlüsselt über das Internet. Wir werden das als Nächstes beheben, indem wir Mosquitto SSL-Verschlüsselung hinzufügen.

Schritt 3 - Konfigurieren von MQTT SSL

Um die SSL-Verschlüsselung zu aktivieren, müssen wir Mosquitto mitteilen, wo unsere Let’s Encrypt-Zertifikate gespeichert sind. Öffnen Sie die zuvor gestartete Konfigurationsdatei:

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

Fügen Sie am Ende der Datei Folgendes ein, wobei Sie die beiden bereits hinzugefügten Zeilen belassen:

/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

Stellen Sie auch hier sicher, dass Sie am Ende der Datei eine abschließende neue Zeile einfügen.

Wir fügen der Konfiguration zwei separate "+ Listener " - Blöcke hinzu. Der erste, " Listener 1883 localhost ", aktualisiert den Standard-MQTT-Listener an Port " 1883 ", mit dem wir uns bisher verbunden haben. ` 1883 ` ist der unverschlüsselte Standard-MQTT-Port. Der Teil " localhost +" in der Zeile weist Mosquitto an, diesen Port nur an die Schnittstelle "localhost" zu binden, damit von außen nicht darauf zugegriffen werden kann. Externe Anfragen wären ohnehin von unserer Firewall blockiert worden, aber es ist gut, explizit darauf hinzuweisen.

+ Listener 8883 + richtet einen verschlüsselten Listener an Port + 8883 + ein. Dies ist der Standardport für MQTT + SSL, der häufig als MQTTS bezeichnet wird. Die nächsten drei Zeilen, "+ certfile ", " cafile " und " keyfile +", verweisen Mosquitto auf die entsprechenden "Let’s Encrypt" -Dateien, um die verschlüsselten Verbindungen einzurichten.

Speichern und beenden Sie die Datei und starten Sie Mosquitto neu, um die Einstellungen zu aktualisieren:

sudo systemctl restart mosquitto

Aktualisieren Sie die Firewall, um Verbindungen zum Port "+ 8883 +" zuzulassen.

sudo ufw allow 8883
OutputRule added
Rule added (v6)

Jetzt testen wir erneut mit + mosquitto_pub +, mit ein paar verschiedenen Optionen für SSL:

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

Beachten Sie, dass wir anstelle von "+ localhost " den vollständigen Hostnamen verwenden. Da unser SSL-Zertifikat für "+" ausgestellt wurde, erhalten wir beim Versuch, eine sichere Verbindung zu "+ localhost +" herzustellen, die Fehlermeldung, dass der Hostname nicht mit dem Hostnamen des Zertifikats übereinstimmt (obwohl beide auf denselben Mosquitto-Server verweisen). .

+ - capath / etc / ssl / certs / + aktiviert SSL für + mosquitto_pub + und teilt ihm mit, wo nach Stammzertifikaten gesucht werden soll. Diese werden normalerweise von Ihrem Betriebssystem installiert, sodass der Pfad für Mac OS, Windows usw. unterschiedlich ist. + mosquitto_pub verwendet das Stammzertifikat, um zu überprüfen, ob das Zertifikat des Moskitoservers von der Zertifizierungsstelle Let’s Encrypt ordnungsgemäß signiert wurde. Es ist wichtig zu beachten, dass "+ mosquitto_pub " und " mosquitto_sub " keine SSL-Verbindung ohne diese Option (oder die ähnliche Option " - cafile ") versuchen, selbst wenn Sie eine Verbindung zum sicheren Standardport von "" herstellen 8883 + `.

Wenn alles mit dem Test gut läuft, werden wir sehen, dass * hallo nochmal * im anderen "+ mosquitto_sub +" - Terminal angezeigt wird. Dies bedeutet, dass Ihr Server vollständig eingerichtet ist! Wenn Sie das MQTT-Protokoll für die Arbeit mit Websockets erweitern möchten, können Sie den letzten Schritt ausführen.

Schritt 4 - Konfigurieren von MQTT über Websockets (optional)

Um MQTT mit JavaScript aus Webbrowsern heraus zu sprechen, wurde das Protokoll so angepasst, dass es über Standard-Websockets funktioniert. Wenn Sie diese Funktion nicht benötigen, können Sie diesen Schritt überspringen.

Wir müssen unserer Mosquitto-Konfiguration noch einen + Listener + Block hinzufügen:

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

Fügen Sie am Ende der Datei Folgendes hinzu:

/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

Stellen Sie auch hier sicher, dass Sie am Ende der Datei eine abschließende neue Zeile einfügen.

Dies ist größtenteils derselbe wie der vorherige Block, mit Ausnahme der Portnummer und der Zeile "+ protocol websockets ". Es gibt keinen offiziellen standardisierten Port für MQTT über Websockets, aber am häufigsten ist " 8083 +".

Speichern und beenden Sie die Datei und starten Sie Mosquitto neu.

sudo systemctl restart mosquitto

Öffnen Sie nun den Port "+ 8083 +" in der Firewall.

sudo ufw allow 8083

Zum Testen dieser Funktionalität verwenden wir einen öffentlichen, browserbasierten MQTT-Client. Es gibt einige, aber die Verwendung des Eclipse Paho JavaScript Client ist einfach und unkompliziert. Öffnen Sie den Paho-Client in Ihrem Browser. Folgendes wird angezeigt:

image: http: //assets.digitalocean.com/articles/mosquitto/paho.png [Paho-Client-Bildschirm]

Füllen Sie die Verbindungsinformationen wie folgt aus:

  • * Host * sollte die Domain für Ihren Mosquitto-Server sein, ++.

  • * Port * sollte "+ 8083 +" sein.

  • * ClientId * kann auf den Standardwert * js-utility-DI1m6 * gesetzt werden.

  • * Path * kann auf den Standardwert * / ws * gesetzt werden.

  • * Benutzername * sollte Ihr Mosquitto-Benutzername sein; hier haben wir * sammy * benutzt.

  • * Passwort * sollte das von Ihnen gewählte Passwort sein.

Die übrigen Felder können auf ihren Standardwerten belassen werden.

Nach dem Drücken von * Connect * stellt der Paho-Browser-basierte Client eine Verbindung zu Ihrem Mosquitto-Server her.

Um eine Nachricht zu veröffentlichen, navigieren Sie zum Bereich "Nachricht veröffentlichen", füllen Sie "Thema" als "Test" aus und geben Sie eine Nachricht in den Abschnitt "Nachricht" ein. Drücken Sie anschließend * Veröffentlichen *. Die Nachricht wird in Ihrem Terminal "+ mosquitto_sub" angezeigt.

Fazit

Wir haben jetzt einen sicheren, kennwortgeschützten und SSL-geschützten MQTT-Server eingerichtet. Dies kann als robuste und sichere Messaging-Plattform für die von Ihnen gewünschten Projekte dienen. Einige gängige Software und Hardware, die mit dem MQTT-Protokoll gut funktionieren, umfassen:

  • OwnTracks, eine Open-Source-Geo-Tracking-App, die Sie auf Ihrem Telefon installieren können. OwnTracks meldet regelmäßig Positionsinformationen an Ihren MQTT-Server, die Sie dann speichern und auf einer Karte anzeigen können, oder erstellt Warnmeldungen und aktiviert die IoT-Hardware basierend auf Ihrem Standort.

  • Node-RED ist eine browserbasierte grafische Oberfläche, mit der Sie das Internet der Dinge miteinander verbinden können. Sie ziehen die Ausgabe eines Knotens auf die Eingabe eines anderen Knotens und können Informationen über Filter, zwischen verschiedenen Protokollen, in Datenbanken usw. weiterleiten. MQTT wird von Node-RED sehr gut unterstützt.

  • Der ESP8266 ist ein kostengünstiger WiFi-Mikrocontroller mit MQTT-Funktionen. Sie können eine Verbindung herstellen, um Temperaturdaten für ein Thema zu veröffentlichen, oder ein Thema zum Luftdruck abonnieren und einen Summer ertönen lassen, wenn ein Sturm kommt!

Dies sind nur einige beliebte Beispiele aus dem MQTT-Ökosystem. Es gibt viel mehr Hardware und Software, die das Protokoll sprechen. Wenn Sie bereits eine bevorzugte Hardwareplattform oder Softwaresprache haben, verfügt diese wahrscheinlich über MQTT-Funktionen. Viel Spaß dabei, deine "Sachen" miteinander ins Gespräch zu bringen!