기계의 일부 구성 요소를 기반으로 하드웨어 키를 수동으로 생성하는 가장 좋은 방법이 무엇인지 궁금합니다.
문제는 다음과 같습니다. 특정 유형의 컴퓨터만 내 서버와 통신할 수 있기를 바랍니다. 이를 위해 해당 하드웨어가 내 서버에서 인식(또는 허용)하는 "허용된 하드웨어"의 일부인지 확인하고 싶습니다.
해당 하드웨어를 기반으로 키를 생성하여 서버 측에서 확인하고 "허용" 범위 내에 있는지 확인하고 싶습니다.
이상적으로는 "확인"하는 것입니다.
- 프로세서
- 마더보드
- 이더넷 네트워크 인터페이스
메모리와 하드 드라이브는 자주 변경될 수 있기 때문에 조금 더 까다롭습니다.
lshw
저는 Ubuntu 10.10을 사용하고 있으며 이 명령이 모든 것에 대해...글쎄...모든 것에 대한 많은 정보를 제공하는 것을 보았습니다 . 또한, cat /proc/cpuinfo
, dmidecode
... 이들 모두는 많은 정보를 표시하는데, 이는 항상 정규식으로 구문 분석하여... 작업을 수행할 수 있지만 더 깨끗하고 직접적인 방법이 있는지 궁금합니다.
이 문제에 대한 조언이나 조언을 주시면 감사하겠습니다.
감사해요.
답변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
etc.에서 출력을 생성할 수도 있지만 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