Generieren Sie eine einheitliche, eindeutige Maschinen-ID

20

Können wir für jeden PC eine eindeutige ID generieren, etwa "uuuidgen", die sich jedoch nur ändert, wenn Änderungen an der Hardware vorgenommen werden? Ich habe darüber nachgedacht, CPUID und MACADDR zusammenzuführen und zu hashen, um eine konsistente ID zu generieren, aber ich habe keine Ahnung, wie ich sie mit Bash-Skripten analysieren kann. Ich weiß, wie ich die CPUID erhalten kann

dmidecode -t 4 | grep ID

und

ifconfig | grep ether

dann muss ich diese hexadezimalen Zeichenfolgen kombinieren und sie mit sha1 oder md5 hashen, um Hexadezimale Zeichenfolgen mit fester Länge zu erstellen.
Wie kann ich diese Ausgabe analysieren?

uray
quelle
4
Was genau ist das Problem, das Sie mit dieser Methode lösen möchten?
Darkhogg
1
Ich bin bei Darkhogg. Es ist im Allgemeinen eine schlechte Idee, diese Art von Dingen heutzutage zu versuchen. Die Virtualisierung hat das Binden von Software an physische Hardware überflüssig gemacht. Es gibt normalerweise eine bessere Antwort, wenn Sie Ihre Anforderungen genau untersuchen (worauf Darkhogg abzielt).
Calphool
4
Ich habe nicht diese verwenden , um eine Software zu einer Maschine zu binden, ist es Linux - Bergbauanlage , dass Bedarf selbst Kontrolle zu Cloud zu identifizieren und Monitoring - Service, anstatt manuell Tausende von rig zu nennen, ich brauche , um eindeutig zu identifizieren, ihre Hardware - ID mit
uray
1
@ user77710: Wenn das der Fall ist, kümmert es dich dann wirklich um die Hardware? Warum nicht einfach eine UUID auf dem Computer generieren, wenn keine existiert? Das ist der Sinn einer UUID - sie sind universell einzigartig (ihre Überlappungswahrscheinlichkeit ist astronomisch unwahrscheinlich). serverfault.com/questions/103359/how-to-create-a-uuid-in-bash
Calphool
1
@JoeRounceville - Ich wollte nicht, dass SecureBoot selbst die Lösung ist - obwohl es selbstsignierte Zertifikate unterstützt -, sondern vielmehr seine Methode . Es wird jedoch eine von der Firmware des Systems angebotene API verwendet - und jedes UEFI-System verfügt über so viele UUIDs, wie Sie möglicherweise bereits im Namen jeder Firmware-Variablen eingerichtet haben - siehe meine Antwort. Außerdem benötigen Sie keine Anwendung - oder bash-, um unter Linux eine UUID zu generieren. cat /proc/sys/kernel/random/uuid.
MikeServ

Antworten:

21

Wie wäre es mit diesen beiden:

$ sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g'
52060201FBFBEBBF
$ ifconfig | grep eth1 | awk '{print $NF}' | sed 's/://g'
0126c9da2c38

Sie können sie dann kombinieren und hashen mit:

$ echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') \
       $(ifconfig | grep eth1 | awk '{print $NF}' | sed 's/://g') | sha256sum 
59603d5e9957c23e7099c80bf137db19144cbb24efeeadfbd090f89a5f64041f  -

Fügen Sie eine weitere Pipe hinzu, um den abschließenden Gedankenstrich zu entfernen:

$ echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') \
       $(ifconfig | grep eth1 | awk '{print $NF}' | sed 's/://g') | sha256sum |
  awk '{print $1}'
59603d5e9957c23e7099c80bf137db19144cbb24efeeadfbd090f89a5f64041f

