Let’s MQTT

Knapp 60.000 MQTT-Broker sollen öffentlich einsehbar sein und angeblich nur zwei davon nutzen eine Transportverschlüsselung. Zeit etwas daran zu ändern! Die Kurzanleitung verhilft zur Installation und Konfiguration des quelloffenen MQTT-Brokers Mosquitto unter Linux mit verschlüsselter Übertragung. Beispielhaft werden von Letsencrypt ausgestellte Zertifikate integriert und kurz in die Benutzer/Passwort-basierte Authentifizierung und Rechteverwaltung eingeführt.

MQTT, was ist das und wozu ist das gut?

Das Message Queue and Telemetry Transport (MQTT) Protocol dient dem Austausch von Telemetriedaten zwischen Maschinen und Geräten nach einem einfachen Publish/Subcribe-Model. Werden von einem Gerät Nachrichten unter einem Thema veröffentlicht, verteilt ein Broker diese an alle angemeldeten Clients, die dieses Thema abboniert haben. Damit nur berechtigte Geräte Nachrichten zu bestimmten Themen abonnieren und veröffentlichen dürfen, ist eine Authentifizierung der Geräte gegenüber dem Broker sinnvoll. Eine Transportverschlüsselung ist empfohlen, um sowohl die Authentifizierungsdaten als auch die Nachrichten auf dem Weg durch das Netz vor den neugierigen Blicken Dritter zu schützen.

MQTT-Broker Mosquitto

Mosquitto ist ein quelloffener MQTT-Nachrichten-Broker. Er lässt sich mit dem Debian Package-Manager installieren:

  sudo apt-get install mosquitto

oder alternativ von https://mosquitto.org/download/ herunterladen und gemäß dortiger Anleitung installieren.

Konfiguration für TLS (Transport Layer Security) mit Letsencrypt

TLS-Zertifikate gibt es per Letsencrypt:

  letsencrypt certonly --rsa-key-size 4096 -d example.com

Um die TLS-Verschlüsselung mit den ausgestellten Zertifikaten nutzen zu können, müssen diese in der Konfigurationsdatei /etc/mosquitto/mosquitto.conf bzw. im Konfigurationsverzeichnis /etc/mosquitto/conf.d/ angegeben werden:

  bind_address xx.xx.xx.xx
  port 8883
  cafile /etc/letsencrypt/live/example.com/chain.pem
  certfile /etc/letsencrypt/live/example.com/cert.pem
  keyfile /etc/letsencrypt/live/example.com/privkey.pem

Konfiguration der Rechteverwaltung per Benutzername und Passwort

Um die Authentifizierung durch Benutzernamen und Passwort zu aktivieren, muss in der Konfigurationsdatei folgendes angegeben sein:

  allow_anonymous false
  password_file /etc/mosquitto/passwords
  acl_file /etc/mosquitto/access.acl

Die Passwörter werden dann wie angegeben in der Datei /etc/mosquitto/passwords erwartet. Accounts können mit

  mosquitto_passwd /etc/mosquitto/passwords username

angelegt bzw. das Passwort geändert werden. Die Datei sollte vor neugierigen Blicken geschützt sein:

  chmod 0600 /etc/mosquitto/passwords

Die Zuordnung von Zugriffsberechtigungen und Themen erfolgt durch die in der Konfigurationsdatei angegebenen Access-Control-List (ACL) Datei /etc/mosquitto/access.acl:

  user username
  pattern readwrite #

Durch diesen Eintrag wird dem Benutzer username das Lesen und Schreiben aller Themen gewährt. ‚#‘ steht für alle Topics. Es kann auch eine bestimmte Themenbezeichnung angegeben werden. Um z.B. für den Benutzer observer das Lesen für das Thema foo zu aktivieren:

  user observer
  topic read foo

Eine Testverbindung mit dem Mosquitto-Client herstellen

Sofern auf dem Client-System noch nicht bekannt, ist zur Prüfung des von Letsencrypt ausgestellten TLS-Zertifikats des MQTT-Brokers das entsprechende Wurzelzertifikat erforderlich. Dieses kann von https://www.identrust.com/certificates/trustid/root-download-x3.html bezogen werden. Den angezeigte Inhalt zwischen

  -----BEGIN CERTIFICATE-----
  ...
  -----END CERTIFICATE-----

mit einem Texteditor in mosquitto-letsencrypt-ca.crt zur späteren Verwendung speichern.

Eine Nachrichten-Publikation kann dann z.B. mit

  mosquitto_pub -h example.com -p 8883 --cafile mosquitto-letsencrypt-ca.crt -m 1 -t test -u username -P password

erfolgen.

Unter Android habe ich erfolgreich eine Verbindung mit MQTT Dash aufbauen und das Thema beobachten können.

Schreibe einen Kommentar