Wie kann ich 2FA in einem MQTT-Netzwerk verwenden?

12

Wie kann ich 2FA (Two Factor Authentication) verwenden, wenn ich ein neues Gerät an den Broker anschließe, sofern dies überhaupt möglich ist?

Da es einfacher zu sein scheint, kann der zweite Faktor zunächst eine Softwarelösung sein, aber ich würde Ideen zur Einführung von Hardtoken (möglicherweise RFID) begrüßen.

Es wäre sinnvoll, wenn sich die Geräte nur bei der ersten Verbindung authentifizieren und der Server sich an "alte" Clients erinnern würde.

Die Idee ist vielleicht ungewöhnlich oder ungeeignet - wenn es eine schlechte Idee ist, geben Sie mir bitte die Gründe dafür an.

Bence Kaulics
quelle
Können Sie uns sagen, wie ein Gerät Ihrer Meinung nach 2FA kann, da es sich um ein Gerät handelt?
Goufalite
@Goufalite Wenn ich beispielsweise ein neues Gerät installiere, muss ich manuell einen Schlüssel bereitstellen (z. B. durch ein RFID-Tag), der bei der Authentifizierung verwendet wird. Was die Software 2FA angeht, so weiß ich nicht, ob bei mir zu Hause ein Dienst eingerichtet werden kann, von dem aus neue Geräte Soft-Token anfordern können, so etwas wie ein privater Schlüsselserver.
Bence Kaulics

Antworten:

8

Sie benötigen einen Broker-Proxy oder einen Webserver ...

Zunächst benötigen Sie unbedingt einen Authentifizierungsservice, der mit Ihrem Broker verbunden ist, um die 2FA unter Verwendung bestimmter Themen durchzuführen ( /auth/RFID, ...). Der Kunde kann dann Informationen veröffentlichen (siehe unten).

Das erste Problem, das ich hier sehe, ist, dass jeder, der dieses Thema abonniert hat, die Informationen zu diesem Thema lesen kann, aber Sie können Themen sperren !

Sie können dann alle Ihre Geräte anweisen (zwingen) , Informationen zu veröffentlichen /proxy/mytopic. Mit der clientId-Funktion von mqtt kann der auth-Dienst prüfen, ob die von diesem Thema gesendeten Nachrichten von einem authentifizierten Gerät stammen, das zuvor 2FA verwendet hat, und dann seine eigene Nachricht im Namen des Geräts /proxyout/mytopicmit der Geräte-ID in der Nutzlast veröffentlichen.

Das Problem ist jetzt prüft für Geräte , die können Nachrichten empfangen , wenn sie authentifiziert sind, weil, na ja, MQTT alles über Massen Veröffentlichung ist. Der Authentifizierungsdienst muss eine Liste der authentifizierten Geräte haben und prüfen, ob diese für den Empfang berechtigt sind. Nutzdatenverschlüsselung und -entschlüsselung auf der Geräteseite ...

Ich denke, meine Lösung ist sehr übertrieben gegenüber den MQTT-Funktionen. Sie sollten daher einen Socket oder einen Webserver verwenden ...

Goufalite
quelle
@ tim3in sorry für die späte antwort. Immerhin war dies eine Antwort, die vor 2,5 Jahren gegeben wurde ... vielleicht haben sich die Dinge geändert und dies war nur ein allgemeiner Architekturvorschlag. Haben Sie mit Ihrer Lösung einen POC durchgeführt?
Goufalite
Ich habe es geplant Können Sie es überprüfen?
tim3in
7

Die kommende MQTT v5-Spezifikation AUTHbietet Unterstützung für das Steuerpaket, das eine Challenge / Response-Authentifizierung ermöglicht. Da MQTT v5 noch nicht fertiggestellt ist, kann sich die Unterstützung zwar noch ändern, es ist jedoch anzunehmen, dass AUTH in der einen oder anderen Form verbleibt und dass 2FA damit hinzugefügt werden könnte.

