Linux에서 X.509 인증서를 사용하여 대규모로 IoT Edge 디바이스 만들기 및 프로비전

적용 대상:IoT Edge 1.4 checkmark IoT Edge 1.4

Important

IoT Edge 1.4는 지원되는 릴리스입니다. 이전 릴리스에 있는 경우 IoT Edge 업데이트를 참조하세요.

이 문서에서는 X.509 인증서를 사용하여 하나 이상의 Linux IoT Edge 디바이스를 자동 프로비저닝하기 위한 엔드투엔드 지침을 제공합니다. Azure IoT Hub DPS(Device Provisioning Service)를 사용하여 Azure IoT Edge 디바이스를 자동으로 프로비전할 수 있습니다. 자동 프로비전 프로세스에 익숙하지 않은 경우 계속하기 전에 프로비전 개요를 검토하세요.

작업은 다음과 같습니다.

  1. 인증서 및 키를 생성합니다.
  2. 단일 디바이스에 대한 개별 등록 또는 디바이스 세트에 대한 그룹 등록을 만듭니다.
  3. IoT Edge 런타임을 설치하고 IoT Hub를 사용하여 디바이스를 등록합니다.

X.509 인증서를 증명 메커니즘으로 사용하면 프로덕션의 크기를 조정하고 디바이스 프로비전을 간소화할 수 있습니다. 일반적으로 X.509 인증서는 신뢰할 수 있는 인증서 체인에 정렬됩니다. 자체 서명되었거나 신뢰할 수 있는 루트 인증서부터 시작하여, 체인에 존재하는 각 인증서는 그다음으로 낮은 인증서에 서명합니다. 이 패턴을 통해 루트 인증서부터 시작하여 각 중간 인증서를 거쳐 디바이스에 설치된 마지막 다운스트림 디바이스 인증서에서 완료되는 위임된 신뢰 체인이 만들어집니다.

디바이스에 TPM 2.0과 같은 HSM(하드웨어 보안 모듈)이 있는 경우 HSM에 X.509 키를 안전하게 저장하는 것이 좋습니다. iotedge-tpm2cloud 샘플을 사용하여 이 청사진에 설명된 대규모로 제로 터치 프로비저닝을 구현하는 방법에 대해 자세히 알아봅니다.

필수 조건

클라우드 리소스

  • 활성 IoT 허브
  • IoT 허브에 연결된 Azure의 IoT Hub Device Provisioning Service 인스턴스

디바이스 요구 사항

IoT Edge 디바이스가 될 실제 또는 가상 Linux 디바이스입니다.

디바이스 ID 인증서 생성

디바이스 ID 인증서는 인증서 신뢰 체인을 통해 상위 X.509 인증 기관(CA) 인증서에 연결하는 다운스트림 디바이스 인증서입니다. 디바이스 ID 인증서에는 디바이스를 IoT 허브에 포함하려는 디바이스 ID로 설정된 일반 이름(CN)이 있어야 합니다.

디바이스 ID 인증서는 IoT Edge 디바이스를 프로비저닝하고 Azure IoT Hub 디바이스를 인증하는 데만 사용됩니다. 해당 인증서는 IoT Edge 디바이스가 모듈이나 다운스트림 디바이스에 확인을 위해 제공하는 CA 인증서와 달리 서명 인증서가 아닙니다. 자세한 내용은 Azure IoT Edge 인증서 사용 현황 세부 정보를 참조하세요.

디바이스 ID 인증서를 만든 후에는 2개의 파일이 있어야 합니다. 이는 인증서의 퍼블릭 부분을 포함하는 .cer 또는 .pem 파일 및 인증서의 프라이빗 키를 포함하는 .cer 또는 .pem 파일입니다. DPS에서 그룹 등록을 사용하려면 동일한 인증서 신뢰 체인에 중간 또는 루트 CA 인증서의 퍼블릭 부분도 있어야 합니다.

X.509를 사용하여 자동 프로비저닝을 설정하려면 다음 파일이 필요합니다.

  • 디바이스 ID 인증서 및 해당 인증서의 프라이빗 키 인증서. 개별 등록을 만들면 디바이스 ID 인증서가 DPS에 업로드됩니다. 프라이빗 키가 IoT Edge 런타임에 전달됩니다.
  • 최소한 디바이스 ID와 중간 인증서를 포함해야 하는 전체 체인 인증서. 전체 체인 인증서는 IoT Edge 런타임에 전달됩니다.
  • 인증서 신뢰 체인의 중간 또는 루트 CA 인증서. 이 인증서는 그룹 등록을 만들면 DPS에 업로드됩니다.

