Linux에서 TPM을 사용하여 규모에 맞게 IoT Edge 디바이스 만들기 및 프로비전
적용 대상: IoT Edge 1.1
Important
IoT Edge 1.1 지원 종료일은 2022년 12월 13일이었습니다. 이 제품, 서비스, 기술 또는 API가 지원되는 방법에 대한 정보는 Microsoft 제품 수명 주기를 확인하세요. 최신 버전의 IoT Edge로 업데이트하는 방법에 대한 자세한 내용은 업데이트 IoT Edge를 참조하세요.
이 문서에서는 TPM(신뢰할 수 있는 플랫폼 모듈)을 사용하여 Linux 디바이스용 Azure IoT Edge를 자동 프로비전하기 위한 지침을 제공합니다. Azure IoT Hub 디바이스 프로비저닝 서비스를 사용하여 IoT Edge 디바이스를 자동으로 프로비전할 수 있습니다. 자동 프로비전 프로세스에 익숙하지 않은 경우 계속하기 전에 프로비전 개요를 검토합니다.
이 문서에서는 두 가지 방법론을 간략하게 설명합니다. 솔루션의 아키텍처에 따라 기본 설정을 선택합니다.
- 실제 TPM 하드웨어로 Linux 디바이스를 자동 프로비전합니다. 예를 들면 Infineon OPTIGA™ TPM SLB 9670이 있습니다.
- Hyper-V가 사용하도록 설정된 Windows 개발 컴퓨터에서 실행되는 시뮬레이션된 TPM으로 Linux VM(가상 머신)을 자동 프로비전합니다. 이 방법론은 테스트 시나리오로만 사용하는 것이 좋습니다. 시뮬레이션된 TPM은 실제 TPM과 동일한 보안을 제공하지 않습니다.
지침은 방법론에 따라 다르므로 올바른 탭에 있는지 확인하여 계속 진행하세요.
작업은 다음과 같습니다.
- TPM에 대한 프로비전 정보를 검색합니다.
- IoT Hub 디바이스 프로비전 서비스의 인스턴스에서 디바이스에 대한 개별 등록을 만듭니다.
- IoT Edge 런타임을 설치하고 디바이스를 IoT 허브에 연결합니다.
필수 조건
클라우드 리소스
- 활성 IoT 허브
- IoT 허브에 연결된 Azure의 IoT Hub Device Provisioning Service 인스턴스
- 디바이스 프로비저닝 서비스 인스턴스가 없는 경우 IoT Hub Device Provisioning Service 빠른 시작의 새 IoT Hub Device Provisioning Service 만들기 및 IoT 허브와 디바이스 프로비저닝 서비스 연결 섹션의 지침을 따를 수 있습니다.
- 디바이스 프로비저닝 서비스를 실행한 후 개요 페이지에서 ID 범위 값을 복사합니다. IoT Edge 런타임을 구성하는 경우 이 값을 사용합니다.
디바이스 요구 사항
IoT Edge 디바이스가 될 실제 Linux 디바이스입니다.
디바이스 제조업체인 경우 제조 공정에 TPM 통합에 대한 지침을 참조하세요.
참고 항목
디바이스 프로비전 서비스에서 TPM 증명을 사용하는 경우 TPM 2.0이 필요합니다.
TPM을 사용하는 경우 그룹이 아닌 개별 디바이스 프로비저닝 서비스 등록만 만들 수 있습니다.
장치 설정
TPM에 대한 프로비전 정보 검색
이 섹션에서는 TPM의 등록 ID 및 인증 키를 검색하는 데 사용할 수 있는 도구를 빌드합니다.
디바이스에 로그인한 다음 Linux 개발 환경 설정의 단계에 따라 C용 Azure IoT 디바이스 SDK를 설치하고 빌드합니다.
다음 명령을 실행하여 TPM에서 디바이스 프로비전 정보를 검색하는 SDK 도구를 빌드합니다.
cd azure-iot-sdk-c/cmake cmake -Duse_prov_client:BOOL=ON .. cd provisioning_client/tools/tpm_device_provision make sudo ./tpm_device_provision
출력 창에 디바이스의 등록 ID 와 인증 키가 표시됩니다. 이러한 값을 복사하여 나중에 디바이스 프로비저닝 서비스에서 디바이스에 대한 개별 등록을 만들 때 사용합니다.
등록 ID와 인증 키가 있으면 계속할 준비가 된 것입니다.
팁
TPM2 소프트웨어 도구를 사용하여 정보를 검색하지 않으려면 프로비전 정보를 가져올 수 있는 다른 방법을 찾아야 합니다. 각 TPM 칩에 고유한 인증 키는 연결된 TPM 칩 제조업체에서 가져옵니다. TPM 디바이스에 대한 고유한 등록 ID를 파생시킬 수 있습니다. 예를 들어, 위에 표시된 것처럼 인증 키의 SHA-256 해시를 만들 수 있습니다.
디바이스 프로비전 서비스 등록 만들기
TPM의 프로비전 정보를 사용하여 디바이스 프로비전 서비스에서 개별 등록을 만듭니다.
디바이스 프로비전 서비스에서 등록을 만들 때 초기 디바이스 트윈 상태를 선언할 수 있습니다. 디바이스 트윈에서 지역, 환경, 위치 또는 디바이스 유형 같은 솔루션에 필요한 모든 메트릭을 기준으로 디바이스 그룹에 태그를 설정할 수 있습니다. 이러한 태그는 자동 배포를 만드는 데 사용됩니다.
팁
이 문서의 단계는 Azure Portal용이지만 Azure CLI를 사용하여 개별 등록을 만들 수도 있습니다. 자세한 내용은 az iot dps enrollment를 참조하세요. CLI 명령의 일부로 에지 사용 플래그를 사용하여 IoT Edge 장치에 대한 등록을 지정합니다.
Azure Portal에서 IoT Hub 디바이스 프로비전 서비스의 인스턴스로 이동합니다.
설정에서 등록 관리를 선택합니다.
개별 등록 추가를 선택하고, 다음 단계를 완료하여 등록을 구성합니다.
메커니즘의 경우 TPM을 선택합니다.
VM 또는 실제 디바이스에서 복사한 인증 키 및 등록 ID를 제공합니다.
원하는 경우 디바이스의 ID를 제공합니다. 디바이스 ID를 제공하지 않으면 등록 ID가 사용됩니다.
VM 또는 실제 디바이스가 IoT Edge 디바이스임을 선언하려면 True를 선택합니다.
디바이스를 연결하려는 연결된 IoT 허브를 선택하거나 새 IoT Hub에 연결을 선택합니다. 여러 허브를 선택할 수 있으며, 선택한 할당 정책에 따라 허브 중 하나에 디바이스가 할당됩니다.
원하는 경우 초기 디바이스 트윈 상태에 태그 값을 추가합니다. 태그를 사용하여 모듈 배포에 대한 디바이스 그룹을 대상으로 할 수 있습니다. 자세한 내용은 대규모로 IoT Edge 모듈 배포를 참조하세요.
저장을 선택합니다.
이제 이 디바이스에 대한 등록이 존재하므로 IoT Edge 런타임은 설치 중에 디바이스를 자동으로 프로비저닝할 수 있습니다.
IoT Edge 설치
이 섹션에서는 IoT Edge용 Linux VM 또는 실제 디바이스를 준비합니다. 그런 다음, IoT Edge를 설치합니다.
다음 명령을 실행하여 패키지 리포지토리를 추가한 다음, 신뢰할 수 있는 키 목록에 Microsoft 패키지 서명 키를 추가합니다.
Important
2022년 6월 30일에 계층 1 OS 지원 목록에서 Raspberry Pi OS Stretch를 사용 중지되었습니다. 잠재적인 보안 취약성을 방지하려면 호스트 OS를 Bullseye로 업데이트합니다.
설치는 몇 가지 명령으로 수행할 수 있습니다. 터미널을 열고 다음 명령을 실행합니다.
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
18.04:
wget https://packages.microsoft.com/config/ubuntu/18.04/multiarch/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb
참고 항목
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
로깅 드라이버를 로깅 메커니즘으로 사용하도록 구성합니다. 로깅 구성에 대한 자세한 내용은 프로덕션 배포 검사 목록을 참조하세요.
/etc/docker/daemon.json
에서 Docker 디먼의 구성 파일을 만들거나 엽니다.아래 예제와 같이 기본 로깅 드라이버를
local
로깅 드라이버로 설정합니다.{ "log-driver": "local" }
변경 내용을 적용하려면 컨테이너 엔진을 다시 시작합니다.
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 Necessary
및Network Drivers
아래의 모든 항목을 사용할 수 있는지 확인합니다. 기능이 누락됐다면 소스에서 커널을 다시 빌드하고 적절한 커널 .config 내에 포함하기 위한 관련 모듈을 선택하여 활성화합니다. 마찬가지로defconfig
또는menuconfig
같은 커널 구성 생성기를 사용하는 경우 각각의 기능을 찾아 활성화하고 그에 따라 커널을 다시 빌드합니다. 새로 수정된 커널을 배포한 후에는 check-config 스크립트를 다시 실행하여 필요한 모든 기능이 성공적으로 활성화되었는지 확인합니다.
IoT Edge 런타임 설치
IoT Edge 보안 디먼은 IoT Edge 디바이스에서 보안 표준을 제공하고 유지 관리합니다. 디먼은 부팅할 때마다 시작되며, 나머지 IoT Edge 런타임을 시작하여 디바이스를 부트스트랩합니다.
이 섹션의 단계는 인터넷에 연결된 디바이스에 최신 버전을 설치하는 일반적인 프로세스를 나타냅니다. 시험판 버전과 같은 특정 버전을 설치해야 하거나 오프라인 상태에서 설치해야 하는 경우 이 문서 뒷부분의 오프라인 또는 특정 버전 설치 단계를 따르세요.
libiothsm-std 패키지와 함께 IoT Edge 버번 1.1.*을 설치합니다.
sudo apt-get update; \
sudo apt-get install iotedge
참고 항목
IoT Edge 버전 1.1은 IoT Edge의 장기 지원 분기입니다. 이전 버전을 실행하는 경우 이전 버전이 더 이상 지원되지 않으므로 최신 패치를 설치하거나 업데이트하는 것이 좋습니다.
클라우드 ID를 사용한 디바이스 프로비전
런타임이 디바이스에 설치되면 디바이스 프로비저닝 서비스 및 IoT Hub에 연결하는 데 사용하는 정보를 사용하여 디바이스를 구성합니다.
이전에 수집한 디바이스 프로비전 서비스 ID 범위 및 디바이스 등록 ID를 파악합니다.
IoT Edge 디바이스에서 구성 파일을 엽니다.
sudo nano /etc/iotedge/config.yaml
파일의 프로비저닝 구성 섹션을 찾습니다. TPM 프로비저닝에 대한 줄의 주석 처리를 제거하고, 다른 모든 프로비저닝 줄이 주석 처리되었는지 확인합니다.
줄에는
provisioning:
앞의 공백이 없어야 하며 중첩된 항목은 두 개의 공백으로 들여쓰기해야 합니다.# DPS TPM provisioning configuration provisioning: source: "dps" global_endpoint: "https://global.azure-devices-provisioning.net" scope_id: "SCOPE_ID_HERE" attestation: method: "tpm" registration_id: "REGISTRATION_ID_HERE" # always_reprovision_on_startup: true # dynamic_reprovisioning: false
디바이스 프로비전 서비스 및 디바이스 정보로
scope_id
및registration_id
값을 업데이트합니다.scope_id
값은 디바이스 프로비전 서비스 인스턴스의 개요 페이지에 있는 ID 범위입니다.필요에 따라 또는
dynamic_reprovisioning
줄을 사용하여always_reprovision_on_startup
디바이스의 다시 프로비전 동작을 구성합니다. 디바이스가 시작 시 다시 프로비전되도록 설정된 경우 항상 먼저 DPS를 사용하여 프로비저닝을 시도한 다음, 실패하면 프로비저닝 백업으로 대체됩니다. 디바이스가 자체적으로 동적으로 다시 프로비전하도록 설정된 경우 디바이스가 한 IoT Hub에서 다른 IoT Hub로 이동하는 경우와 같이 다시 프로비저닝 이벤트가 검색되면 IoT Edge(및 모든 모듈)가 다시 시작되고 다시 프로비전됩니다. 특히 IoT Edge는 SDK에서bad_credential
또는device_disabled
오류를 확인하여 다시 프로비전 이벤트를 검색합니다. 이 이벤트를 수동으로 트리거하려면 IoT Hub에서 디바이스를 사용하지 않도록 설정합니다. 자세한 내용은 IoT Hub 디바이스 다시 프로비저닝 개념을 참조하세요.파일을 저장 후 닫습니다.
TPM에 대한 IoT Edge 액세스 권한 부여
IoT Edge 런타임은 디바이스를 자동으로 프로비전하기 위해 TPM에 액세스해야 합니다.
서비스에 루트 권한이 있도록 시스템 설정을 재정의하여 TPM에 IoT Edge 런타임에 대한 액세스 권한을 부여할 iotedge
수 있습니다. 서비스 권한을 승격시키지 않으려는 경우 다음 단계를 사용하여 수동으로 TPM 액세스 권한을 제공할 수도 있습니다.
tpm0
및tpmrm0
에 IoT Edge 런타임 액세스 권한을 부여할 새 규칙을 만듭니다.sudo touch /etc/udev/rules.d/tpmaccess.rules
규칙 파일을 엽니다.
sudo nano /etc/udev/rules.d/tpmaccess.rules
규칙 파일에 다음과 같은 액세스 정보를 복사합니다. 4.12 이전 커널을 사용하는 디바이스에는
tpmrm0
이 없을 수 있습니다.tpmrm0
이 없는 디바이스는 해당 규칙을 안전하게 무시합니다.# allow iotedge access to tpm0 KERNEL=="tpm0", SUBSYSTEM=="tpm", OWNER="iotedge", MODE="0600" KERNEL=="tpmrm0", SUBSYSTEM=="tpmrm", OWNER="iotedge", MODE="0600"
파일을 저장하고 종료합니다.
udev
시스템을 트리거하여 새 규칙을 평가합니다./bin/udevadm trigger --subsystem-match=tpm --subsystem-match=tpmrm
규칙이 성공적으로 적용됐는지 확인합니다.
ls -l /dev/tpm*
성공한 출력은 다음과 같이 표시됩니다.
crw------- 1 iotedge root 10, 224 Jul 20 16:27 /dev/tpm0 crw------- 1 iotedge root 10, 224 Jul 20 16:27 /dev/tpmrm0
올바른 사용 권한이 적용됐는지 확인할 수 없는 경우 머신을 재부팅하여
udev
를 새로 고칩니다.디바이스에서 수행한 모든 구성 변경 내용을 선택할 수 있도록 IoT Edge 런타임을 다시 시작합니다.
sudo systemctl restart iotedge
성공적인 설치 확인
아직 IoT Edge 런타임을 다시 시작 하지 않은 경우 다시 시작하여 디바이스에서 변경한 모든 구성을 선택하도록 합니다.
sudo systemctl restart iotedge
IoT Edge 런타임이 실행되고 있는지 확인합니다.
sudo systemctl status iotedge
디먼 로그를 검사합니다.
journalctl -u iotedge --no-pager --no-full
프로비전 오류가 표시되면 구성 변경 내용이 아직 적용되지 않았을 수 있습니다. IoT Edge 디먼을 다시 시작해 보세요.
sudo systemctl daemon-reload
또는 VM을 다시 시작하여 새로 시작할 때 변경 내용이 적용되는지 확인합니다.
런타임이 성공적으로 시작한 경우 IoT Hub로 이동하여 새 디바이스를 자동으로 프로비전했는지 확인할 수 있습니다. 이제 디바이스가 IoT Edge 모듈을 실행할 준비가 되었습니다.
실행 중인 모듈을 나열합니다.
iotedge list
Device Provisioning Service에서 만든 개별 등록이 사용되었는지 확인할 수 있습니다. Azure Portal에서 디바이스 프로비전 서비스 인스턴스로 이동합니다. 만든 개별 등록의 등록 세부 정보를 엽니다. 등록 상태가 할당됨이고 디바이스 ID가 나열된 것을 확인할 수 있습니다.
다음 단계
디바이스 프로비전 서비스 등록 프로세스를 사용하면 새 디바이스를 프로비전할 때 디바이스 ID 및 디바이스 트윈 태그를 동시에 설정할 수 있습니다. 이러한 값을 사용하여 자동 장치 관리를 통해 개별 디바이스 또는 디바이스 그룹을 대상으로 지정할 수 있습니다.
Azure Portal 또는 Azure CLI를 사용하여 대규모로 IoT Edge 모듈을 배포하고 모니터링하는 방법을 알아봅니다.