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 lshw
comando 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 md5sum
serie de salidas desde lspci
, dmidecode
etc..., 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 dmidecode
se 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