테스트 인증서 사용(선택 사항)

새 ID 인증서를 만드는 데 사용할 수 있는 인증 기관이 없지만 이 시나리오를 사용해 보려는 경우, Azure IoT Edge Git 리포지토리에 테스트 인증서 생성에 사용할 수 있는 스크립트가 포함되어 있습니다. 해당 인증서는 개발 테스트 전용으로 설계되었으며 프로덕션 단계에서 사용해서는 안 됩니다.

테스트 인증서를 만들려면 데모 인증서를 만들어 IoT Edge 디바이스 기능 테스트의 단계를 따릅니다. 인증서 생성 스크립트를 설정하고 루트 CA 인증서를 만들기 위한 두 개의 필수 섹션을 완료합니다. 그런 다음 단계를 따라 디바이스 ID 인증서를 만듭니다. 단계를 모두 완료하면 다음 인증서 체인 및 키 쌍이 있어야 합니다.

  • <WRKDIR>/certs/iot-edge-device-identity-<name>-full-chain.cert.pem
  • <WRKDIR>/private/iot-edge-device-identity-<name>.key.pem

IoT Edge 디바이스에는 해당 인증서가 모두 필요합니다. DPS에서 개별 등록을 사용하려면 .cert.pem 파일을 업로드합니다. DPS에서 그룹 등록을 사용하려면 업로드하려는 동일한 인증서 신뢰 체인에 중간 또는 루트 CA 인증서도 있어야 합니다. 데모 인증서를 사용한다면 그룹 등록에 <WRKDIR>/certs/azure-iot-test-only.root.ca.cert.pem 인증서를 사용합니다.

DPS 등록 만들기

하나 이상의 IoT Edge 디바이스에 대해 DPS에서 등록을 만들려면 생성된 인증서와 키를 사용합니다.

단일 IoT Edge 디바이스를 프로비전하려는 경우 개별 등록을 만듭니다. 여러 디바이스를 프로비전해야 하는 경우 DPS 그룹 등록 만들기 단계를 따릅니다.

DPS에서 등록을 만들 때 초기 디바이스 쌍 상태를 선언할 기회가 있습니다. 디바이스 쌍에서 지역, 환경, 위치 또는 디바이스 유형 같은 솔루션에 필요한 모든 메트릭으로 디바이스 그룹에 태그를 설정할 수 있습니다. 이러한 태그는 자동 배포를 만드는 데 사용됩니다.

디바이스 프로비저닝 서비스의 등록에 대한 자세한 내용은 디바이스 등록을 관리하는 방법을 참조하세요.

DPS 개별 등록 만들기

개별 등록은 디바이스의 ID 인증서의 퍼블릭 부분을 가져와 디바이스의 인증서와 일치시킵니다.

이 문서의 단계는 Azure Portal에 대한 것이지만 Azure CLI를 사용하여 개별 등록을 만들도록 할 수도 있습니다. 자세한 내용은 az iot dps enrollment를 참조하세요. CLI 명령의 일부로 에지 사용 플래그를 사용하여 IoT Edge 장치에 대한 등록을 지정합니다.

  1. Azure Portal에서 IoT Hub Device Provisioning Service 인스턴스로 이동합니다.

  2. 설정에서 등록 관리를 선택합니다.

  3. 등록을 구성하려면 개별 등록 추가를 선택한 다음, 다음 단계를 완료합니다.

    • 메커니즘: X.509를 선택합니다.

    • 기본 인증서 .pem 또는 .cer 파일: 디바이스 ID 인증서에서 퍼블릭 파일을 업로드합니다. 스크립트를 사용하여 테스트 인증서를 생성한 경우 다음 파일을 선택합니다.

      <WRKDIR>\certs\iot-edge-device-identity-<name>.cert.pem

    • IoT Hub 디바이스 ID: 원하는 경우 디바이스에 대한 ID를 제공합니다. 디바이스 ID를 사용하여 모듈 배포에 대한 개별 디바이스를 대상으로 할 수 있습니다. 디바이스 ID를 제공하지 않으면 X.509 인증서의 일반 이름(CN)이 사용됩니다.

    • IoT Edge 디바이스: 등록이 IoT Edge 디바이스에 대한 것이라고 선언하려면 True를 선택합니다.

    • 이 디바이스를 할당할 수 있는 IoT 허브 선택: 디바이스를 연결하려는 연결된 IoT 허브를 선택합니다. 여러 허브를 선택할 수 있으며, 선택한 할당 정책에 따라 허브 중 하나에 디바이스가 할당됩니다.

    • 초기 디바이스 쌍 상태: 원하는 경우 디바이스 쌍에 태그 값을 추가합니다. 태그를 사용하여 자동 배포에 대한 디바이스 그룹을 대상으로 할 수 있습니다. 예시:

      {
          "tags": {
             "environment": "test"
          },
          "properties": {
             "desired": {}
          }
      }
      
  4. 저장을 선택합니다.

