Gere uma chave (número?) Baseada em parte dos componentes de hardware da máquina

Gere uma chave (número?) Baseada em parte dos componentes de hardware da máquina

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 lshwcomando 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 md5sumde saídas de lspci, dmidecodeetc..., 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 dmidecodeusa 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

informação relacionada