Sie können die aktuellen Arbeitsentwürfe der Spezifikation auf der Dokumentenseite des OASIS MQTT-Komitees einsehen .

ralight
quelle
5

Gemäß der Spezifikation kann die Verbindungsnachricht optional einen Benutzernamen und ein Passwort bereitstellen. Dies wird anhand einer ACL überprüft, die auf dem Broker gespeichert ist. Das ist also Ihr erster Authentifizierungsfaktor, den Sie ausnutzen können. Die CONNACK-Nachricht vom Broker antwortet, wenn die Authentifizierung erfolgreich war.

Um den zweiten Faktor bei der Authentifizierung zu implementieren, sollten Sie am besten eine benutzerdefinierte Verbindungsnachricht mit dem anderen Faktor senden. Die CONNACK-Nachricht sollte in diesem Fall auf Erfolg oder Misserfolg des zweiten Authentifizierungsfaktors verweisen. Daher sollten der Broker und der Client benutzerdefinierte Nachrichten implementieren, die über die Spezifikation hinausgehen.

Cogito ergo sum
quelle
4

Um 2FA im MQTT-Netzwerk zu erreichen, habe ich folgende Dienste für die Authentifizierung erstellt, die mit Broker verbunden sind.

  1. ID-Prüfer
  2. Token-Generator
  3. Token Verifier

Wenn der MQTT-Client eine Verbindung zum Broker über SSL / TLS herstellt, veröffentlicht er zuerst seine eigene ID für das Thema Geräte- ID, überprüft, ob es sich um den authentischen Client handelt, und ruft dann den Token-Generator auf, der ein Token generiert und das Token für das gesperrte Thema Geräte- Token veröffentlicht .

Das Client-Gerät erhält dieses Token und veröffentlicht es weiter in einem Thema verify_token . Sobald das Thema in verify_token veröffentlicht wurde, vergleicht der Token-Verifier die Werte in topic device_token und verify_token, falls sie übereinstimmen. Fügen Sie die Geräte-ID zum verifizierten Gerätepool hinzu und lassen Sie das Gerät Daten veröffentlichen. Dies verbessert die Sicherheit, da die einzigen überprüften Geräte mit den Themen verbunden werden, um Daten zu veröffentlichen.

Ich habe auch die Konfigurationsoption MQTT_KEEPALIVE verwendet, um den Client aktiv zu halten, wenn keine Daten gesendet oder empfangen werden, um das Clientgerät im Gerätepool am Leben zu erhalten und zu verhindern, dass es erneut überprüft wird, sobald es zum Gerätepool hinzugefügt wird. Aus Sicherheitsgründen habe ich das Gerät jedoch alle 24 Stunden auf 2FA gefroren.

tim3in
quelle
3
Wie wird sichergestellt, dass nur der richtige Client das Token erhält?
Helmar
@Helmar verwendet die eindeutige clientID und ein separates Thema zum Speichern des Tokens für jeden Client, der bei der Registrierung des Geräts vordefiniert wurde. Der Client abonniert dieses Thema tatsächlich. Wenn es das Token zur Überprüfung erneut veröffentlicht, fügt es seine ID mit Token-Daten hinzu, sodass der Prüfer weiß, welcher Client dieses Token veröffentlicht hat. clientid kann mit Secure Element auf der Geräteseite geschützt werden , nachdem dieselbe ID auf dem Server in der Datenbank registriert wurde.
tim3in
@Helmar Möchtest du bitte deinen Kommentar dazu hinzufügen? Ich würde mich über die Meinung aller zu meiner Lösung freuen.
tim3in
2
ja, aber was soll mich davon abhalten, '#' zu abonnieren, um alle Token-Antworten zu sehen
hardillb
@hardillb-Themen mit Token-Antworten sind gesperrt, wie von Goufalite erwähnt. So kann nur das vorherrschende Gerät sehen. In der Registrierungsphase werden Geräte an bestimmte Themen gebunden und jedem Gerät werden separate Themen für Token-Antworten zugewiesen.
tim3in