So installieren und sichern Sie den Mosquitto MQTT Messaging Broker unter Ubuntu 16.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, rufen SSL-Zertifikate von Let’s Encrypt ab und richten unseren Broker so ein, dass er SSL zur Sicherung unserer kennwortgeschützten MQTT-Kommunikation verwendet.

Voraussetzungen

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

Schritt 1 - Installieren von Mosquitto

Ubuntu 16.04 hat eine relativ neue Version von Mosquitto in seinem Standard-Software-Repository. Melden Sie sich bei Ihrem Nicht-Root-Benutzer an und installieren Sie Mosquitto mit + apt-get.

sudo apt-get 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 SSL mithilfe von Certbot, dem neuen Let’s Encrypt-Client.

Schritt 2 - Installieren von Certbot zum Verschlüsseln von Zertifikaten

Let’s Encrypt ist ein neuer Dienst, der kostenlose SSL-Zertifikate über eine automatisierte API anbietet. Es gibt viele Clients, die mit der API kommunizieren können, und Ubuntu hat den offiziellen Client in seinem Standard-Repository, aber es ist etwas veraltet und es fehlt eine wichtige Funktion, die wir benötigen.

Stattdessen installieren wir den offiziellen Client von einem Ubuntu PPA oder Personal Package Archive. Hierbei handelt es sich um alternative Repositorys, die neuere oder weniger bekannte Software enthalten. Fügen Sie zunächst das Repository hinzu.

sudo add-apt-repository ppa:certbot/certbot

Sie müssen + ENTER drücken, um zu akzeptieren. Aktualisieren Sie anschließend die Paketliste, um die Paketinformationen des neuen Repositorys abzurufen.

sudo apt-get update

Zum Schluss installieren Sie den offiziellen Let’s Encrypt-Client mit dem Namen "+ certbot +".

sudo apt-get install certbot

Nachdem wir "+ certbot +" installiert haben, führen wir es aus, um unser Zertifikat zu erhalten.

Schritt 3 - Ausführen von Certbot

"+ certbot " muss eine kryptografische Abfrage beantworten, die von der Let's Encrypt-API ausgegeben wird, um zu beweisen, dass wir unsere Domain kontrollieren. Dazu werden die Ports " 80 " (HTTP) und / oder " 443 " (HTTPS) verwendet. Wir werden nur den Port " 80 +" verwenden, also lassen wir jetzt eingehenden Datenverkehr auf diesem Port zu:

sudo ufw allow http
OutputRule added

Wir können jetzt Certbot ausführen, um unser Zertifikat zu erhalten. Wir werden die Option "+ - Standalone " verwenden, um Certbot anzuweisen, die HTTP-Abfrageanforderung selbst zu behandeln, und " - Standalone-unterstützte-Abfragen http-01 " begrenzt die Kommunikation auf den Port " 80 " . " -d " wird verwendet, um die Domäne anzugeben, für die Sie ein Zertifikat möchten, und " certonly +" weist Certbot an, das Zertifikat nur abzurufen, ohne andere Konfigurationsschritte auszuführen.

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

Wenn Sie den Befehl ausführen, werden Sie aufgefordert, eine E-Mail-Adresse einzugeben und den Nutzungsbedingungen zuzustimmen. Anschließend sollten Sie eine Meldung erhalten, die besagt, dass der Vorgang erfolgreich war und wo Ihre Zertifikate gespeichert sind.

Wir haben unsere Zertifikate. Jetzt müssen wir sicherstellen, dass Certbot sie vor Ablauf automatisch erneuert.

Schritt 4 - Einrichten von Certbot Automatic Renewals

Let´s Encrypt-Zertifikate sind nur neunzig Tage gültig. Dies soll Benutzer dazu ermutigen, ihren Zertifikaterneuerungsprozess zu automatisieren. Wir müssen einen regelmäßig ausgeführten Befehl einrichten, um zu überprüfen, ob Zertifikate abgelaufen sind, und sie automatisch zu erneuern.

Um die Erneuerungsprüfung täglich durchzuführen, verwenden wir + cron +, einen Standardsystemdienst zum Ausführen von periodischen Jobs. Wir sagen + cron +, was zu tun ist, indem wir eine Datei mit dem Namen + crontab + öffnen und bearbeiten.

sudo crontab -e

Sie werden aufgefordert, einen Texteditor auszuwählen. Wählen Sie Ihren Favoriten aus, und Sie werden mit dem standardmäßigen "+ crontab +" mit Hilfetext konfrontiert. Fügen Sie die folgende Zeile am Ende der Datei ein, speichern und schließen Sie sie.

crontab

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

Der Teil "15 3 * * * +" in dieser Zeile bedeutet "jeden Tag um 3:15 Uhr folgenden Befehl ausführen". Mit dem Befehl " renew " für Certbot werden alle auf dem System installierten Zertifikate überprüft und alle Zertifikate aktualisiert, deren Ablauf in weniger als 30 Tagen festgelegt wurde. ` - nicht interaktiv +` weist Certbot an, nicht auf Benutzereingaben zu warten.

+ - post-hook" systemctl restart mosquitto "+ startet Mosquitto neu, um das neue Zertifikat abzurufen, jedoch nur, wenn das Zertifikat erneuert wurde. Diese "+ nachträgliche +" Funktion ist das, was älteren Versionen des Let’s Encrypt-Clients fehlte und warum wir von einem PPA anstelle des Standard-Ubuntu-Repositorys installiert haben. Ohne diese müssen wir Mosquitto jeden Tag neu starten, selbst wenn keine Zertifikate tatsächlich aktualisiert wurden. Obwohl Ihre MQTT-Clients so konfiguriert sein sollten, dass sie sich automatisch wieder verbinden, ist es ratsam, sie nicht ohne triftigen Grund täglich zu unterbrechen.

Nachdem die automatische Zertifikatserneuerung nun abgeschlossen ist, können Sie Mosquitto wieder sicherer konfigurieren.

Schritt 5 - 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

+ 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 6 - 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

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

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 7 - 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 Mosqiutto-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

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 richten jetzt einen sicheren, kennwortgeschützten MQTT-Server mit automatisch erneuernden SSL-Zertifikaten vom Let’s Encrypt-Dienst ein. Dies wird als robuste und sichere Messaging-Plattform für alle Projekte dienen, die Sie sich erträumen. Einige gängige Software- und Hardwareprodukte, 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!