So installieren und sichern Sie den Mosquitto MQTT Messaging Broker unter Debian 8

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 Debian 8-Server mit einem Benutzer ohne Rootberechtigung, der sudo-fähig ist (siehe https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-8[dieses Debian 8-Server-Setup-Tutorial). .

  • Eine grundlegende Firewall, die mit "+ ufw " eingerichtet wurde (siehe https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu-14-04) [Einrichten einer Firewall mit UFW unter Ubuntu 14.04]. Trotz des Ubuntu-zentrierten Titels können Sie Debian folgen und sicherstellen, dass Sie zuerst " sudo apt-get install ufw " verwenden, da Debian standardmäßig " ufw +" nicht enthält.

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

Schritt 1 - Installieren von Mosquitto

Das + mosquitto + - Paket von Debian unterstützt einige der von uns benötigten Funktionen nicht, daher werden wir von einem aktuelleren Repository aus installieren, das vom Mosquitto-Projekt bereitgestellt wird. Laden Sie zunächst den Signaturschlüssel für das Repository herunter.

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

Dann installieren Sie den Schlüssel mit + apt-key +.

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

Auf diese Weise kann "+ apt-get +" die Integrität jeder Software überprüfen, die Sie aus dem neuen Repository installieren.

Sagen Sie nun "+ apt-get ", wo sich die Software befindet, indem Sie die Repository-URL zu einer Datei in " / etc / apt / sources.list.d / +" hinzufügen.

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

Dies öffnet eine neue, leere Datei. Fügen Sie die folgende Zeile in die Datei ein.

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

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

Speichern und schließen Sie den Editor, und aktualisieren Sie ihn mit "+ apt-get +", um die neuen Paketinformationen abzurufen.

sudo apt-get update

Und schließlich installieren Sie das Paket "+ mosquitto +" und seine Client-Software.

sudo apt-get install mosquitto mosquitto-clients

Standardmäßig startet Debian den Mosquitto-Dienst nach der Installation. Testen wir die Standardkonfiguration. Wir verwenden einen der gerade installierten Clients, um ein Thema bei 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

Das Flag "+ -h " gibt den Hostnamen des MQTT-Servers an, 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.

Drücken Sie im zweiten Terminal die Tastenkombination "+ STRG + C ", 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 unter Verwendung 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 Debian nimmt den offiziellen Client in sein Standard-Repository auf, aber es ist etwas veraltet und es fehlt eine wichtige Funktion, die wir brauchen.

Stattdessen installieren wir den Client aus dem + backports + - Repository von Debian. Dies ist ein offizielles Repository, das neuere Versionen ausgewählter Software für bereits veröffentlichte Versionen von Debian zur Verfügung stellt. Wir müssen das Repository wie im vorherigen Schritt zu unserer APT-Quellenliste hinzufügen.

Öffnen Sie zuerst eine neue Datei in + /etc/appt/sources.list.d / +.

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

Fügen Sie die folgende Zeile in die Datei ein:

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

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

Speichern Sie die Datei und schließen Sie den Editor. Aktualisieren Sie anschließend die Paketinformationen.

sudo apt-get update

Und schließlich installieren Sie den offiziellen Let’s Encrypt-Client namens Certbot, der APT anweist, "+ jessie-backports +" als Quelle zu verwenden:

sudo apt-get install certbot -t jessie-backports

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 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 verwenden nur den Port " 80 +". Erlauben Sie daher eingehenden Datenverkehr auf diesem Port.

sudo ufw allow http
OutputRule added
Rule added (v6)

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 " gibt die Domäne an, 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 sehen Sie eine Meldung, 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 Befehl einrichten, der regelmäßig nach abgelaufenen Zertifikaten sucht und diese automatisch erneuert.

Zur täglichen Überprüfung der Verlängerung verwenden wir https://www.digitalocean.com/community/tutorials/how-to-use-cron-to-automate-tasks-on-a-vps [+ cron +], Ein Standard-Systemdienst 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 Backports anstelle des Standard-Debian-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

Konfigurieren wir Mosquitto so, dass Kennwörter verwendet werden, damit wir steuern können, wer Nachrichten veröffentlichen kann. 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

Erstellen Sie jetzt eine neue Konfigurationsdatei für Mosquitto und teilen Sie ihr mit, dass sie diese Kennwortdatei verwenden soll, um für alle Verbindungen Anmeldungen 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 Sie Mosquitto neu starten und Ihre Änderungen testen.

sudo systemctl restart mosquitto

Versuchen Sie zunächst, eine Nachricht ohne Kennwort 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 Kennwort erneut versuchen, wechseln Sie erneut zu Ihrem zweiten Terminalfenster und abonnieren Sie das Thema * test *, indem Sie dieses Mal den Benutzernamen und das Kennwort eingeben:

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 auf 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)

Testen Sie jetzt noch einmal 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 MacOS, 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 der Test erfolgreich abgeschlossen wurde, wird im anderen Terminal "+ mosquitto_sub +" * hallo * angezeigt. 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 mqtt-admin ist einfach und unkompliziert. Öffnen Sie mqtt-admin in Ihrem Browser. Folgendes wird angezeigt:

image: https://assets.digitalocean.com/articles/mosquitto-debian/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 zum „Zusammenschalten“ des Internets der Dinge. 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!