등록 관리에서 방금 만든 등록에 대한 등록 ID를 볼 수 있습니다. 디바이스를 프로비전할 때 사용할 수 있으므로 기록해 두세요.

이제 이 디바이스에 대한 등록이 존재하므로 IoT Edge 런타임은 설치 중에 디바이스를 자동으로 프로비저닝할 수 있습니다.

IoT Edge 설치

이 섹션에서는 IoT Edge용 Linux 가상 머신 또는 실제 디바이스를 준비합니다. 그런 다음, IoT Edge를 설치합니다.

다음 명령을 실행하여 패키지 리포지토리를 추가한 다음, 신뢰할 수 있는 키 목록에 Microsoft 패키지 서명 키를 추가합니다.

Important

2022년 6월 30일에 계층 1 OS 지원 목록에서 Raspberry Pi OS Stretch를 사용 중지되었습니다. 잠재적인 보안 취약성을 방지하려면 호스트 OS를 Bullseye로 업데이트합니다.

설치는 몇 가지 명령으로 수행할 수 있습니다. 터미널을 열고 다음 명령을 실행합니다.

  • 22.04:

    wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
    sudo dpkg -i packages-microsoft-prod.deb
    rm packages-microsoft-prod.deb
    
  • 20.04:

    wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
    sudo dpkg -i packages-microsoft-prod.deb
    rm packages-microsoft-prod.deb
    

운영 체제 버전에 대한 자세한 내용은 Azure IoT Edge 지원 플랫폼을 참조하세요.

참고 항목

Azure IoT Edge 소프트웨어 패키지에는 각 패키지(usr/share/doc/{package-name} 또는 LICENSE 디렉터리)에 있는 사용 조건이 적용됩니다. 패키지를 사용하기 전에 사용 조건을 읽어보세요. 패키지를 설치하고 사용하면 이러한 사용 조건에 동의하는 것입니다. 사용 조건에 동의하지 않으면 해당 패키지를 사용하지 마세요.

컨테이너 엔진 설치

Azure IoT Edge는 OCI 호환 컨테이너 런타임을 사용합니다. 프로덕션 시나리오의 경우 Moby 엔진을 사용하는 것이 좋습니다. Moby 엔진은 IoT Edge에서 공식적으로 지원되는 유일한 컨테이너 엔진입니다. Docker CE/EE 컨테이너 이미지는 Moby 런타임과 호환 가능합니다.

Moby 엔진을 설치합니다.

sudo apt-get update; \
  sudo apt-get install moby-engine

기본적으로 Moby 컨테이너 엔진은 컨테이너 로그 크기 제한을 설정하지 않습니다. 시간이 지남에 따라 디바이스가 로그로 가득 차고 디스크 공간이 부족해질 수 있습니다. 그러나 선택 사항이지만 로컬로 표시되도록 로그를 구성할 수 있습니다. 로깅 구성에 대한 자세한 내용은 프로덕션 배포 검사 목록을 참조하세요.

다음 단계에서는 local 로깅 드라이버를 로깅 메커니즘으로 사용하도록 컨테이너를 구성하는 방법을 보여 줍니다.

  1. 파일을 아직 만들지 않은 경우, 만들거나 /etc/docker/daemon.json에서 Docker 디먼의 구성 파일을 엽니다.

  2. 아래 예제와 같이 기본 로깅 드라이버를 local 로깅 드라이버로 설정합니다.

       {
          "log-driver": "local"
       }
    
  3. 변경 내용을 적용하려면 컨테이너 엔진을 다시 시작합니다.

    sudo systemctl restart docker
    

    Moby 컨테이너 엔진을 설치할 때 오류가 발생하면 Linux 커널의 Moby 호환성을 확인합니다. 일부 포함된 디바이스의 제조업체는 컨테이너 엔진 호환성에 필요한 기능이 없는 사용자 지정 Linux 커널을 포함하는 디바이스 이미지를 제공합니다. Moby에서 제공한 check-config 스크립트를 사용하는 다음 명령을 실행하여 커널 구성을 확인합니다.

    curl -ssl https://raw.githubusercontent.com/moby/moby/master/contrib/check-config.sh -o check-config.sh
    chmod +x check-config.sh
    ./check-config.sh
    

    스크립트의 출력에서 Generally NecessaryNetwork Drivers 아래의 모든 항목을 사용할 수 있는지 확인합니다. 기능이 누락됐다면 소스에서 커널을 다시 빌드하고 적절한 커널 .config 내에 포함하기 위한 관련 모듈을 선택하여 활성화합니다. 마찬가지로 defconfig 또는 menuconfig 같은 커널 구성 생성기를 사용하는 경우 각각의 기능을 찾아 활성화하고 그에 따라 커널을 다시 빌드합니다. 새로 수정된 커널을 배포한 후에는 check-config 스크립트를 다시 실행하여 필요한 모든 기능이 성공적으로 활성화되었는지 확인합니다.