Wie @mikeserv in seiner Antwort betont , kann sich der Schnittstellenname zwischen den Starts ändern . Das bedeutet, dass das, was heute eth0 ist, morgen eth1 sein kann. Wenn Sie also danach suchen, erhalten eth0Sie möglicherweise eine andere MAC-Adresse für verschiedene Starts. Mein System verhält sich nicht so, so dass ich nicht wirklich testen kann, aber mögliche Lösungen sind:

  1. Greifen Sie auf HWaddrdie Ausgabe von zu, ifconfigaber behalten Sie alle bei, nicht nur die, die einer bestimmten Netzwerkkarte entspricht. Zum Beispiel habe ich auf meinem System:

    $ ifconfig | grep HWaddr
    eth1      Link encap:Ethernet  HWaddr 00:24:a9:bd:2c:28  
    wlan0     Link encap:Ethernet  HWaddr c4:16:19:4f:ac:g5  

    Wenn Sie beide MAC-Adressen abrufen und weiterleiten sha256sum, sollten Sie in der Lage sein, einen eindeutigen und stabilen Namen zu erhalten, unabhängig davon, welche NIC wie heißt:

    $ echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') \
         $(ifconfig | grep -oP 'HWaddr \K.*' | sed 's/://g') | sha256sum |
          awk '{print $1}'
    662f0036cba13c2ddcf11acebf087ebe1b5e4044603d534dab60d32813adc1a5    

    Beachten Sie, dass sich der Hash von den oben genannten unterscheidet, da ich beide MAC-Adressen übergebe, die von ifconfigan zurückgegeben wurden sha256sum.

  2. Erstellen Sie stattdessen einen Hash basierend auf den UUIDs Ihrer Festplatte (n):

    $ blkid | grep -oP 'UUID="\K[^"]+' | sha256sum | awk '{print $1}'
    162296a587c45fbf807bb7e43bda08f84c56651737243eb4a1a32ae974d6d7f4
terdon
quelle
Es ist schön, aber wie wird man das abschließende "-" los?
uray
@ user77710 siehe aktualisierte Antwort.
Terdon
1
Ich denke, CPUID ist schlimmer ... wikipedia.org/wiki/CPUID
mikeserv
@mikeserv ah, ja, ich verstehe deinen Standpunkt. Danke, antworte bearbeitet.
Terdon
Erzeugt dieselbe ID für alle Gastbetriebssysteme auf demselben Host.
Nitinkumar Ambekar
23

Bitte beachten Sie zunächst, dass die CPUID definitiv kein allgemein zugänglicher eindeutiger Identifizierungsmarker für ein späteres System als ein Intel Pentium III ist. Während das Hashing mit MAC-Adressen zweifellos zu eindeutigen Markierungen führen kann, liegt dies nur an den eindeutigen Eigenschaften der MACs selbst, und die CPUID ist in diesem Fall nichts weiter als ein Umstand. Darüber hinaus ist der resultierende Hash wahrscheinlich nicht eindeutiger als die UUID des Motherboards, und das ist weitaus einfacher abzurufen und der Prozess ist viel weniger fehleranfällig. Aus wikipedia.org/wiki/cpuid :

EAX = 3 : Prozessor-Seriennummer

Siehe auch: Pentium III § Kontroverse über Datenschutzfragen

Dies gibt die Seriennummer des Prozessors zurück. Die Prozessor-Seriennummer wurde bei Intel Pentium III eingeführt, aber aus Datenschutzgründen ist diese Funktion bei späteren Modellen nicht mehr implementiert (PSN-Funktionsbit wird immer gelöscht). Transmetas Efficeon- und Crusoe-Prozessoren bieten ebenfalls diese Funktion. AMD CPUs implementieren diese Funktion jedoch nicht in CPU-Modellen.

Sie können eine geparste CPU selbst anzeigen, indem Sie cat /proc/cpuinfooder sogar nur lscpu.

Das gibt dir alle MAC-Adressen für die Netzwerkschnittstellen, die vom Linux-Kernel erkannt werden, denke ich:

ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'

Möglicherweise muss diese Liste gefiltert werden, wenn sie virtuelle Netzwerkkarten mit zufällig generierten MACs enthält. Dies können Sie mit Flags im Call to ipdirekt tun . Sehen Sie ip a helpInformationen darüber , wie dies zu tun.

