Estou me perguntando qual é a melhor maneira de gerar manualmente uma chave de hardware com base em determinados componentes da máquina.
O problema é o seguinte: quero que apenas determinados tipos de máquinas possam se comunicar com meu servidor. Para fazer isso, gostaria de ter certeza de que o hardware deles é apenas parte do "hardware permitido" que meu servidor reconhece (ou aceita).
Gostaria de gerar uma chave baseada nesse hardware para poder verificá-la no lado do servidor e ter certeza de que está entre as "permitidas".
Idealmente, seria "verificar"
- Processador
- Placa-mãe
- Interface de rede Ethernet
A memória e o disco rígido são um pouco complicados, porque podem mudar com bastante frequência.
Estou usando o Ubuntu 10.10 e vi o lshw
comando que fornece muitas informações sobre... bem... sobre tudo. Além disso, cat /proc/cpuinfo
, dmidecode
... Todos eles mostram muitas informações que sempre posso analisar com expressões regulares e fazer... coisas, mas queria saber se existe uma maneira mais direta e mais limpa.
Qualquer dica ou sugestão neste assunto será apreciada.
Obrigado.
Responder1
Problema interessante que eu acho que vai te morder no final.
Você pode fazer um script que fará o seguinte:
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
Não, você tem um identificador exclusivo para sua configuração de hardware. A questão é que mesmo dentro da mesma linha de modelo o hardware pode variar bastante, incluindo CPUs, placas de rede, número de placas de rede, etc.HPDL380modelo e, em seguida, obtém outro com uma placa de rede extra adicionada, sua chave exclusiva não é mais válida.
Além disso, ainda não entendo o propósito da restrição de base de hardware na comunicação. Se você quiser controlar o que fala com sua máquina coloque com ela o que puder em uma rede privada (se puder).
Responder2
Embora você possa simplesmente criar uma série md5sum
de saídas de lspci
, dmidecode
etc..., isso causará problemas se houver alguma pequena alteração de hardware (por exemplo, mais memória ou outra placa de rede for adicionada), ou mesmo se a saída dessas ferramentas for alterada.
Software comercial geralmente usa o endereço MAC da placa de rede para gerenciamento de licenças, mas isso pode ser falsificado, por exemplo, commacchanger.
Como já foi dito, seria melhor colocar esses sistemas numa rede privada com acesso restrito, usando, por exemplo, uma VPN.
Responder3
Chave? Por que você não usa SSH ou VPN?
Você poderia usar a parte do fornecedor do endereço MAC - mas isso pode ser facilmente falsificado.
Responder4
Bom... eu "fiz um ensopado" com as respostas que vocês me deram e consegui algo que está funcionando para o que preciso e que talvez alguém possa achar útil. É um script Python que se conecta diretamente ao U-Dev (que é o que eu entendo que dmidecode
usa internamente), pega vários valores e gera uma chave SHA256 com eles. Usei apenas informações sobre os dispositivos de rede, a bios e a placa-mãe. Isso foi bom o suficiente para mim (pode ser alterado... U-Dev oferece informações sobre... sobre tudo o que seu sistema possui)
#!/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