IoT Edge 런타임 설치

IoT Edge 서비스는 IoT Edge 디바이스에서 보안 표준을 제공하고 유지 관리합니다. 서비스는 부팅할 때마다 시작되며, 나머지 IoT Edge 런타임을 시작하여 디바이스를 부트스트랩합니다.

참고 항목

버전 1.2부터 IoT ID 서비스는 IoT Edge 및 IoT Hub와 통신해야 하는 기타 디바이스 구성 요소에 대한 ID 프로비전 및 관리를 처리합니다.

이 섹션의 단계에서는 인터넷이 연결된 디바이스에 최신 IoT Edge 버전을 설치하는 일반적인 프로세스를 보여 줍니다. 시험판 버전과 같은 특정 버전을 설치해야 하거나 오프라인 상태에서 설치해야 하는 경우 이 문서 뒷부분의 오프라인 또는 특정 버전 설치 단계를 따르세요.

이전 버전을 실행하는 IoT Edge 디바이스가 이미 있고 최신 릴리스로 업그레이드하려는 경우 IoT Edge 보안 디먼 및 런타임 업데이트의 단계를 사용합니다. 최신 버전은 업그레이드에 특정 단계가 필요한 이전 버전의 IoT Edge와 충분히 다릅니다.

최신 버전의 IoT Edge 및 IoT ID 서비스 패키지를 설치합니다(아직 최신 버전이 아닌 경우).

  • 22.04:

    sudo apt-get update; \
       sudo apt-get install aziot-edge
    
  • 20.04:

    sudo apt-get update; \
       sudo apt-get install aziot-edge defender-iot-micro-agent-edge
    

선택 사항인 defender-iot-micro-agent-edge에는 Microsoft Defender for IoT 보안 마이크로 에이전트가 포함되어 있어 엔드포인트에서 IoT Edge 디바이스를 보호하는 데 도움이 되는 보안 태세 관리, 취약성, 위협 탐지, 집합 관리 등을 파악할 수 있습니다. Edge 디바이스의 보안 모니터링 및 강화를 사용하도록 설정하려면 Edge 에이전트와 함께 마이크로 에이전트를 설치하는 것이 좋습니다. Microsoft Defender for IoT에 대한 자세한 내용은 디바이스 빌더를 위한 Microsoft Defender for IoT란?을 참조하세요.

클라우드 ID를 사용한 디바이스 프로비전

런타임이 디바이스에 설치되면 디바이스를 Device Provisioning Service 및 IoT Hub에 연결하는 데 사용되는 정보로 구성합니다.

