Systeme eindeutig identifizieren
-
Hallo und danke für eure Antworten.
Nur damit da nichts durcheinander kommt:
Wir befinden uns im Embedded Bereich und sprechen nicht von Home-User oder Office Maschinen.Ein Anforderung an die Software ist die Lauffähigkeit auf Read-Only Medien und Read-Only Betriebssystemen. Es werden also X identisch vorkonfigurierte Medien in den Maschinen verbaut auf denen die Software bereits als Systemdienst vorkonfiguriert ist. Dies führt zu X identisch konfigurierten Systemen. Da die Software nun auf einem Server Logs schreibt, soll sich das System "eindeutig" melden können.
Dass MAC-Adressen verändert werden können ist mir schon klar, aber in diesem Szenario müsste der SysAdmin entweder allen Maschinen die gleiche MAC Adresse zuweisen oder aber 100 individuelle Einzelinstallationen erzeugen, was mehr als unwirtschaftlich ist.
Mein Problem ist eher folgendes:
Eine Maschine arbeitet fest verkabelt an ihrem Platz und meldet Logs an den Server. Sie identifiziert sich über die MAC Adresse des LAN-Adapters.
Doch dann wird sie für ein temporäres spezielles Projekt in ein anderes Werk verlegt und bootet dort über an angepasstes OS-Image und nutzt einen WLAN-Stick um wieder mit dem Netzwerk verbunden zu werden. Damit kommt eine neue MAC ins Spiel und der Log-Server vermutet nun neues System was Produktivitätsanalysen erschwert.Und eben deshalb hätte ich gerne eine ID, die von einer möglichst nicht austauschbaren Komponente stammt. Die CPU wäre ideal, aber leider sind dort Serien-IDs nur optional verfügbar.
Übrigens: Kein Sorge! Die Konfiguration einer frei einstellbaren ID ist in der Software vorgesehen. Es gibt jedoch Kunden, die dies auf Grund ihrer Betriebspolitik ablehnen -> siehe geklonte Read-Only Medien.
So wie ich euch aber verstehe, kennt ihr auch keine "standardisierte" Serien-Nummerierung von Hardware. Falls aber jemandem etwas besseres einfällt, bin ich für jeden Vorschlag offen. Eine solche Lösung hätte ja viele Vorteile in der netzwerkgestützten System-Administration.
@Ein Kunde:
Wenns um meinen eigenen PC geht stimme ich dir zu, muss aber dennoch zur Kenntnis nehmen, dass so manche User-Software ebenfalls ein solches Lizenzmodell verfolgt. Es ist legitim, dass ein Softwarehersteller die vertraglich festgelegte Nutzung seines Produktes sicherstellt und Missbrauch vorbeugt.PS: Ganz nebenbei: Die besprochene Software hat kein Lizenzmodell (wenn auch das Management gerne eines hätte), aber die Partner-Applikationen, die damit gesteuert werden haben eins: MAC-Adressen.
-
Wäre es nicht viel, viel, viel einfacher, den Hostnamen/IP-Adresse der Maschine zur Identifikation zu nutzen? Das löst doch alle deine Probleme:
1. Um das Netzwerk wird sich schließlich jemand kümmern, Namen/IPs werden eindeutig und beständig sein.
2. Das Problem der Hardwarebindung entfällt, vielmehr hat man die viel natürlichere Bindung an das "System" nicht die Hardware auf der das System läuft.
3. Somit können auch die Details der Netzwerkanbindung beliebig getauscht werden.Falls es dieses Merkmal im Netz nicht geben sollte, kannst du einfach etwas vergleichbares erzeugen, indem du im Schritt "Es werden also X identisch vorkonfigurierte Medien in den Maschinen verbaut" eingreifst: Bei der Erzeugung der Medien schreibst du (automatisiert natürlich!) auf jedes Medium ein eindeutiges Identifizierungsmerkmal in die Software. Du kannst sogar Buch führen, welches Medium welche Software erhalten hat und somit die Quelle plumper Kopien identifizieren.
P.S.: MAC-Adressentausch soll Aufwand für den Admin sein? Bei uns ist das sogar die übliche Vorgehensweise, alte Rechner gegen neue zu tauschen. Es ist viel einfacher die MAC permanent zu ändern, als einen Eintrag im DNS zu ändern.
-
@SeppJ
Ich vermute er will wirklich die Kiste identifizieren, nicht die IP die sie gerade hat.
Und dafür sind MAC Adresse bzw. IP eben nicht geeignet.@xor
Wenn ich mich jetzt nicht ganz irre haben Mainboards eine Seriennummer. Also nicht die BIOS Kennung (die ja im Prinzip nur die "BIOS Version" darstellt) sondern eine wirkliche Seriennummer.
Unter Windows kannst du malwmic baseboard GET SerialNumber
probieren (Command Prompt).
Auf meinem PC bekomme ich da zumindest einen netten String, und der ist auch auf dem PC von meinem Kollegen ein anderer, obwohl er genau den selben PC hat (wir haben 15 PCs mit der selben Konfiguration bestellt).Falls das mit euren Mainboards funktioniert musst du nur noch rausbekommen wie du das unter dem OS auslesen kannst das ihr verwendet. Bzw. falls es WES7/WE8 ist müsste es 1:1 so verwendbar sein (bzw. die entsprechende WMI Query vielleicht direkt in C#/C++/... ausprogrammieren, wäre vermutlich "sauberer" als den Output eines Commandline-Tools zu parsen).
Bzw. vermutlich solltest du noch weitere Properties von "baseboard" dazunehmen, z.B. Manufacturer, Product und Version.
Die Strings kannst du einfach alle hintereinanderhängen, dann nen MD5 (oder sonstigen Hashcode) drüberrechnen, und davon nimmst du dann so viel Bit wie du brauchst.
-
Ich warte eine Software da wird, neben anderen Sachen, GetVolumeInformation verwendet.
-
xor schrieb:
Es werden also X identisch vorkonfigurierte Medien in den Maschinen verbaut auf denen die Software bereits als Systemdienst vorkonfiguriert ist. Dies führt zu X identisch konfigurierten Systemen. Da die Software nun auf einem Server Logs schreibt, soll sich das System "eindeutig" melden können.
Warum generierst du nicht einfach beim ersten Start eine eindeutige ID (z.B. eine UUID) und verwendest die ab diesem Zeitpunkt? Wenn das ganze auch bei Read-only-Medien über einen System-Reboot hinweg erhalten bleiben soll, müsstest du dir halt was ausdenken, wo du die 16 Bytes persistent unterbringen kannst. Sollte aber machbar sein.
Eine recht schöne und simple UUID-Library wäre die libuuid aus util-linux. Nicht vom Namen täuschen lassen, die kompiliert auch unter anderen Systemen. Anscheinend sogar unter Win32. Steht unter einer BSD-Lizenz.
Geht aber bestimmt auch noch simpler.
-
@Shade
GetVolumeInformation wird bei geklonten Read-Only Medien vermutlich auch nix bringen, oder?@Heumann
Dann mach mal einen Vorschlag für "persistent unterbringen", bin gespannt
Das, also der Teil auf den du nicht genauer eingehst, ist nämlich der Knackpunkt. Der Rest (UUID generieren) ist ja wohl trivialst.ps: unter Windows nimmt man am besten einfach UuidCreate(). Wozu irgendeine Library einbinden für was was das System bereits zur Verfügung stellt.
-
hustbaer schrieb:
@Shade
GetVolumeInformation wird bei geklonten Read-Only Medien vermutlich auch nix bringen, oder?Ja, wird sehr wahrscheinlich dann die selben Serien Nummer liefern.
uU koennte man die Hardware Seriennummer nehmen...
-
hustbaer schrieb:
@Heumann
Dann mach mal einen Vorschlag für "persistent unterbringen", bin gespanntWenns um x86 geht: wie wärs mit EFI-Variablen? Klar, für normale Anwendungssoftware indiskutabel. Da es aber laut OP um Embeddedsysteme geht, deren einziger Zweck der Betrieb seiner Software ist, scheint das schon eher passend.
Verwendung unter Linux:
- open("/sys/firmware/efi/vars/new_var", O_WRONLY)
- struct efi_variable mit Non-Volatile-Attribut und den eigenen Daten reinschreiben
- immer daran denken mit dem Speicherplatz äußerst sparsam umzugehen, einige Plattformen haben nicht viel davon. 16 Bytes sind aber in jedem Fall kein Problem.
- fertigNachteil: benötigt natürlich Rootrechte.
Bei den anderen vom OP gewünschten Systemen (Windows und BSD) wirds wohl auch irgendwie gehen.
ps: unter Windows nimmt man am besten einfach UuidCreate(). Wozu irgendeine Library einbinden für was was das System bereits zur Verfügung stellt.
Naja, wenn er sowieso eine Lösung für mehrere Betriebssysteme benötigt finde ich das Einbinden einer kleinen, plattformunabhängigen Bibliothek etwas schöner als sich den eigenen Code durch lauter #ifdefs zu zerhauen. Aber das kann man anders sehen, ja.
-
Hallo nochmals
@SeppJ
Zur IP-Infrastruktur: So wird es derzeit gemacht. Der Server gruppert nach der eintreffenden Source-IP. Indirekt spiegelt das aber nur die MAC, die von DHCP zur Erzeugung der IP Adresse benutzt wird. Kommt jetzt aber ein anderer Netzwerk-Weg hinzu, wird ein "neues" Gerät angezeigt. Das wäre im Fall "temporärer WLAN-Stick" so und es gibt dann auch noch die perverse Konfiguration, dass zwischen dem von uns betriebenen System an anderes System vorgeschaltet ist, dass als grafisches Terminal und als Router fungiert. Diese Geräte können ausgetauscht werden und nehmen ihre IP dann mit ... ist also nicht wirklich "stabil", leider.@hustbaer
Ich bin gerade bemüht die SMBIOS Spezifikation durchzugehen, die ja auf den ersten Blick sehr vielversprechend erschien.
Leider fiel mir dabei aber auf, was auch WMI zu bestätigen scheint: Manche Felder wie Seriannummer werden von manchen Board-Herstellern nicht gesetzt. Da bekommt man dann Strings wie "To Be Filled By O.E.M." zurück.
Aber generell gefällt mir der Ansatz sehr gut - Danke
Und zumindest bei der Hardware, die über uns bezogen wird lässt sich eine Seriennummer-Prägung des BIOS erzwingen. Ich werde mal ein paar Remote-Proben bei unseren Systemen sammeln um zu sehen, was dort zurückgeliefert wird.@Heumann
UUIDs und GUIDs benutzen meines Wissen bei ihrer Erzeugung auch immer einen Time-Stamp bzw. eine Random Komponenten. Da ich diese UUID nicht regulär speichern kann, wäre sie bei jedem Start anders.@h
Zumindest alle neueren Systeme beinhalten EFI und damit würde sich wirklich eine "Speichermöglichkeit" bieten. Habe unter Windows Get/SetFirmwareEnvironmentVariable dazu gefunden und werde das mal weiter verfolgen - Danke ;). Allerdings hoffe ich, dass man damit nichts anderes leicht kaputt machen kann.PS: Wie ich lese wäre die CPU-ID eigentlich genau das richtige für mich gewesen, aber daraus wurde ja nichts. Tja, die User wollen eben, dass ihr PC anonym bleibt
-
@h
Ah, EFI klingt interessant.
Muss mir mal ansehen was da so geht, mit dem Thema hatte ich mich noch nicht beschäftigt.Weisst du mit wie viel Speicher man da rechnen kann? Und ist wirklich garantiert dass diese Variablen dann auf dem Mainboard (Flash-Speicher oder was auch immer) gespeichert werden? Nicht dass die nur funktionieren wenn man eine spezielle Partition dafür auf der HDD/SSD/... eingerichtet hat.
Falls du Links zu dem Thema parat hast wäre ich nicht böse wenn du sie postest