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

3

Eu estou querendo saber qual é a melhor maneira de gerar manualmente uma chave de hardware com base em determinados componentes da máquina.

Eis a questão: quero que apenas determinados tipos de máquinas possam se comunicar com meu servidor. Para fazer isso, eu gostaria de ter certeza de que o hardware deles é apenas parte do "hardware permitido" que meu servidor reconhece (ou aceita).

Eu gostaria de gerar uma chave com base no hardware para que eu possa verificá-lo no lado do servidor e ter certeza de que ele está entre os "permitidos".

O ideal seria "verificar"

  • Processador
  • Placa-mãe
  • interface de rede Ethernet

A memória e o disco rígido são um pouco complicados, porque eles podem mudar com frequência.

Estou usando o Ubuntu 10.10 e vi o comando lshw que fornece praticamente informações sobre ... bem ... sobre tudo. Além disso, cat /proc/cpuinfo , dmidecode ... Todos eles mostram muita informação que eu sempre posso analisar com expressões regulares e fazer ... coisas, mas eu queria saber se há uma maneira mais direta e mais limpa.

Qualquer sugestão ou sugestão sobre este assunto será apreciada.

Obrigado.

    
por BorrajaX 28.03.2012 / 18:43

4 respostas

2

Problema interessante que eu acho que vai te morder no final.

Você pode fazer um script que faça 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 muito, incluindo CPUs, Placas de Rede, Número de Placas de Rede, etc. Então, basicamente, se alguém tiver um HP DL380 modelo e, em seguida, recebe outro com uma placa de rede extra adicionado seu único chave não é mais válida.

Além disso, ainda não entendi o objetivo da restrição da base de hardware na comunicação. Se você quiser controlar o que fala a sua máquina, coloque as coisas que podem em uma rede privada com ele (se puder).

    
por 28.03.2012 / 19:40
2

Embora você possa criar apenas md5sum de saídas de lspci , dmidecode etc ..., isso causará problemas se houver uma pequena alteração de hardware (por exemplo, mais memória ou outra placa de rede é adicionada), ou mesmo se a saída dessas ferramentas mudar.

O software comercial geralmente usa o endereço MAC da placa de rede para o gerenciamento de licenças, mas isso pode ser forjado, por ex. com macchanger .

Como já foi dito, seria melhor colocar esses sistemas em uma rede privada com acesso restrito, usando, por exemplo, uma VPN.

    
por 28.03.2012 / 20:09
2

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.

    
por 28.03.2012 / 22:54
0

Bem ... eu "fiz um guisado" com as respostas que vocês me deram e eu tenho algo que está trabalhando para o que eu 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 um monte de valores e gera uma chave SHA256 com eles. Eu usei apenas informações sobre os dispositivos de rede, o BIOS e a placa-mãe. Isso foi bom o suficiente para mim (isso pode ser alterado ... O U-Dev oferece informações sobre ... sobre tudo que o seu sistema tem)

#!/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
    
por 18.04.2012 / 18:46