Systeme eindeutig identifizieren



  • Hallo

    Ich möchte versuchen einem System (Maschine) eine eindeutige ID zuzuweisen bzw. zu berechnen, die es benutzen kann um sich zentral anzumelden.
    Leider kann nicht auf Betriebssystem-IDs oder eine Konfiguration zurückgegriffen werden. Die Software läuft z.B. auf einem per USB Stick gestarteten Mini-OS oder auf einer per Klonung ausgerollten Image, welches von Dritten frei umkonfiguriert werden kann.
    Daher müsste diese ID vermutlich aus eindeutigen IDs der Hardware abgeleitet werden. Sich ändernde Komponenten der Hardware sollen dabei natürlich nicht einbezogen werden (zB. USB-Geräte wie Maus und co).

    Ich habe mich bisher nie so im Detail mit Hardware-IDs auseinander gesetzt und möchte deshalb fragen:
    Gibt es Hardware-bezogene IDs oder Seriennummern von fest verbauten Kompontenten, die per Software ausgelesen werden können?
    Geräte-Typen-IDs helfen hier nicht, weil auch mehrere Systeme die gleiche Hardware verbaut haben können.

    Die zwei gängigsten IDs, die mir einfallen, sind MAC-Adressen von LAN-Adaptern und Seriennummern von Festplatten. Allerdings müsste man bei MAC-Adressen zwischen fest verbauten Adaptern und frei anschließbaren unterscheiden, während der Einsatz von Festplatten nicht garantiert ist (USB/SDCard-Boot).

    Haben gängige CPUs oder andere Standard-Mainboardkomponenten auslesbare Serien-IDs?
    Als Betriebssystem kommen übrigens sowohl Windows als auch Linux oder BSD in Frage.

    Zu Vorschlägen und Ideen hierfür sage ich ganz herzlich
    DANKE 🙂

    PS: Lösungen zu diesem Thema helfen mir vor allem in der Netzwerk-Kommunikation um Hardware mit unterschiedlichen Betriebssystemen und Konfigurationen wiederzufinden. Ich sehe dabei aber auch Verbindungen zum Thema "Lizensierung pro Maschine" ... allerdings müsste dann eine solche ID absolut stabil auf jeder Hardware berechenbar sein ... was meint ihr?



  • Soweit ich weiß, geht das auslesen der Seriennummer nur, wenn es im Bios freigeschaltet ist bzw. wenn überhaupt.

    Aber warum so kompliziert, wenns auch einfach geht.
    Warum nicht allen PCs eine Nummer(anstelle eines Namens) geben?


  • Mod

    Es ist unmöglich, ganz besonders wenn du nicht auf das OS zurück greifen willst. Alles im Computer ist Zahl und alles kann manipuliert werden. Gerade MAC-Adressen sind flexibel änderbare Zahlen, die höchstens einen Wert für den ersten Start in der Hardware stehen haben, ansonsten sind sie Software. Ein OS kann versuchen aus der Hardware ein paar Nummern zu ziehen, aber das OS kann nicht wissen, ob es in einer virtuellen Umgebung läuft. Dann ist alles, was es von der Hardware sieht von der Software der Umgebung emuliert und hat nix mit Hardware zu tun. Selbst bei nicht-virtualisiertem OS hat dein eigenes Programm dieses Problem auch: Ein Hacker kann sich nach belieben zwischen dein Programm und das OS hängen und ihm vorgaukeln, was er möchte. Und direkten Hardwarezugriff durch dein Programm wird ein modernes OS verhindern.

    Denk dir ein Lizenzmodell aus, wo der zahlende Kunde nicht die Unannehmlichkeiten (Hardwarebindung ist für viele ein NoGo) hat, während die gecrackte Version die alle Vorteile hat.



  • Ich würde mir niemals eine Software kaufen, die nur auf einem ganz bestimmten Gerät läuft.

    Ich upgrade schließlich mein Gerät regelmäßig und möchte auf der neuen Maschine die alte Software weiternutzen können.

    Von daher: Ganze dummes Lizenzmodell



  • 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.


  • Mod

    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 mal wmic 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.

    git.kernel.org

    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 gespannt 😉

    Wenns 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.
    - fertig

    Nachteil: 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 🙂


Anmelden zum Antworten