Generar una clave (¿número?) basada en parte de los componentes de hardware de la máquina

Generar una clave (¿número?) basada en parte de los componentes de hardware de la máquina

Me pregunto cuál es la mejor manera de generar manualmente una clave de hardware basada en ciertos componentes de la máquina.

Aquí está la cuestión: quiero que sólo cierto tipo de máquinas puedan comunicarse con mi servidor. Para poder hacerlo, me gustaría asegurarme de que su hardware sea solo parte del "hardware permitido" que mi servidor reconoce (o acepta).

Me gustaría generar una clave basada en dicho hardware para poder verificarla en el lado del servidor y asegurarme de que esté entre las "permitidas".

Lo ideal sería "comprobar"

  • Procesador
  • tarjeta madre
  • Interfaz de red Ethernet

La memoria y el disco duro son un poco complicados porque pueden cambiar con bastante frecuencia.

Estoy usando Ubuntu 10.10 y he visto el lshwcomando que proporciona bastante información sobre... bueno... sobre todo. Además, cat /proc/cpuinfo, dmidecode... Todos ellos muestran mucha información que siempre puedo analizar con expresiones regulares y hacer... cosas, pero me preguntaba si hay una forma más limpia y directa.

Cualquier pista o sugerencia en este asunto será apreciada.

Gracias.

Respuesta1

Interesante problema que creo que al final te afectará.

Puedes hacer un script que hará lo siguiente:

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

No, tiene un identificador único para su configuración de hardware. El problema es que incluso dentro de la misma línea de modelo, el hardware puede variar ampliamente, incluidas CPU, tarjetas de red, cantidad de tarjetas de red, etc. Básicamente, si alguien tiene unHP DL380modelo y luego obtiene otro con una tarjeta de red adicional agregada, su clave única ya no es válida.

Además, todavía no entiendo el propósito de la restricción de la comunicación basada en hardware. Si desea controlar lo que habla con su máquina, coloque todo lo que pueda en una red privada (si puede).

Respuesta2

Si bien podría simplemente crear una md5sumserie de salidas desde lspci, dmidecodeetc..., esto causará problemas si hay algún pequeño cambio en el hardware (por ejemplo, se agrega más memoria u otra tarjeta de red), o incluso si cambia la salida de esas herramientas.

El software comercial suele utilizar la dirección MAC de la tarjeta de red para la gestión de licencias, pero esto puede falsificarse, por ejemplo, conmaccambiador.

Como ya se indicó, sería mejor colocar esos sistemas en una red privada con acceso restringido, utilizando, por ejemplo, una VPN.

Respuesta3

¿Llave? ¿Por qué no usas SSH o VPN?

Podrías usar la parte del proveedor de la dirección MAC, pero eso puede falsificarse fácilmente.

Respuesta4

Bueno... "hice un guiso" con las respuestas que ustedes me dieron y obtuve algo que está funcionando para lo que necesito y que tal vez a alguien le pueda resultar útil. Es un script de Python que se conecta directamente a U-Dev (que es lo que entiendo que dmidecodese usa internamente), toma un montón de valores y genera una clave SHA256 con ellos. Sólo utilicé información sobre los dispositivos de red, la BIOS y la placa base. Eso fue suficiente para mí (se puede cambiar... U-Dev ofrece información sobre... sobre todo lo que tiene su sistema)

#!/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

información relacionada