Generieren Sie einen Schlüssel (eine Nummer?) basierend auf einem Teil der Hardwarekomponenten der Maschine

Generieren Sie einen Schlüssel (eine Nummer?) basierend auf einem Teil der Hardwarekomponenten der Maschine

Ich frage mich, was der beste Weg ist, basierend auf bestimmten Komponenten der Maschine manuell einen Hardwareschlüssel zu generieren.

Das ist der Punkt: Ich möchte, dass nur bestimmte Maschinentypen mit meinem Server kommunizieren können. Dazu möchte ich sicherstellen, dass ihre Hardware nur Teil der „zulässigen Hardware“ ist, die mein Server erkennt (oder akzeptiert).

Ich möchte einen Schlüssel basierend auf der besagten Hardware generieren, damit ich ihn auf der Serverseite überprüfen und sicherstellen kann, dass er zu den „erlaubten“ gehört.

Im Idealfall würde es "prüfen"

  • Prozessor
  • Hauptplatine
  • Ethernet-Netzwerkschnittstelle

Mit dem Arbeitsspeicher und der Festplatte ist es etwas knifflig, da sich diese recht häufig ändern können.

Ich verwende Ubuntu 10.10 und habe den lshwBefehl gesehen, der so ziemlich viele Informationen über... na ja... über alles liefert. Auch cat /proc/cpuinfo, dmidecode... Alle zeigen viele Informationen an, die ich immer mit regulären Ausdrücken analysieren und ... Dinge tun kann, aber ich habe mich gefragt, ob es einen saubereren, direkteren Weg gibt.

Jeder Hinweis oder Vorschlag zu dieser Angelegenheit wird geschätzt.

Danke schön.

Antwort1

Interessantes Problem, das Ihnen meiner Meinung nach am Ende noch zum Verhängnis werden wird.

Sie können ein Skript erstellen, das Folgendes tut:

rm /tmp/hw_snapshot
touch /tmp/hw_snapshot
cat /proc/cpuinfo | grep <whatever> >> /tmp/hw_snapshot
dmidecode | grep <whatever> >> /tmp/hw_snapshot
lspci | grep <whatever> >> /tmp/hw_snapshot
md5sum /tmp/hw_snapshot > /tmp/key

Nein, Sie haben eine eindeutige Kennung für Ihre Hardwarekonfiguration. Das Problem ist, dass selbst innerhalb derselben Modellreihe die Hardware stark variieren kann, einschließlich CPUs, Netzwerkkarten, Anzahl der Netzwerkkarten usw. Wenn also jemand eineHP DL380Modell und erhält dann ein anderes mit einer zusätzlichen Netzwerkkarte, ist Ihr eindeutiger Schlüssel nicht mehr gültig.

Außerdem verstehe ich immer noch nicht den Zweck einer hardwarebasierten Kommunikationsbeschränkung. Wenn Sie kontrollieren möchten, was mit Ihrem Computer kommuniziert, platzieren Sie die Dinge, die dazu in der Lage sind, in einem privaten Netzwerk (falls möglich).

Antwort2

Sie könnten zwar einfach eine md5sumder Ausgaben von lspciusw. erstellen dmidecode, dies führt jedoch bei geringfügigen Änderungen an der Hardware (z. B. wenn mehr Speicher hinzugefügt wird oder eine andere Netzwerkkarte vorhanden ist) oder sogar wenn sich die Ausgabe dieser Tools ändert.

Kommerzielle Software verwendet oft die MAC-Adresse der Netzwerkkarte für die Lizenzverwaltung, diese kann jedoch gefälscht werden, z. B. mitAbonnieren.

Wie bereits erwähnt, wäre es besser, diese Systeme in einem privaten Netzwerk mit eingeschränktem Zugriff zu platzieren, beispielsweise mithilfe eines VPN.

Antwort3

Schlüssel? Warum verwendest du kein SSH oder VPN?

Sie könnten den Herstellerteil der MAC-Adresse verwenden – dieser kann jedoch leicht gefälscht werden.

Antwort4

Nun... ich habe mit den Antworten, die ihr mir gegeben habt, „einen Eintopf gekocht“ und etwas bekommen, das für meine Anforderungen funktioniert und das vielleicht jemand nützlich finden könnte. Es ist ein Python-Skript, das sich direkt mit U-Dev verbindet (was meines Wissens dmidecodeintern verwendet wird), eine Reihe von Werten erfasst und daraus einen SHA256-Schlüssel generiert. Ich habe nur Informationen über die Netzwerkgeräte, das BIOS und das Motherboard verwendet. Das war gut genug für mich (es kann geändert werden... U-Dev bietet Informationen über... über alles, was Ihr System hat)

#!/usr/bin/env python    
import hashlib
import pyudev

if __name__ == "__main__":
    retval = None
    context = pyudev.Context()
    borrajaxHardwareKey = unicode()
    for netDevice in context.list_devices(subsystem="net"):
        actualDevice = netDevice.parent
        if actualDevice is not None:
            tmpList = list()
            try:
                tmpList.append(actualDevice.attributes.asstring("vendor"))
                tmpList.append(actualDevice.attributes.asstring("device"))
            except KeyError:
                tmpList = list()
            if len(tmpList) > 0:
                borrajaxHardwareKey = u"," + borrajaxHardwareKey + u":".join(tmpList)

    dmiThingy = pyudev.Device.from_path(context, '/sys/devices/virtual/dmi/id')
    dmiThingyValidAttrs = list()
    for dmiThingAttr in ["bios_vendor", "sys_vendor", "product_name", "board_vendor", "board_name"]:
        try:
            dmiThingyVal = dmiThingy.attributes.asstring(dmiThingAttr).strip()
            if len(dmiThingyVal) == 0:
                raise KeyError()
            else:
                dmiThingyValidAttrs.append(dmiThingyVal)
        except KeyError:
            pass

    borrajaxHardwareKey = u"," + borrajaxHardwareKey + u":".join(dmiThingyValidAttrs)
    print "1) Before hashing (do not use this one):\n\'%s\'" % borrajaxHardwareKey
    borrajaxHardwareKey = hashlib.sha256(borrajaxHardwareKey).hexdigest()
    print "2) After hashing:\n%s" % borrajaxHardwareKey

verwandte Informationen