장치 MAC 주소가 고유하지 않은 이유 수동으로 생성하고 업데이트하지 않고 장치 당

하드웨어 프로비저닝을 제어하고 동일한 하드웨어 모델을 가진 모든 장치가 네트워킹 인터페이스에 대해 고유 한 MAC 주소를 가지고 있다고 판단 할 수있는 시나리오에서 해당 가정을 사용하는 코드를 작성하는 데 단점이 있습니까? (일부 답글을 기반으로 한 참고 사항 :이 가정을 사용하여 네트워킹 코드를 작성하지는 않겠습니다. 이전에는 ID로 장치 HDD를 수동으로 생성하고 업데이트하지 않고 장치 당 uuid를 갖는 터치가 적은 방법입니다 현장에 배치)

이것에 대한 배경 이야기는 클라이언트를위한 개인 하드웨어 IOT 유형 구현을 연구하고 있다는 것입니다. 원격 위치에 설치할 네트워킹 기능이있는 하드웨어 장치 세트를 프로비저닝합니다. 그런 다음 이러한 장치는 메시지를 보내 API와 다시 통신합니다. 설정의 복잡성을 줄이기 위해 메시지에서 장치의 네트워크 인터페이스 MAC 주소를 보내서 API 쪽의 “device_id”에 다시 연결하기를 바랐습니다. 내 생각은 사용하기 전에 장치에 설정할 필요가없는 것으로 만들어 정상적인 작동 중에 쿼리 할 수 ​​있다고 생각합니다. 각 기기의 MAC 주소가 실제로 고유하다고 판단 할 수 있다고 가정 할 수 있습니다.



답변

프로비저닝하는 동안 제조업체 MAC이 실제로 만드는 장치의 네트워크 내에서 고유하다는 사실을 확인한 진술에 따르면 (아직 확실하지는 않지만 확실하게 진행 중), 그러나 다음 질문을 고려하십시오.

  • 보안 검사 (인증, 권한 부여)에 MAC을 사용하고 있습니까? 그렇다면 MAC로는 충분하지 않습니다. 그것을 고려하지 마십시오. 암호화 구조를 사용하고 모든 인증 요청을 안전하게 전송하십시오.

  • 48 비트로 충분합니까? 아마도 가치가 있지만 물어볼 가치가 있습니다.

  • 장치를 교체하여 장치를 수리해야합니까?

  • 장치를 완전히 교체하거나 nic을 교체하는 경우 배포 위치에 대한 데이터 수집의 연속성을 보장하기 위해 데이터베이스의 기존 키에 새 주소를 연결할 수 있어야합니까?

  • ROM (드라이버) 또는 OS 레벨에서 nic을 변경할 수있는 유지 보수 인터페이스가 있습니까? 공격자가 MAC을 수정하려는 경우 데이터에 결함이 발생할 수 있습니다.

  • MAC을 키로 사용하여 데이터가 다른 데이터 소스와 결합됩니까?

  • 장치가 연결된 (유선 또는 무선) 계층 2 LAN을 단순히 탐색하는 것 이외의 다른 네트워킹 목적으로 MAC을 사용 하시겠습니까?

  • 장치가 연결된 LAN, 개인 네트워크 또는 직원 휴대폰과 같은 많은 임시 클라이언트가 연결되는 LAN입니까?

당신의 대답이

NO, yes, no, no, no, no, no, private

당신의 계획에 어떤 결함도 생각할 수 없습니다.

이를 막기 위해 전 세계적으로 고유 한 MAC이 필요하지 않습니다. API를 호출하는 인터넷 장치의 하위 집합이 고유한지 확인하면됩니다. 서로 다른 LAN에 있기 때문에 서로 다른 두 도시에 할당 된 중복 닉이 충돌 할 수없는 것처럼 API를 호출하지 않으면 MAC에서 데이터베이스 키 충돌을 수행 할 수 없습니다.


답변

MAC 주소는 고유하지 않습니다

MAC과 중복 될 수 있습니다. 그 이유는 여러 가지가 있습니다. 하나는 (전 세계적으로) 고유 할 필요가 없기 때문 입니다.

MAC은 로컬 네트워크에서 고유해야하므로 ARP / NDP가 작업을 수행 할 수 있으며 스위치는 들어오는 데이터 그램을 전송할 위치를 알고 있습니다. 일반적으로 (필요하지는 않지만) 전제 조건이 충족되고 상황이 정상적으로 작동합니다. 단순히 동일한 LAN에 두 개의 동일한 MAC이 고유하지는 않더라도 매우 낮기 때문입니다.

