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

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

マシンの特定のコンポーネントに基づいてハードウェア キーを手動で生成する最適な方法は何かと思っています。

問題は、特定の種類のマシンだけがサーバーと通信できるようにしたいということです。そのためには、それらのハードウェアが、サーバーが認識 (または受け入れ) する「許可されたハードウェア」の一部であることを確認したいと思います。

上記のハードウェアに基づいてキーを生成し、サーバー側でチェックして、それが「許可されたもの」の中にあることを確認できるようにしたいと思います。

理想的には「チェック」する

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

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

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、ネットワークカード、ネットワークカードの数など、ハードウェアが大きく異なる可能性があることです。つまり、基本的に誰かがHPDL380モデルを購入し、その後、追加のネットワーク カードが追加された別のモデルを購入すると、一意のキーは無効になります。

さらに、ハードウェア ベースの通信制限の目的がまだわかりません。マシンと通信するものを制御したい場合は、制御できるものをプライベート ネットワーク上に配置します (可能な場合)。

答え2

md5sumなどからの出力のを作成することもできますが、ハードウェアにわずかな変更 (メモリの増設やネットワーク カードの追加など) があった場合や、それらのツールからの出力が変わった場合lspcidmidecodeも問題が発生します。

商用ソフトウェアはライセンス管理にネットワークカードの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

関連情報