다음 정보를 준비합니다.

  • DPS ID 범위 값. Azure Portal에 있는 DPS 인스턴스의 개요 페이지에서 이 값을 검색할 수 있습니다.
  • 디바이스에 있는 디바이스 ID 인증서 체인 파일.
  • 디바이스에 있는 디바이스 ID 키 파일.
  1. IoT Edge 설치의 일부로 제공되는 템플릿 파일을 기반으로 디바이스에 대한 구성 파일을 만듭니다.

    sudo cp /etc/aziot/config.toml.edge.template /etc/aziot/config.toml
    
  2. IoT Edge 디바이스에서 구성 파일을 엽니다.

    sudo nano /etc/aziot/config.toml
    
  3. 파일의 프로비전 섹션을 찾습니다. X.509 인증서를 사용하는 DPS 프로비저닝에 대한 줄의 주석 처리를 제거하고 다른 프로비저닝 줄이 주석으로 처리되어 있는지 확인합니다.

    # DPS provisioning with X.509 certificate
    [provisioning]
    source = "dps"
    global_endpoint = "https://global.azure-devices-provisioning.net"
    id_scope = "SCOPE_ID_HERE"
    
    # Uncomment to send a custom payload during DPS registration
    # payload = { uri = "PATH_TO_JSON_FILE" }
    
    [provisioning.attestation]
    method = "x509"
    registration_id = "REGISTRATION_ID_HERE"
    
    identity_cert = "DEVICE_IDENTITY_CERTIFICATE_HERE"
    
    identity_pk = "DEVICE_IDENTITY_PRIVATE_KEY_HERE"
    
    # auto_reprovisioning_mode = Dynamic
    
  4. id_scope 값을 DPS 인스턴스에서 복사한 범위 ID로 업데이트합니다.

  5. 디바이스가 IoT Hub에서 갖게 될 ID인 디바이스에 대한 registration_id를 제공합니다. 등록 ID는 ID 인증서의 CN(일반 이름)과 일치해야 합니다.

  6. 인증서와 키 정보로 identity_certidentity_pk 값을 업데이트합니다.

    ID 인증서 값을 파일 URI로 제공하거나 EST 또는 로컬 인증 기관을 사용하여 동적으로 발급할 수 있습니다. 사용하도록 선택한 형식에 따라 한 줄의 주석 처리만을 제거합니다.

    ID 프라이빗 키 값은 파일 URI 또는 PKCS#11 URI로 제공될 수 있습니다. 사용하도록 선택한 형식에 따라 한 줄의 주석 처리만을 제거합니다.

    PKCS#11 URI를 사용하는 경우 구성 파일에서 PKCS#11 섹션을 찾고 PKCS#11 구성에 대한 정보를 제공합니다.

  7. 필요에 따라 파일의 자동 다시 프로비전 모드 섹션을 찾습니다. auto_reprovisioning_mode 매개 변수를 사용하여 디바이스의 다시 프로비저닝 동작을 구성합니다. Dynamic - 디바이스가 한 IoT Hub에서 다른 IoT Hub로 이동되었을 수 있음을 검색할 때 다시 프로비전합니다. 기본값입니다. AlwaysOnStartup - 디바이스가 다시 부팅되거나 크래시로 인해 디먼이 다시 시작되면 다시 프로비전됩니다. OnErrorOnly - 디바이스 다시 프로비저닝을 자동으로 트리거하지 않습니다. 연결 오류로 인해 ID를 프로비전하는 동안 디바이스가 IoT Hub에 연결할 수 없는 경우 각 모드에는 암시적 디바이스 다시 프로비전 대체가 있습니다. 자세한 내용은 IoT Hub 디바이스 다시 프로비저닝 개념을 참조하세요.

  8. 선택적으로 payload 매개 변수의 주석 처리를 제거하여 로컬 JSON 파일에 대한 경로를 지정합니다. 파일의 콘텐츠는 디바이스가 등록될 때 추가 데이터로 DPS에 전송됩니다. 이는 사용자 지정 할당에 유용합니다. 예를 들어, 사용자 개입 없이 IoT 플러그 앤 플레이 모델 ID를 기반으로 디바이스를 할당하려는 경우입니다.

  9. 파일을 저장 후 닫습니다.

  10. IoT Edge에 대한 구성 변경 내용을 적용합니다.

    sudo iotedge config apply
    

성공적인 설치 확인

런타임이 성공적으로 시작한 경우 IoT Hub로 이동하고 디바이스에 IoT Edge 모듈 배포를 시작할 수 있습니다.

Device Provisioning Service에서 만든 개별 등록이 사용되었는지 확인할 수 있습니다. Azure Portal에서 Device Provisioning Service 인스턴스로 이동합니다. 만든 개별 등록의 등록 세부 정보를 엽니다. 등록 상태가 할당됨이고 디바이스 ID가 나열된 것을 확인할 수 있습니다.

디바이스에서 다음 명령을 사용하여 IoT Edge가 성공적으로 설치되고 시작되는지 확인합니다.

IoT Edge 서비스의 상태를 확인합니다.

sudo iotedge system status

서비스 로그를 검사합니다.

sudo iotedge system logs

실행 중인 모듈을 나열합니다.

sudo iotedge list

다음 단계

디바이스 프로비전 서비스 등록 프로세스를 사용하면 새 디바이스를 프로비전할 때 디바이스 ID 및 디바이스 트윈 태그를 동시에 설정할 수 있습니다. 자동 디바이스 관리를 사용하여 개별 디바이스 또는 디바이스 그룹을 대상으로 하려면 이러한 값을 사용할 수 있습니다. Azure CLI를 사용하거나 Azure Portal을 사용하여 대규모로 IoT Edge 모듈을 배포하고 모니터링하는 방법을 알아봅니다.