또 다른 이유는 단순히 주소보다 많은 장치가 존재하기 때문입니다. 48 비트 주소는 끝날 때까지 모든 사람에게 충분한 주소가있는 것처럼 들리지만 그렇지 않습니다.

주소 공간은 2 개의 24 비트 반으로 나뉩니다 (약간 더 복잡하지만 작은 세부 사항은 무시합시다). 절반은 IEEE에 등록하고 회사에 약 2000 달러를 할당 할 수있는 OUI입니다. 나머지 24 비트는 원하는대로합니다. 물론 여러 OUI를 등록 할 수 있으며, 이는 더 큰 플레이어가하는 일입니다.

인텔을 예로 들어 보겠습니다. 총 7 개의 OUI를 등록하여 총 1 억 1,600 만 개의 주소를 제공합니다.
내 컴퓨터의 메인 보드 (X99 칩셋 사용)와 노트북의 메인 보드 및 지난 10-15 년 동안 소유 한 모든 x86 기반 컴퓨터 의 메인 보드 는 칩셋의 일부로 인텔 네트워크 카드를 가지고있었습니다. 확실히 세계에는 1 억 1 천 6 백만 대 이상의 인텔 기반 컴퓨터가 있습니다. 따라서 MAC 고유 할 수 없습니다 (전 세계적으로 고유 한 의미로).

또한, 더 싸고 … 제조업체가 단순히 다른 사람의 OUI로부터 주소를 “스털링”하는 사례도보고되었습니다. 즉, 그들은 단지 임의의 주소를 사용했습니다. 전체 제품군에 동일한 주소를 사용하는 제조업체에 대해서도 들었습니다. 그 중 어느 것도 실제로 적합하거나 많은 의미가 없지만, 그것에 대해 무엇을 할 수 있습니까? 이 네트워크 카드가 존재합니다. 다시 : 주소가 의도 한대로 사용되는 경우 실제 문제가 될 가능성 은 여전히 ​​매우 낮 습니다. 동일한 LAN에 두 개가 있어야 통지 할 수 있습니다.

이제 문제에 대해 어떻게해야합니까?

해결책은 생각보다 간단 할 것입니다. IoT 장치에는 시간 개념이 필요할 것입니다. 일반적으로 시간은 NTP를 통해 자동으로 얻습니다. NTP의 일반적인 정밀도는 마이크로 초 범위 (예, 밀리미터가 아닌 마이크로 미터)입니다. 나는 방금 달려서 2-20ntpq -c rl 으로 들었다 .

두 장치가 정확히 동일한 마이크로 초에 처음으로 켜질 가능성은 매우 낮습니다. 일반적으로 일어날 수 있습니다 (특히 짧은 시간에 수백만 대를 판매하는 경우 성공을 축하합니다!). 그러나 실제로는 그렇지 않을 것입니다. 따라서 영구 저장소에서 처음 부팅 한 후 시간을 절약하십시오.

IoT 장치의 부팅 시간은 모든 장치에서 동일합니다. 그건 사실이 아닙니다 .
고해상도 타이머가 주어지면 부팅 시간은 매번 같은 장치에서도 측정 할 수있는 차이가 있습니다. CPU의 타임 스탬프 카운터와 같은 것을 읽는 경우 수십만 개의 클록 틱 만 다르므로 매우 독특하지는 않지만 엔트로피가 추가됩니다.
마찬가지로 connectAPI 사이트에 처음 액세스 할 때 반환하는 데 걸리는 시간은 매번 약간 씩 다르지만 측정 가능할 수 있습니다. 마찬가지로 getaddrinfo웹 API의 호스트 이름을 처음으로 검색 할 때 모든 기기에 대해 약간 다른 측정 시간이 걸립니다.

엔트로피의 3 ~ 4 가지 소스 (MAC 주소, 최초 전원 공급 시간, 처음 부팅 시간, 연결 시간)를 연결하고 해시를 계산하십시오. MD5는 그 목적에 적합합니다. 당신은 독특합니다.

이것이 고유성을 실제로 보장 하지는 않지만 무시할 수없는 실패 가능성으로 “거의”보장합니다. 동일한 마이크로 초에 처음으로 켜진 동일한 MAC을 가진 두 개의 장치가 있어야하고, 부팅하고 사이트에 연결하는 데 정확히 같은 시간이 걸렸습니다. 그런 일은 일어나지 않을 것입니다. 그것이 발생하면 모든 출연으로 인해 복권을 즉시 시작해야합니다. 승리가 보장됩니다.