Beachten Sie auch, dass dieses Problem nicht ipnur bei Ihnen auftritt und behandelt werden muss ifconfig, sondern dass es zuverlässiger gehandhabt werden kann ip- was Teil der iproute2Netzwerksuite ist und aktiv gewartet wird - als bei ifconfigMitgliedern des net-toolsPakets und zuletzt eine Linux- Veröffentlichung im Jahr 2001 . Da sich die Funktionen im Kernel seit der letzten Veröffentlichung geändert haben , ifconfigist bekannt, dass einige Netzwerkfeature-Flags falsch gemeldet wurden, und die Verwendung sollte nach Möglichkeit vermieden werden.

Beachten Sie jedoch, dass das Filtern mit Kernel-Schnittstellennamen wie eth[0-9]nicht zuverlässig ist, da sich diese je nach der Reihenfolge der parallelen Erkennung udevwährend des Startvorgangs ändern können. Weitere Informationen hierzu finden Sie unter Vorhersagbare Netzwerknamen .

Da dmidecodees nicht auf meinem System installiert ist, dachte ich zuerst, ich solle eine Liste von Festplatten-Serien erstellen, die wie folgt aussehen:

lsblk -nro SERIAL

Suchen Sie lsblk --helpnach Hinweisen zur Verfeinerung dieser Liste - beispielsweise nach Datenträgertyp. Überlegen Sie auch lspciund / oder lsusbvielleicht.

Sie zu kombinieren ist einfach:

{ ip a | sed ... ; lsblk ... ; } | #abbreviated... for brevity...
    tr -dc '[:alnum:]' | #deletes all chars not alphanumeric - including newlines
    sha256sum #gets your hash

Wie Sie mir mitgeteilt haben, geben Sie die Ressourcen des Benutzers an Ihre eindeutigen IDs weiter, und es kann nicht davon ausgegangen werden, dass Festplatten existieren. Ich dachte, ich würde meine Einstellung ändern.

Dann habe ich noch einmal in das Dateisystem geschaut und den /sys/class/dmi/idOrdner gefunden. Ich habe einige der Dateien überprüft:

cat ./board_serial ./product_serial

###OUTPUT###
To be filled by O.E.M.
To be filled by O.E.M.

Dieser scheint jedoch ziemlich gut zu sein, aber ich werde die Ausgabe nicht veröffentlichen:

sudo cat /sys/class/dmi/id/product_uuid

Ich gehe davon aus, dass dort dmidecodesowieso viele Informationen abgerufen werden und dass es tatsächlich so aussieht . man dmidecodeSie können Ihrer Meinung nach auch die Verwendung dieses Tools erheblich vereinfachen, indem Sie das Argument angeben:

dmidecode -s system-uuid

Noch einfacher ist jedoch, dass Sie die Datei einfach lesen können. Beachten Sie, dass diese bestimmte Datei speziell ein Motherboard identifiziert. Hier ist ein Auszug aus dem Kernel-Patch von 2007 , der diese Exporte ursprünglich in das /sysfsvirtuelle Dateisystem implementiert hat :

