So installieren und sichern Sie den Mosquitto MQTT Messaging Broker unter CentOS 7

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:

  • Ein CentOS 7-Server mit einem Benutzer ohne Rootberechtigung, der Sudo unterstützt, und einer grundlegenden Firewall. Dies (und mehr) wird in der New CentOS 7 Server Checklist behandelt.

  • Ein Domain-Name, der auf Ihren Server verweist (siehe How to Set Up a Host Name with) DigitalOcean. In diesem Tutorial wird durchgehend "++" verwendet.

  • Optional den Texteditor "+ nano ". In diesem Tutorial wird durchgehend " nano " verwendet, und Sie können es jederzeit mit " sudo yum -y install nano +" installieren oder Ihren bevorzugten Texteditor ersetzen.

Schritt 1 - Installieren von Mosquitto

CentOS 7 enthält standardmäßig kein "+ Moskito +" - Paket. Zur Installation installieren wir zunächst ein zusätzliches Software-Repository mit dem Namen "Extra Packages for Enterprise Linux" oder "EPEL". Dieses Repository ist voll von zusätzlicher Software, die sich gut auf CentOS, Red Hat und anderen unternehmensorientierten Linux-Distributionen installieren lässt.

Melden Sie sich bei Ihrem Nicht-Root-Benutzer an und installieren Sie das Paket "+ epel-release " mit dem Paket-Manager " yum +".

sudo yum -y install epel-release

Dadurch werden die EPEL-Repository-Informationen zu unserem System hinzugefügt. Die Option "+ -y " beantwortet einige Eingabeaufforderungen während des gesamten Vorgangs automatisch mit "Ja". Jetzt können wir das Paket ` mosquitto +` installieren.

sudo yum -y install mosquitto

Das Paket wird mit einer einfachen Standardkonfiguration geliefert. Lassen Sie es also ausführen, um unsere Installation zu testen.

sudo systemctl start mosquitto

Wir müssen den Dienst auch aktivieren, um sicherzustellen, dass er beim Neustart des Systems startet:

sudo systemctl enable mosquitto

Testen wir nun die Standardkonfiguration. Das Paket + mosquitto + enthält einige Befehlszeilen-MQTT-Clients. Wir werden einen davon verwenden, 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 und Ausführen von Certbot zum Verschlüsseln von Zertifikaten

Let’s Encrypt ist ein neuer Dienst, der kostenlose SSL-Zertifikate über eine automatisierte API anbietet. Der offizielle Let’s Encrypt-Client heißt Certbot und ist im EPEL-Repository enthalten, das wir im vorherigen Schritt installiert haben.

Installieren Sie Certbot mit + yum +.

sudo yum -y install certbot

Certbot muss eine kryptografische Abfrage der Let’s Encrypt-API beantworten, 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. Lassen Sie uns jetzt eingehenden Datenverkehr auf diesem Port zulassen.

Verwenden Sie "+ firewall-cmd +", um den HTTP-Dienst hinzuzufügen.

sudo firewall-cmd --permanent --add-service=http

Laden Sie die Firewall neu, damit die Änderungen wirksam werden.

sudo firewall-cmd --reload

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 3 - 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 EDITOR=nano crontab -e

+ EDITOR = nano + öffnet die crontab-Datei im + nano + Editor. Lassen Sie es aus, wenn Sie den Standard-Editor "+ vi +" bevorzugen.

Sie sollten nun mit der Standardeinstellung "+ crontab +", einer leeren Datei, konfrontiert werden. Fügen Sie die folgende Zeile ein und speichern und schließen Sie die Datei.

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.

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

Schritt 4 - 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 ersetzen wir die Standardkonfigurationsdatei und weisen Mosquitto an, diese Kennwortdatei zu verwenden, um Anmeldungen für alle Verbindungen zu erfordern. Löschen Sie zuerst die vorhandene + mosquitto.conf +.

sudo rm /etc/mosquitto/mosquitto.conf

Und jetzt öffne eine neue, leere Konfiguration.

sudo nano /etc/mosquitto/mosquitto.conf

Fügen Sie Folgendes ein.

/etc/mosquitto/mosquitto.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 5 - 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/mosquitto.conf

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

/etc/mosquitto/mosquitto.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 schließen Sie die Datei.

Bevor wir Mosquitto neu starten, um die neue Konfiguration zu laden, müssen wir eine Sache in der Standard-Dienstdatei + mosquitto + korrigieren. Dies ist die Datei, mit der + systemd + bestimmt, wie + mosquitto + ausgeführt wird. Öffnen Sie es in Ihrem Lieblingseditor.

sudo nano /etc/systemd/system/multi-user.target.wants/mosquitto.service

Suchen Sie nach einer Zeile mit der Aufschrift "+ User = mosquitto +" und entfernen Sie sie. Speichern Sie dann die Datei und schließen Sie sie.

Mosquitto wird weiterhin als * mosquitto * -Benutzer ausgeführt, verfügt jedoch beim ersten Start über * root * -Privilegien und kann unsere Let’s Encrypt-Zertifikate laden (die aus Sicherheitsgründen auf * root * -Zugriff beschränkt sind). . Nachdem die Zertifikate geladen wurden, wird sie an den Benutzer * mosquitto * weitergeleitet.

Wir müssen + systemd + selbst neu laden, damit es die Änderungen bemerkt, die wir an der Servicedatei vorgenommen haben.

sudo systemctl daemon-reload

Und jetzt können wir Mosquitto neu starten, um die Einstellungen zu aktualisieren.

sudo systemctl restart mosquitto

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

sudo firewall-cmd --permanent --add-port=8883/tcp

Und laden Sie die Firewall neu.

sudo firewall-cmd --reload

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 --cafile /etc/ssl/certs/ca-bundle.crt -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). .

+ - cafile / etc / ssl / certs / ca-bundle.crt + 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 " - capath ") 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 6 - 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/mosquitto.conf

Fügen Sie am Ende der Datei Folgendes hinzu:

/etc/mosquitto/mosquitto.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 firewall-cmd --permanent --add-port=8083/tcp

Laden Sie die Firewall ein letztes Mal neu.

sudo firewall-cmd --reload

Zum Testen dieser Funktionalität verwenden wir einen öffentlichen, browserbasierten MQTT-Client. Es gibt einige, aber mqtt-admin ist einfach und unkompliziert. Öffnen Sie mqtt-admin in Ihrem Browser. Folgendes wird angezeigt:

image: http: //assets.digitalocean.com/articles/mosquitto/SJRJgLX.png [Einstiegsbildschirm von mqtt-admin]

Füllen Sie die Verbindungsinformationen wie folgt aus:

  • * Protokoll * sollte * wss * sein (was für w eb s ocket s ecure steht).

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

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

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

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

  • * ClientId * kann auf den Standardwert * mqtt-admin * gesetzt werden.

Nachdem Sie * Save Settings * gedrückt haben, verbindet sich + mqtt-admin + mit Ihrem Mosquitto-Server. Füllen Sie im nächsten Bildschirm * Thema * als * Test * aus, geben Sie eine Nachricht für * Nutzlast * ein und drücken Sie dann * Veröffentlichen *. Die Nachricht wird im 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!