
하드웨어 프로비저닝을 제어하고 동일한 하드웨어 모델을 사용하는 모든 장치가 실제로 네트워킹 인터페이스에 대한 고유한 MAC 주소를 가지고 있는지 확인할 수 있는 시나리오에서 해당 가정을 사용하는 코드를 작성하면 단점이 있습니까? (일부 답변을 기반으로 한 참고 사항: 이 가정을 사용하여 네트워킹 코드를 작성하지 않을 것입니다. 이는 이전에 ID로 장치 HDD를 수동으로 생성하고 업데이트할 필요 없이 장치당 UUID를 갖는 간단한 방법일 뿐입니다. 현장에 배치)
이에 대한 배경 이야기는 클라이언트를 위한 개인 하드웨어 IOT 유형 구현을 구현하는 것을 연구하고 있다는 것입니다. 원격 위치에 설치할 수 있는 네트워킹 기능을 갖춘 하드웨어 장치 세트를 제공합니다. 그러면 이러한 장치는 메시지를 보내 API와 다시 통신합니다. 설정의 복잡성을 줄이기 위해 메시지에 있는 장치의 네트워크 인터페이스의 MAC 주소를 보내고 이러한 메시지를 API 측의 "device_id"에 다시 연결하려고 했습니다. 내 생각에는 사용하기 전에 장치에 설정할 필요가 없는 것으로 만들어서 정상적인 작동 중에 쿼리할 수 있다고 생각합니다. 각 장치의 MAC 주소가 실제로 고유하다는 것을 확인할 수 있다고 안전하게 가정할 수 있으며, 해당 device_id에 대한 메시지가 이제 다른 MAC 주소를 갖게 된다는 것을 알기 위해 장치 교체 시기/교체 여부를 제어할 수 있습니다.
답변1
프로비저닝 중에 제조업체 MAC이 실제로 생성 중인 장치 네트워크 내에서 고유하다는 것을 확인할 수 있다는 진술을 바탕으로(그 자체로는 확실하지 않지만 그래야 함에도 불구하고), 아마도 잘 진행되고 있을 것입니다. 하지만 다음 질문을 고려해 보세요.
보안검사(인증, 승인)에 MAC을 사용하고 계시나요? 그렇다면 MAC만으로는 충분하지 않습니다. 그것을 고려하지도 마십시오. 암호화 구조를 사용하고 모든 인증 요청을 안전하게 전송하세요.
48비트이면 충분합니까? 아마도 그럴 것 같지만 물어볼 가치가 있습니다.
NIC를 교체하여 장치를 수리해야 하는 경우가 있습니까?
장치 전체를 교체하거나 NIC를 교체하는 경우 배포 위치에 대한 데이터 수집의 연속성을 보장하기 위해 새 주소를 데이터베이스의 기존 키에 연결할 수 있어야 합니까?
사용자(승인 여부에 관계없이)가 ROM, 드라이버 또는 OS 수준에서 NIC를 변경할 수 있는 유지 관리 인터페이스가 있습니까? 공격자가 MAC를 수정하려는 경우 데이터에 결함이 생길 수 있습니다.
MAC를 키로 사용하여 데이터가 다른 데이터 소스와 결합됩니까?
단순히 장치가 연결된 레이어 2 LAN(유선 또는 무선)을 탐색하는 것 이외의 네트워킹 목적으로 MAC를 사용하시겠습니까?
귀하의 장치가 연결된 LAN은 개인 네트워크입니까, 아니면 많은 수의 임시 클라이언트(예: 직원 휴대폰)가 연결되는 LAN입니까?
당신의 대답이 다음과 같다면
NO, yes, no, no, no, no, no, private
그렇다면 나는 당신의 계획에 어떤 실질적인 결함도 없다고 생각합니다.
이를 수행하기 위해 전 세계적으로 고유한 MAC이 필요하지 않다는 점을 명심하십시오. API를 호출하는 인터넷 장치의 하위 집합이 고유한지 확인하면 됩니다. 서로 다른 두 도시에 할당된 중복 NIC가 서로 다른 LAN에 있기 때문에 충돌할 수 없는 것처럼, API를 호출하지 않는 MAC에서는 데이터베이스 키 충돌이 발생할 수 없습니다.
답변2
MAC 주소가 고유하지 않습니다.
MAC과 중복될 수 있으며 앞으로도 그럴 것입니다. 그 이유는 여러 가지가 있는데, 그 중 하나는 그들이그럴 필요는 없다(전역적으로) 고유합니다.
MAC는 로컬 네트워크에서 고유해야 ARP/NDP가 해당 작업을 수행할 수 있고 스위치는 들어오는 데이터그램을 어디로 보낼지 알 수 있습니다. 일반적으로(반드시 그런 것은 아님) 전제 조건이 충족되고 모든 것이 잘 작동합니다. 이는 단순히 고유하지 않더라도 동일한 LAN에 두 개의 동일한 MAC이 있을 가능성이 매우 낮기 때문입니다.
또 다른 이유는 단순히 주소보다 더 많은 장치가 존재하기 때문입니다. 48비트 주소는 하루가 끝날 때까지 모든 사람에게 충분한 주소가 있는 것처럼 들리지만 사실은 그렇지 않습니다.
주소 공간은 두 개의 24비트 부분으로 나뉩니다(약간 더 복잡하지만 사소한 세부 사항은 무시하겠습니다). 절반은 IEEE에 등록하여 약 2000달러에 회사에 할당할 수 있는 OUI입니다. 나머지 24비트는 원하는 대로 하면 됩니다. 물론 여러 개의 OUI를 등록할 수 있는데, 이는 더 큰 플레이어가 하는 일입니다.
인텔을 예로 들어보겠습니다. 총 7개의 OUI를 등록하여 총 1억 1600만 개의 주소를 제공합니다.
내 컴퓨터의 메인보드(X99 칩셋 사용)와 노트북의 메인보드 및모든지난 10~15년 동안 제가 소유한 x86 기반 컴퓨터에는 칩셋의 일부로 Intel 네트워크 카드가 포함되어 있었습니다. 확실히 전 세계에는 1억 1600만 대가 넘는 Intel 기반 컴퓨터가 있습니다. 따라서 그들의 MAC그럴 리가 없어고유해야 합니다(전역적으로 고유하다는 의미에서).
또한, 어... 더 싼... 제조업체가 단순히 다른 사람의 OUI에서 주소를 "훔치는" 사례가 보고되었습니다. 즉, 그들은 임의의 주소를 사용했습니다. 전체 제품군에 대해 동일한 주소를 사용하는 제조업체에 대해서도 들었습니다. 그 중 어느 것도 실제로 부합하지도 않고 말이 되지도 않지만, 이에 대해 무엇을 할 수 있습니까? 이러한 네트워크 카드가 존재합니다. 다시 말하지만, 그것이 될 가능성은현실적인주소가 의도한 대로 사용되는 경우 문제는 여전히 매우 낮습니다. 주소 중 두 개가 필요합니다.동일한 LAN에심지어 알아 차리기 위해.
이제 문제를 어떻게 해야 할까요?
해결책은 생각보다 간단할 수도 있습니다. IoT 장치에는 아마도 시간 개념이 필요할 것입니다. 일반적으로 시간은 NTP를 통해 자동으로 가져옵니다. NTP의 일반적인 정밀도는 마이크로초 범위입니다(예, 밀리가 아니라 마이크로입니다). 나는 단지 ntpq -c rl
확인하기 위해 달려갔고 2 -20이라는 말을 들었습니다 .
정확히 동일한 마이크로초에 두 장치가 처음으로 켜질 가능성은 매우 낮습니다. 일반적으로 이런 일이 일어날 수 있습니다(특히 매우 짧은 시간에 수백만 개를 판매하는 경우 성공을 축하합니다!). 그러나 그럴 가능성은 그리 높지 않습니다. 실제로는 그런 일이 일어나지 않을 것입니다. 따라서 영구 저장소에서 처음 부팅한 후 시간을 절약하십시오.
IoT 장치의 부팅 시간은 모든 장치에서 동일합니다.그 외에는 전혀 사실이 아니다.
고해상도 타이머를 사용하면 동일한 장치에서도 부팅 시간이 매번 눈에 띄게 다릅니다. 아마도 몇 개의 클럭 틱만 다를 수 있으므로(또는 CPU의 타임스탬프 카운터와 같은 것을 읽는 경우 수십만) 완전히 고유하지는 않지만 약간의 엔트로피를 추가하는 것은 확실합니다.
마찬가지로 걸리는 시간도connect
API 사이트에 처음 액세스할 때 돌아오는 방법은 조금씩 다르지만 측정 가능한 수준은 매번 다릅니다. 마찬가지로 getaddrinfo
처음으로 웹 API의 호스트 이름을 조회할 때 모든 장치에 대해 약간씩 다르며 측정 가능한 시간이 소요됩니다.
3개 또는 4개의 엔트로피 소스(MAC 주소, 처음 전원을 켠 시간, 처음 부팅하는 시간, 연결 시간)를 연결하고 그로부터 해시를 계산합니다. MD5는 그 목적에 딱 맞습니다. 거기, 당신은 독특해요.
그러지 않는 동안진심으로고유성을 보장하면 실패할 가능성이 거의 없이 고유성을 "거의" 보장합니다. 동일한 MAC을 가진 두 개의 장치가 동일한 마이크로초에 처음으로 켜지고 부팅하고 사이트에 연결하는 데 정확히 동일한 시간이 소요되어야 합니다. 그런 일은 일어나지 않을 것입니다. 그런 일이 발생하면 즉시 복권을 시작해야 합니다. 왜냐하면 모든 상황에서 당첨이 보장되기 때문입니다.
그러나 "발생하지 않을 것"이라는 보장이 충분하지 않은 경우에는 웹 API에 처음 액세스할 때 각 장치에 순차적으로 증가하는 숫자(서버에서 생성됨)를 전달하면 됩니다. 장치에 해당 번호를 저장하도록 하세요.
답변3
여기서 문제는 실제로 XY 문제이기 때문에 식별자를 미리 로드할 필요 없이 처음 부팅할 때 하드웨어에 대한 고유 식별자를 얻는 방법을 해결하는 방법을 다루겠습니다. 모든 좋은 방법은 결국 한 가지로 요약됩니다. 바로 엔트로피 소스를 확보하는 것입니다.
하드웨어에 하드웨어 엔트로피 소스로 설계된 것이 있는 경우(참고: 이는 기본적으로 TLS에 필요하므로 적절한 IoT 장치 구현을 위한 요구 사항이므로 하드웨어~해야 한다이를 염두에 두고 설계하세요.) 그냥 사용하세요. 그렇지 않다면 창의력을 발휘해야 합니다.
다행히 지금까지 만들어진 거의 모든 컴퓨터에는 뛰어난 엔트로피 소스가 있습니다.수정 발진기(시계). 주어진 결정의 속도는 미묘한 온도 변화에만 의존하는 것이 아니라 온도에도 영향을 받습니다.히스테리시스비선형 방식으로. 그러나 엔트로피를 측정하려면 첫 번째 시간을 측정하는 두 번째 시계가 필요합니다. 이것이 의미하는 바는 컴퓨터에 샘플링할 수 있는 시계가 두 개 이상 있을 때마다 다른 하나가 측정한 속도를 매우 고품질 엔트로피 소스로 사용할 수 있다는 것입니다.
답변4
나는 XY 문제를 가정하는 것을 싫어합니다. OP는 자신이 수행하는 방식으로 작업을 수행하는 복잡한 이유가 있지만 MAC 주소와 같은 각 장치에 대한 고유 식별자를 생성하는 다른 방법을 조사하고 싶을 수 있기 때문입니다. 는 기기에 '내장'되어 있으며 고유한 식별자를 생성할 필요가 없습니다.
장치가 모두 동일한 제조업체(또는 동일한 모델)의 제품인 경우 일련번호를 사용하여 식별자를 생성할 수 있습니다. 하지만 제조업체 이름 및 모델 번호와 결합하더라도 여러 제조업체의 장치에서는 잘 작동하지 않습니다. 이는 일련 번호 형식이 다르고 내장형/독점 장치의 경우 일련 번호를 얻기 위한 API도 다를 수 있기 때문입니다. . 장치 일련 번호 대신 마더보드, CPU 또는 하드 디스크의 일련 번호를 사용할 수도 있습니다(Windows 라이선스에서는 이들의 조합을 사용한다고 생각합니다).
또한 파일 시스템 포맷터는 일반적으로 각 파일 시스템에 대해 고유한 ID를 생성한다는 점을 기억할 가치가 있습니다. 동일한 이미지로 모든 장치를 준비하지 않는 한(관련 없는 이유로 그렇게 하는 것이 좋습니다), 각 하드 디스크에는 이미 사용할 수 있는 파일 시스템에 저장된 고유 ID가 있습니다.
그런데 그렇게 말하면 딱히 이유가 없다.~ 아니다특히 프로비저닝 프로세스의 일부로 해당 주소가 실제로 고유한지 확인할 수 있는 경우 MAC 주소를 사용합니다(여기서 수천 대 이하의 장치에 대해 이야기한다고 가정하면 이것이 필요하지 않더라도). 물론, 사용하는 모든 것이 장치에 의해 스푸핑될 수 있으므로 신뢰할 수 없는 환경에서 인증을 위해 이에 의존하지 마십시오(개인 설정이라고 하셨으므로 아마도 이것은 "신뢰할 수 있는" 환경일 것입니다). 귀하의 클라이언트가 자신의 서버에 대해 자신의 장치를 스푸핑하는 것에 대해 주의를 기울이십시오. 그러나 장치 관리가 제3자 또는 최종 사용자에게 넘겨지는 경우에는 이 점을 분명히 염두에 두어야 합니다.