マシンの一部のハードウェアコンポーネントに基づいてキー(数値?)を生成します。

マシンの一部のハードウェアコンポーネントに基づいてキー(数値?)を生成します。

マシンの一部のコンポーネントに基づいてハードウェアキーを手動で生成する最良の方法は何ですか?

問題は次のとおりです。特定の種類のコンピュータだけがサーバーと通信できることを願っています。そのために、そのハードウェアが私のサーバーで認識(または許可)する「許可されたハードウェア」の一部であることを確認したいと思います。

そのハードウェアに基づいてキーを生成してサーバー側で確認し、「許可」の範囲内にあることを確認したいと思います。

理想的には「確認」することです。

  • プロセッサ
  • マザーボード
  • イーサネットネットワークインターフェース

メモリとハードドライブは頻繁に変更される可能性があるため、少し面倒です。

lshw私はUbuntu 10.10を使用しており、このコマンドがすべてについて...まあ...すべてについての多くの情報を提供するのを見ました。また、cat /proc/cpuinfodmidecode...これらはすべて多くの情報を表示しますが、これは常に正規表現で構文解析することができます。

この問題に関するアドバイスやアドバイスをいただきありがとうございます。

ありがとうございます。

答え1

私はこれが最終的にあなたを悩ませる興味深い質問だと思います。

以下を実行するスクリプトを作成できます。

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

いいえ、ハードウェア構成には一意の識別子があります。問題は、同じモデルシリーズ内でも、CPU、ネットワークカード、ネットワークカードの数など、ハードウェアが大きく異なる可能性があることです。したがって、基本的に誰でもHP DL380モデルを選択して追加のネットワークカードを含む他のモデルを購入すると、一意のキーを追加することはできません。

また、ハードウェアベースの制限通信の目的をまだ理解していません。あなたのコンピュータとの通信を制御するには(可能であれば)プライベートネットワークに何かを置きます。

答え2

md5sumなどで出力を生成することもできますが、ハードウェアの変更が少ない(メモリーの追加や他のネットワークカードのlspci追加dmidecodeなど)、またはこれらのツールの出力が変わっても問題が発生する可能性があります。

商用ソフトウェアは、ライセンス管理にネットワークカードのMACアドレスを使用することがよくありますが、これは偽造される可能性があります。マイチェンジグリッド

前述のように、VPN を使用するなど、アクセスが制限されたプライベート ネットワークにこれらのシステムを配置することをお勧めします。

答え3

キー? SSHやVPNを使用しないのはなぜですか?

MACアドレスのベンダー部分を使用できますが、これは簡単に偽造される可能性があります。

答え4

まあ...私はあなたが与えた答えを「沸騰させて」私のニーズに合ったものを手に入れました。 U-Dev(私が知っている限りdmidecode内部的に使用されています)に直接接続し、複数の値を取得してSHA256キーを生成するために使用するPythonスクリプトです。ネットワークデバイス、BIOS、マザーボードに関する情報のみを使用しました。それは私にとって十分です(変更することができます... U-Devは...システム内のすべてのものに関する情報を提供します)

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

関連情報