Gibt es in einem Szenario, in dem Sie die Bereitstellung der Hardware steuern und feststellen können, dass alle Geräte mit demselben Hardwaremodell tatsächlich eindeutige MAC-Adressen für ihre Netzwerkschnittstellen haben, Nachteile beim Schreiben von Code, der diese Annahme verwendet? (Hinweis basierend auf einigen Antworten: Ich werde mit dieser Annahme keinen Netzwerkcode schreiben. Es ist nur eine einfache Möglichkeit, eine UUID pro Gerät zu haben, ohne die Geräte-HDD manuell generieren und mit einer ID aktualisieren zu müssen Bereitstellung auf dem Feld)
Die Hintergrundgeschichte ist, dass ich eine Implementierung eines privaten Hardware-IOT-Typs für einen Client untersuche. Wir werden eine Reihe von Hardwaregeräten mit Netzwerkfunktionen für die Installation an entfernten Standorten bereitstellen. Diese Geräte senden dann Nachrichten an eine API. Um die Komplexität des Setups zu verringern, wollte ich die MAC-Adresse der Netzwerkschnittstelle auf dem Gerät in der Nachricht senden, um diese Nachrichten an eine "device_id" auf der API-Seite zu binden. Mein Gedanke ist, dass, indem Sie es zu etwas machen, das vor der Verwendung nicht auf dem Gerät eingerichtet werden muss, es nur während des normalen Betriebs abgefragt werden kann. Ich kann davon ausgehen, dass wir feststellen können, dass die MAC-Adressen der einzelnen Geräte tatsächlich eindeutig sind.
quelle
Antworten:
Basierend auf Ihren Aussagen, die Sie während der Bereitstellung bestätigen können, dass der Hersteller-MAC tatsächlich innerhalb des von Ihnen erstellten Netzwerks von Geräten eindeutig ist (was an sich keine Gewissheit ist, auch wenn dies der Fall sein sollte), geht es Ihnen wahrscheinlich gut. Bedenken Sie jedoch die folgenden Fragen:
Verwenden Sie den MAC für Sicherheitsüberprüfungen (Authentifizierung, Autorisierung)? In diesem Fall reicht ein MAC nicht aus. Denken Sie nicht einmal darüber nach. Verwenden Sie eine kryptografische Struktur und übertragen Sie alle Authentifizierungsanforderungen sicher.
Ist 48 Bit breit genug? Es ist wahrscheinlich, aber es lohnt sich zu fragen.
Müssen Sie jemals ein Gerät reparieren, indem Sie dessen Nic austauschen?
Wenn Sie ein Gerät in seiner Gesamtheit ersetzen oder dessen NIC ersetzen, müssen Sie in der Lage sein, die neue Adresse dem vorhandenen Schlüssel in Ihrer Datenbank zuzuordnen, um die Kontinuität der Datenerfassung für den Bereitstellungsort sicherzustellen?
Wird es eine Wartungsschnittstelle geben, über die ein Benutzer (autorisiert oder nicht autorisiert) die Netzwerkkarte auf ROM-, Treiber- oder Betriebssystemebene ändern kann? Ein Angreifer kann Fehler in Ihren Daten verursachen, wenn er den MAC ändert.
Werden Ihre Daten jemals mit anderen Datenquellen verknüpft, die MAC als Schlüssel verwenden?
Werden Sie den MAC jemals für andere Netzwerkzwecke verwenden, als nur durch das Layer2-LAN zu navigieren, mit dem das Gerät verbunden ist (verkabelt oder drahtlos)?
Ist das LAN, mit dem Ihre Geräte verbunden sind, ein privates Netzwerk oder ein Netzwerk, mit dem eine große Anzahl von Kunden (z. B. Mobiltelefone von Mitarbeitern) eine Verbindung herstellt?
Wenn Ihre Antworten sind
dann fällt mir kein wirklicher Fehler in deinem Plan ein.
Denken Sie daran, dass Sie keine global eindeutigen MACs benötigen, um dies zu realisieren. Sie müssen lediglich sicherstellen, dass die Untergruppe der Internetgeräte, die Ihre API aufrufen, eindeutig ist. Genau wie eine doppelte NIC, die in zwei verschiedenen Städten zugewiesen wurde, nicht kollidieren kann, weil sie sich in verschiedenen LANs befindet, können Sie auf einem MAC keine Datenbankschlüsselkollision haben, wenn Ihre API nicht jemals aufgerufen wird.
quelle
MAC-Adressen sind nicht eindeutig
Es kann und wird Duplikate mit MACs geben. Dafür gibt es mehrere Gründe, einer ist, dass sie nicht (global) eindeutig sein müssen.
Der MAC muss im lokalen Netzwerk eindeutig sein, damit ARP / NDP seine Aufgabe erfüllen kann und der Switch weiß, wohin eingehende Datagramme gesendet werden sollen. Normalerweise (nicht unbedingt) ist diese Voraussetzung erfüllt, und die Dinge funktionieren einwandfrei, einfach weil die Wahrscheinlichkeit, dass zwei identische MACs im selben LAN sind, selbst wenn sie nicht eindeutig sind, recht gering ist.
Ein weiterer Grund ist, dass es einfach mehr Geräte gibt als Adressen. Während 48-Bit-Adressen so klingen, als ob es bis zum Ende der Tage genug Adressen für alle gibt, ist dies nicht der Fall.
Der Adressraum ist in zwei 24-Bit-Hälften unterteilt (etwas komplizierter, aber die kleinen Details werden ignoriert). Die eine Hälfte ist die OUI, die Sie beim IEEE registrieren und Ihrem Unternehmen für rund 2000 Dollar zuweisen können. Die restlichen 24 Bits machen Sie, was Sie wollen. Natürlich können Sie mehrere OUIs registrieren, was auch die größeren Spieler tun.
Nehmen Sie als Beispiel Intel. Sie haben insgesamt 7 OUIs registriert und geben ihnen insgesamt 116 Millionen Adressen.
Die Hauptplatine meines Computers (die einen X99-Chipsatz verwendet) sowie die Hauptplatine meines Laptops und die Hauptplatine aller x86-basierten Computer, die ich in den letzten 10 bis 15 Jahren besessen habe, verfügten über eine Intel-Netzwerkkarte als Teil des Chipsatzes. Mit Sicherheit gibt es weltweit mehr als 116 Millionen Intel-basierte Computer. Daher können ihre MACs möglicherweise nicht eindeutig sein (im Sinne von global eindeutig).
Es wurde auch über Fälle berichtet, in denen ... billigere ... Hersteller Adressen einfach aus der OUI eines anderen "stehlen". Mit anderen Worten, sie verwendeten nur eine zufällige Adresse. Ich habe von Herstellern gehört, die die gleiche Adresse auch für ein komplettes Produktsortiment verwenden. Weder passt das wirklich noch ergibt es viel Sinn, aber was können Sie dagegen tun? Diese Netzwerkkarten existieren. Nochmals: Die Wahrscheinlichkeit, dass es zu einem praktischen Problem wird, ist immer noch sehr gering, wenn Adressen für das verwendet werden, was sie beabsichtigt sind. Sie müssen zwei davon im selben LAN haben, um es überhaupt zu bemerken.
Was tun gegen Ihr Problem?
Die Lösung ist vielleicht einfacher als Sie denken. Ihre IoT-Geräte werden höchstwahrscheinlich einige Zeit benötigen, normalerweise wird die Zeit automatisch über NTP bezogen. Die typische Präzision von NTP liegt im Mikrosekundenbereich (ja, das ist Mikro, nicht Milli). Ich bin nur gelaufen
ntpq -c rl
, um sicherzugehen, und mir wurde gesagt, dass ich 2 -20 bin .Die Wahrscheinlichkeit, dass zwei Ihrer Geräte zum ersten Mal mit genau derselben Mikrosekunde eingeschaltet werden, ist sehr gering. Das ist im Allgemeinen möglich (vor allem, wenn Sie Millionen davon in kürzester Zeit verkaufen, herzlichen Glückwunsch zu Ihrem Erfolg!). Aber es ist nicht sehr wahrscheinlich - in der Praxis wird es nicht passieren. Sparen Sie also Zeit, nachdem Sie das System zum ersten Mal in einem permanenten Speicher hochgefahren haben.
Die Startzeit Ihres IoT-Geräts ist auf jedem Gerät gleich. Außer das stimmt überhaupt nicht .
Bei einem Timer mit hoher Auflösung sind die Startzeiten jedes Mal messbar unterschiedlich, auch auf demselben Gerät. Es ist vielleicht nur ein paar Uhr-Ticks anders (oder ein paar hunderttausend, wenn Sie so etwas wie den Zeitstempelzähler der CPU lesen), also nicht sehr einzigartig, aber es fügt sicher etwas Entropie hinzu.
Ebenso ist die Zeit, die
connect
für die Rückgabe beim ersten Zugriff auf Ihre API-Site erforderlich ist, geringfügig, aber messbar unterschiedlich. In ähnlicher Weisegetaddrinfo
wird für jedes Gerät eine etwas andere, messbare Zeit benötigt, wenn der Hostname Ihrer Web-API zum ersten Mal nachgeschlagen wird.Verketten Sie diese drei oder vier Entropiequellen (MAC-Adresse, Zeitpunkt des ersten Einschaltens, Zeitpunkt des ersten Starts, Verbindungszeit) und berechnen Sie daraus einen Hash. MD5 wird für diesen Zweck gut geeignet sein. Dort bist du einzigartig.
Das garantiert zwar nicht wirklich die Einzigartigkeit, aber "so ziemlich" mit einer vernachlässigbaren Wahrscheinlichkeit des Scheiterns. Sie müssten über zwei Geräte mit identischen MACs verfügen, die zum ersten Mal in derselben Mikrosekunde eingeschaltet werden und genau die gleiche Zeit benötigen, um zu starten und eine Verbindung zu Ihrer Site herzustellen. Das wird nicht passieren. In diesem Fall sollten Sie sofort mit dem Lotto beginnen, da Sie anscheinend garantiert gewinnen werden.
Wenn "wird nicht passieren" jedoch als Garantie nicht ausreicht, übergeben Sie einfach jedem Gerät eine fortlaufend steigende Nummer (auf dem Server generiert), wenn es zum ersten Mal auf Ihre Web-API zugreift. Lassen Sie das Gerät diese Nummer speichern, fertig.
quelle
ntpq -c rl?
Da das Problem hier wirklich ein XY-Problem ist, gehe ich auf Folgendes ein: Wie erhalte ich eine eindeutige Kennung für ein Hardwareteil, wenn es zum ersten Mal gestartet wird, ohne dass Kennungen vorab darauf geladen werden müssen? Alle guten Methoden lassen sich auf eine Sache reduzieren: eine Entropiequelle zu haben.
Wenn Ihre Hardware hat etwas entwickelt , um eine Hardware-Entropiequelle zu sein (Anmerkung: Dies ist im Grunde eine Voraussetzung für jede richtige IoT Geräteimplementierung , da es für TLS benötigt wird , so dass Ihre Hardware sollte in diesem Sinne ausgelegt werden), um nur diese verwenden. Wenn nicht, müssen Sie kreativ werden.
Glücklicherweise hat fast jeder Computer, der jemals hergestellt wurde, eine hervorragende Entropiequelle: Quarzoszillatoren (Uhren). Die Rate eines bestimmten Kristall ist nicht nur abhängig von subtilen Temperaturänderungen, sondern unterliegt auch auf Temperatur Hysterese in der nichtlinearen Art und Weise. Um die Entropie zu messen, benötigen Sie jedoch eine zweite Uhr, um die erste zu messen. Dies bedeutet, dass Sie, wenn Ihr Computer über mindestens zwei abtastbare Uhren verfügt, die von der anderen gemessene Rate als Entropiequelle von sehr hoher Qualität verwenden können.
quelle
Ich möchte die Frage nicht direkt beantworten, da es andere sehr gute Antworten gibt, sondern ich möchte stattdessen einen anderen geeigneteren Wert vorschlagen, der möglicherweise als Geräte-ID verwendet werden kann.
Wenn dies von Ihrer Hardware unterstützt wird, können Sie die SMBIOS-UUID verwenden. Dies ist eine eindeutige ID für das Mainboard und damit für das Gerät. Beachten Sie, dass auch IoT-Geräte über mehrere Netzwerkkarten (LAN und WLAN) verfügen können. Wenn Sie also die MAC-Route auswählen, müssen Sie immer noch eine Methode finden, um eine einheitlich auszuwählen.
Auch wenn die UUID eindeutig ist, sollte sie nicht zu Sicherheitszwecken verwendet werden, da sie nur in einer freundlichen Umgebung eindeutig ist.
quelle
Ich hasse es, ein XY-Problem anzunehmen, weil das OP oft einen guten, wenn auch komplexen Grund dafür hat, Dinge so zu tun, wie sie es tun. Vielleicht möchten Sie aber auch andere Methoden zur Generierung einer eindeutigen Kennung für jedes Gerät untersuchen, z. B. die MAC-Adresse , ist in das Gerät "eingebaut" und erfordert keine Erstellung einer eigenen Kennung.
Wenn die Geräte alle vom selben Hersteller (oder noch besser vom selben Modell) stammen, können Sie die Seriennummer verwenden, um die Kennung zu generieren. Dies funktioniert jedoch auf Geräten verschiedener Hersteller nicht so gut, auch wenn Sie es mit dem Herstellernamen und der Modellnummer kombinieren, da bei eingebetteten / proprietären Geräten unterschiedliche Seriennummernformate und möglicherweise unterschiedliche APIs zum Abrufen der Seriennummer verwendet werden . Eine Alternative zur Seriennummer des Geräts könnte die Seriennummer des Motherboards, der CPU oder der Festplatte sein (ich glaube, bei der Windows-Lizenzierung wird eine Kombination dieser verwendet).
Beachten Sie auch, dass Dateisystem-Formatierer normalerweise eine eindeutige ID für jedes Dateisystem generieren. Sofern Sie nicht alle Geräte aus demselben Image vorbereiten (was ich aus unabhängigen Gründen empfehlen würde), ist auf jeder Festplatte bereits eine eindeutige ID im Dateisystem gespeichert, die Sie verwenden können.
Allerdings gibt es wirklich keinen Grund , MAC-Adressen nicht zu verwenden, insbesondere wenn Sie im Rahmen Ihres Bereitstellungsprozesses feststellen können, dass sie tatsächlich eindeutig sind (obwohl dies nicht einmal erforderlich sein sollte, vorausgesetzt, es handelt sich nicht um mehr als hier ein paar tausend Geräte). Bedenken Sie natürlich, dass alles, was Sie verwenden, vom Gerät gefälscht werden kann. Verlassen Sie sich daher nicht auf dieses Verfahren für die Authentifizierung in einer nicht vertrauenswürdigen Umgebung (Sie sagten, es sei eine private Einrichtung, wahrscheinlich handelt es sich um eine "vertrauenswürdige" Umgebung, in der dies nicht der Fall ist Sorgen Sie dafür, dass Ihre Kunden ihre eigenen Geräte gegen ihre eigenen Server fälschen, aber sie sollten dies natürlich berücksichtigen, wenn die Verwaltung der Geräte an Dritte oder Endbenutzer übergeben wird.
quelle