+DEFINE_DMI_ATTR_WITH_SHOW(bios_vendor,      0444, DMI_BIOS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(bios_version,         0444, DMI_BIOS_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(bios_date,        0444, DMI_BIOS_DATE);
+DEFINE_DMI_ATTR_WITH_SHOW(sys_vendor,       0444, DMI_SYS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(product_name,         0444, DMI_PRODUCT_NAME);
+DEFINE_DMI_ATTR_WITH_SHOW(product_version,   0444, DMI_PRODUCT_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(product_serial,    0400, DMI_PRODUCT_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(product_uuid,         0400, DMI_PRODUCT_UUID);
+DEFINE_DMI_ATTR_WITH_SHOW(board_vendor,         0444, DMI_BOARD_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(board_name,       0444, DMI_BOARD_NAME);
+DEFINE_DMI_ATTR_WITH_SHOW(board_version,     0444, DMI_BOARD_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(board_serial,         0400, DMI_BOARD_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(board_asset_tag,   0444, DMI_BOARD_ASSET_TAG);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_vendor,    0444, DMI_CHASSIS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_type,         0444, DMI_CHASSIS_TYPE);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_version,   0444, DMI_CHASSIS_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_serial,    0400, DMI_CHASSIS_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_asset_tag, 0444, DMI_CHASSIS_ASSET_TAG);

Möglicherweise können Sie diese Daten allein verwenden, um das System zu identifizieren - wenn das Motherboard ausreicht. Sie können diese Informationen jedoch auf die gleiche Weise mit den MACs des Systems kombinieren, wie dies bei Festplatten der Fall ist:

sudo sh <<\CMD | tr -dc '[:alnum:]' | sha256sum
        ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
        cat /sys/class/dmi/id/product_uuid 
CMD

Der Linux-Kernel kann auch UUIDs für Sie generieren:

cat /proc/sys/kernel/random/uuid #new random uuid each time file is read

Oder:

cat /proc/sys/kernel/random/boot_id #randomly generated per boot

Zugegeben, es ist zufällig generiert und Sie werden umdenken ID - Zuweisung haben, aber es ist ungefähr so einfach , wie es zu bekommt bekommen zumindest. Und es sollte ziemlich solide sein, wenn Sie ein Mittel finden, um es zu tasten.

Auf UEFI-Systemen wird dies erheblich einfacher, da jede EFI-Firmware-Umgebungsvariable eine eigene UUID enthält. Die Umgebungsvariable {Platform,}LangCodes-${UUID}sollte auf jedem UEFI-System vorhanden sein, Neustarts und sogar die meisten Firmware-Upgrades und -Änderungen sollten beibehalten werden , und jedes Linux-System mit efivarfsgeladenem Modul kann einen oder beide Namen so einfach wie folgt auflisten :

printf '%s\n' /sys/firmware/efi/efivars/*LangCodes-*

Die ältere Form - LangCodes-${UUID}ist anscheinend mittlerweile veraltet und sollte auf neueren Systemen vorhanden sein, PlatformLangCodes-${UUID}aber laut Spezifikation sollte die eine oder andere in jedem UEFI-System vorhanden sein. Mit wenig Aufwand können Sie Ihre eigenen persistenten Variablen für den Neustart definieren und auf diese Weise möglicherweise den UUID-Generator des Kernels besser nutzen. Bei Interesse schauen Sie in efitools .

mikeserv
quelle
Es läuft nicht einmal eine Festplatte oder ein Datenträger, sein Mining-Rig, wenn Sie nicht wissen, was es ist, kann diese virtuelle Maschine mit diit.cz/sites/default/files/images/3988/… nicht 6 GPU auf einer einzelnen ausführen Motherboard
uray
Auf jeden
Fall
@ user77710 - Mist, Mann, das Ding ist cool. Ist das eine Maschine? Wahrscheinlich hast du recht, aber es könnte mit einer Kombination aus XDMX und Chromium möglich sein - mit einigen verteilten Grafiken. Egal, es wäre egal - ich hatte es verkehrt herum. Wer würde sich um sein Geld schlagen wollen? Ich dachte an eine Software-Lizenz-Sache oder so - Sie machen Bankkonten.
mikeserv
Das sind ein paar raffinierte Tricks, +1.
Terdon
@terdon - das Kompliment wird sehr geschätzt, aber größtenteils sind es keine Tricks. ip2wurde speziell für das Parsen entwickelt, und es kann sein, dass ich es nicht gut genug mache - ich vermute, dass das Gleiche fast ohne geht grep/sed. Wahrscheinlich könnte das auch so einfach mit gemacht werden udevadm. Und jeder EFI-Umgebungsvariablenname ist so konzipiert, dass er für genau diese Situationen eindeutig identifiziert werden kann.
MikeServ
19

Viele moderne Distributionen liefern eine Datei /etc/machine-idmit einer höchstwahrscheinlich eindeutigen hexadezimalen Zeichenfolge mit 32 Zeichen. Es stammt von systemd, wo eine Hilfeseite mehr Informationen enthält , und ist möglicherweise für Ihren Zweck geeignet.

XZS
quelle
+1, @XZS, Sie können hier auch die relevanten Informationen aus der URL hinzufügen.
Ramesh
1
Das ist gut, und ich habe ähnliche Informationen gefunden und fast verwendet ... aber ich habe mich bereits für eine andere Route entschieden. Dennoch sollte beachtet werden, dass dies dbusmeiner Meinung nach spezifisch ist und sich ändert, wenn ein Betriebssystem gelöscht / neu installiert wird.
mikeserv
Das ist verdammt geil.
GeneCode
5

Auf vielen Linux-Rechnern /var/lib/dbus/machine-identhält die Datei eine eindeutige ID für jede Linux-Distribution und kann durch einen Aufruf von aufgerufen werden dbus_get_local_machine_id(). Dies ist wahrscheinlich das gleiche wie /etc/machine-idoben erwähnt. Es funktioniert auch bei virtuellen Linux-Installationen. Ich habe es auf aktuellen Ubuntu-, SuSE- und CentOS-Distributionen überprüft.

rankeney
quelle
1
In Fedora 19 + 20 existiert diese Datei nicht. Es ist hier: /etc/machine-id.
slm
Vielleicht war ich nicht klar genug. Mein Punkt war, dass, wenn Sie es einen Platz nicht finden, in den anderen schauen. Oder schreiben Sie über den Funktionsaufruf Ihr eigenes Programm.
Rankeney
0

Benötigen Sie die Rechner-ID, um sich zu ändern, wenn sich die Hardware ändert? Wird die Rechner-ID verwendet, um etwas zu schützen? Ich glaube, die beste Möglichkeit, eine "konsistente" Rechner-ID zu erhalten, besteht darin, irgendwo im System eine zufällige Zeichenfolge zu speichern. Wenn sich die Hardware ändert, ändert sich auch die Rechner-ID nicht. Dies gilt auch für virtualisierte Systeme, bei denen der Hardwarezugriff eingeschränkt ist und die MAC-ID 00: 00: 00: 00 lautet

Versuchen Sie so etwas wie dieses sh-Skript, um die ID zu erstellen und zu erhalten:

#!/bin/sh
FILE="/etc/machine-id"

if [ ! -f $FILE ]; then
    cat /dev/urandom|tr -dc A-Z0-9|head -c32 > $FILE;
fi

cat $FILE;
ub3rst4r
quelle
Da Ihr /dev/urandomLinux sowieso anzeigt, können Sie einfach tun, cat /proc/sys/kernel/random/uuid >$FILEwas bei jedem Lesevorgang zufällig eine korrekt formatierte UUID erzeugt. Dennoch kann jede auf der Festplatte implementierte Persistenz dbusgelöscht werden. Vorausgesetzt , dies ist akzeptabel und wird installiert, sollten Sie wahrscheinlich das tun, was @XZS stattdessen vorgeschlagen hat.
mikeserv
0

Die anderen Antworten geben eine Reihe von Möglichkeiten zum Extrahieren von IDs aus der Hardware. Sie können sich dafür entscheiden, eine oder mehrere Hardware-Komponenten als Bezeichner zu verwenden. Dies ist problematisch, wenn Sie Hardware-Teile beliebig austauschen oder ersetzen müssen.

Einige Leute können stattdessen eine generierte ID auf ihrer Festplatte speichern (oder die UUID verwenden), aber Festplatten können geklont werden.

TPM-Module und sicherer Start bieten möglicherweise die Möglichkeit, Motherboard und andere Hardware bei der Installation auf einer Festplatte zu binden.

In diesen Fällen ist es immer ein bisschen einfacher, wenn Sie weitere Informationen zu dem, was Sie erreichen möchten, angeben.

jgmjgm
quelle