그러나 “발생하지 않을 것”이 보장만큼 충분하지 않은 경우, 처음으로 웹 API에 액세스 할 때 각 장치를 순차적으로 증가하는 수 (서버에서 생성됨)를 전달하십시오. 장치가 해당 번호를 저장하게하십시오.


답변

여기서 문제는 실제로 XY 문제이므로 식별자를 미리로드하지 않고 처음 부팅 할 때 하드웨어에 대한 고유 식별자를 얻는 방법을 해결하려고합니다. 모든 좋은 방법은 엔트로피의 근원을 갖는 것입니다.

하드웨어에 하드웨어 엔트로피 소스로 설계된 것이있는 경우 (참고 : TLS에 필요하기 때문에 기본적으로 적절한 IoT 장치 구현의 요구 사항이므로 하드웨어 를 염두에두고 설계 해야 함) 그냥 사용하십시오. 그렇지 않다면 창의력을 발휘해야합니다.

운 좋게도 거의 모든 컴퓨터에는 엔트로피의 훌륭한 원천 인 수정 발진기 (clock)가 있습니다. 주어진 결정의 속도는 미묘한 온도 변화에 의존 할뿐만 아니라 비선형 방식으로 온도 이력 에도 영향을받습니다 . 그러나 엔트로피를 측정하려면 첫 번째 시간을 맞추기 위해 두 번째 시계가 필요합니다. 즉, 컴퓨터에 샘플링 할 수있는 클럭이 두 개 이상있을 때마다 하나의 속도를 다른 고품질의 엔트로피 소스로 사용할 수 있습니다.


답변

다른 매우 좋은 답변이 있기 때문에 질문에 직접 대답하고 싶지 않지만 대신 장치 ID로 사용할 수있는 더 적합한 다른 값을 제안하고 싶습니다.

하드웨어에서 지원하는 경우 SMBIOS UUID 사용을 고려할 수 있습니다. 메인 보드 및 장치의 고유 ID입니다. IoT 장치에도 여러 개의 NIC (LAN 및 WiFi)가있을 수 있으므로 MAC 경로를 선택하는 경우 계속해서 하나를 선택하는 방법을 찾아야합니다.

또한 UUID는 고유하지만 친숙한 환경에서만 고유하게 보장되므로 보안 목적으로 사용해서는 안됩니다.


답변

나는 종종 OP가 그들이하는 방식으로 일을하는 복잡한 이유가 있지만 XY 문제를 가정하는 것이 싫지만 MAC 주소와 같은 각 장치에 대해 고유 한 식별자를 생성하는 다른 방법을 찾고 싶을 수도 있습니다. 은 기기에 ‘내장’되어 있으며 고유 식별자를 생성하지 않아도됩니다.

장치가 모두 동일한 제조업체 (또는 더 나은 경우 동일한 모델)의 제품인 경우 일련 번호를 사용하여 식별자를 생성 할 수 있습니다. 내장 / 소유 장치의 경우 일련 번호 형식이 다르고 일련 번호를 얻기위한 다른 API로 인해 제조업체 이름 및 모델 번호와 결합하더라도 다른 제조업체의 장치에서는 제대로 작동하지 않습니다. . 장치 일련 번호의 대안은 마더 보드, CPU 또는 하드 디스크의 일련 번호 일 수 있습니다 (Windows 라이센스는 이들 조합을 사용한다고 생각합니다).

파일 시스템 포맷터는 일반적으로 각 파일 시스템에 대해 고유 한 ID를 생성한다는 점도 기억해야합니다. 동일한 이미지에서 모든 장치를 준비하지 않는 한 (관련이없는 이유로 권장하는 경우) 각 하드 디스크에는 사용할 수있는 파일 시스템에 저장된 고유 ID가 이미 있습니다.

그럼에도 불구하고 실제로 MAC 주소를 사용 하지 않는 이유는 없습니다 . 특히 프로비저닝 프로세스의 일부로 실제로 고유 한 것으로 결정할 수있는 경우 (우리가 더 이상 이야기하지 않는다고 가정하더라도 필요하지는 않지만) 여기에 수천 개의 장치가 있습니다). 물론 사용하는 모든 것이 장치에 의해 스푸핑 될 수 있으므로 신뢰할 수없는 환경에서 인증을 위해 이것에 의존하지 마십시오 (비공개 설정이라고 가정 할 수 있음). 클라이언트가 자신의 서버를 상대로 자신의 장치를 스푸핑하는 것에주의를 기울이지 만, 장치 관리가 제 3 자 또는 최종 사용자에게 양도되는 경우 분명히 명심해야합니다.