Linux에서 TPM을 사용하여 규모에 맞게 IoT Edge 디바이스 만들기 및 프로비전
적용 대상: IoT Edge 1.5 IoT Edge 1.4
Important
IoT Edge 1.5 LTS 및 IoT Edge 1.4 LTS는 지원되는 릴리스입니다. IoT Edge 1.4 LTS는 2024년 11월 12일에 수명이 종료됩니다. 이전 릴리스에 있는 경우 IoT Edge 업데이트를 참조하세요.
이 문서에서는 TPM(신뢰할 수 있는 플랫폼 모듈)을 사용하여 Linux 디바이스용 Azure IoT Edge를 자동 프로비전하기 위한 지침을 제공합니다. Azure IoT Hub 디바이스 프로비저닝 서비스를 사용하여 IoT Edge 디바이스를 자동으로 프로비전할 수 있습니다. 자동 프로비전 프로세스에 익숙하지 않은 경우 계속하기 전에 프로비전 개요를 검토합니다.
이 문서에서는 두 가지 방법론을 간략하게 설명합니다. 솔루션의 아키텍처에 따라 기본 설정을 선택합니다.
- 실제 TPM 하드웨어로 Linux 디바이스를 자동 프로비전합니다.
- 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에 대한 프로비전 정보 검색
참고 항목
이 문서는 이전에 IoT C SDK의 tpm_device_provision
도구를 사용하여 프로비전 정보를 생성했습니다. 이전에 해당 도구를 사용했다면 아래 단계에서 동일한 공용 인증 키에 대해 다른 등록 ID를 생성한다는 점에 유의합니다. 이전과 같이 등록 ID를 다시 만들어야 하는 경우 C SDK의 tpm_device_provision 도구가 ID를 만드는 방법을 참조하세요. DPS의 개별 등록에 대한 등록 ID가 IoT Edge 디바이스가 사용하도록 구성된 등록 ID와 일치하는지 확인합니다.
이 섹션에서는 TPM2 소프트웨어 도구를 사용하여 TPM에 대한 인증 키를 검색한 다음 고유한 등록 ID를 생성합니다. 이 섹션은 TPM을 제조 공정에 통합하는 과정에서 3단계: 디바이스에 펌웨어 및 소프트웨어가 설치되어 있음에 해당합니다.
TPM2 도구 설치
디바이스에 로그인하고 tpm2-tools
패키지를 설치합니다.
sudo apt-get install tpm2-tools
다음 스크립트를 실행하여 인증 키를 읽고 아직 존재하지 않는 경우 만듭니다.
#!/bin/sh
if [ "$USER" != "root" ]; then
SUDO="sudo "
fi
$SUDO tpm2_readpublic -Q -c 0x81010001 -o ek.pub 2> /dev/null
if [ $? -gt 0 ]; then
# Create the endorsement key (EK)
$SUDO tpm2_createek -c 0x81010001 -G rsa -u ek.pub
# Create the storage root key (SRK)
$SUDO tpm2_createprimary -Q -C o -c srk.ctx > /dev/null
# make the SRK persistent
$SUDO tpm2_evictcontrol -c srk.ctx 0x81000001 > /dev/null
# open transient handle space for the TPM
$SUDO tpm2_flushcontext -t > /dev/null
fi
printf "Gathering the registration information...\n\nRegistration Id:\n%s\n\nEndorsement Key:\n%s\n" $(sha256sum -b ek.pub | cut -d' ' -f1 | sed -e 's/[^[:alnum:]]//g') $(base64 -w0 ek.pub)
$SUDO rm ek.pub srk.ctx 2> /dev/null
출력 창에는 디바이스의 인증 키와 고유한 등록 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 가상 머신 또는 실제 디바이스를 준비합니다. 그런 다음, IoT Edge를 설치합니다.
다음 명령을 실행하여 패키지 리포지토리를 추가한 다음, 신뢰할 수 있는 키 목록에 Microsoft 패키지 서명 키를 추가합니다.
Important
2022년 6월 30일에 계층 1 OS 지원 목록에서 Raspberry Pi OS Stretch를 사용 중지되었습니다. 잠재적인 보안 취약성을 방지하려면 호스트 OS를 Bullseye로 업데이트합니다.
2계층 지원 플랫폼 운영 체제의 경우 설치 패키지는 Azure IoT Edge 릴리스에서 제공됩니다. 오프라인 또는 특정 버전 설치의 설치 단계를 참조하세요.
설치는 몇 가지 명령으로 수행할 수 있습니다. 터미널을 열고 다음 명령을 실행합니다.
24.04:
wget https://packages.microsoft.com/config/ubuntu/24.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb
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 런타임과 호환 가능합니다. Ubuntu Core 스냅을 사용하는 경우 Docker 스냅은 Canonical에서 서비스되고 프로덕션 시나리오에서 지원됩니다.
Moby 엔진을 설치합니다.
sudo apt-get update; \
sudo apt-get install moby-engine
기본적으로 컨테이너 엔진은 컨테이너 로그 크기 제한을 설정하지 않습니다. 시간이 지남에 따라 디바이스가 로그로 가득 차고 디스크 공간이 부족해질 수 있습니다. 그러나 선택 사항이지만 로컬로 표시되도록 로그를 구성할 수 있습니다. 로깅 구성에 대한 자세한 내용은 프로덕션 배포 검사 목록을 참조하세요.
다음 단계에서는 local
로깅 드라이버를 로깅 메커니즘으로 사용하도록 컨테이너를 구성하는 방법을 보여 줍니다.
기존 Docker 디먼의 구성 파일 만들기 또는 편집
sudo nano /etc/docker/daemon.json
예제와 같이 기본 로깅 드라이버를
local
로깅 드라이버로 설정합니다.{ "log-driver": "local" }
변경 내용을 적용하려면 컨테이너 엔진을 다시 시작합니다.
sudo systemctl restart docker
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
클라우드 ID를 사용한 디바이스 프로비전
런타임이 디바이스에 설치되면 디바이스 프로비저닝 서비스 및 IoT Hub에 연결하는 데 사용하는 정보를 사용하여 디바이스를 구성합니다.
이전에 수집한 디바이스 프로비전 서비스 ID 범위 및 디바이스 등록 ID를 파악합니다.
IoT Edge 설치의 일부로 제공되는 템플릿 파일을 기반으로 디바이스에 대한 구성 파일을 만듭니다.
sudo cp /etc/aziot/config.toml.edge.template /etc/aziot/config.toml
IoT Edge 디바이스에서 구성 파일을 엽니다.
sudo nano /etc/aziot/config.toml
파일의 프로비저닝 구성 섹션을 찾습니다. TPM 프로비저닝에 대한 줄의 주석 처리를 제거하고, 다른 모든 프로비저닝 줄이 주석 처리되었는지 확인합니다.
# DPS provisioning with TPM [provisioning] source = "dps" global_endpoint = "https://global.azure-devices-provisioning.net" id_scope = "DPS_ID_SCOPE_HERE" # Uncomment to send a custom payload during DPS registration # payload = { uri = "PATH_TO_JSON_FILE" } [provisioning.attestation] method = "tpm" registration_id = "REGISTRATION_ID_HERE" # auto_reprovisioning_mode = Dynamic
디바이스 프로비전 서비스 및 디바이스 정보로
id_scope
및registration_id
값을 업데이트합니다.scope_id
값은 디바이스 프로비전 서비스 인스턴스의 개요 페이지에 있는 ID 범위입니다.구성 설정 프로비저닝에 대한 자세한 내용은 IoT Edge 디바이스 설정 구성을 참조하세요.
필요에 따라 파일의 자동 다시 프로비전 모드 섹션을 찾습니다.
auto_reprovisioning_mode
매개 변수를 사용하여 디바이스의 다시 프로비저닝 동작을 구성합니다. Dynamic - 디바이스가 한 IoT Hub에서 다른 IoT Hub로 이동되었을 수 있음을 검색할 때 다시 프로비전합니다. 기본값입니다. AlwaysOnStartup - 디바이스가 다시 부팅되거나 크래시로 인해 디먼이 다시 시작되면 다시 프로비전됩니다. OnErrorOnly - 디바이스 다시 프로비저닝을 자동으로 트리거하지 않습니다. 연결 오류로 인해 ID를 프로비전하는 동안 디바이스가 IoT Hub에 연결할 수 없는 경우 각 모드에는 암시적 디바이스 다시 프로비전 대체가 있습니다. 자세한 내용은 IoT Hub 디바이스 다시 프로비저닝 개념을 참조하세요.선택적으로
payload
매개 변수의 주석 처리를 제거하여 로컬 JSON 파일에 대한 경로를 지정합니다. 파일의 콘텐츠는 디바이스가 등록될 때 추가 데이터로 DPS에 전송됩니다. 이는 사용자 지정 할당에 유용합니다. 예를 들어, 사용자 개입 없이 IoT 플러그 앤 플레이 모델 ID를 기반으로 디바이스를 할당하려는 경우입니다.파일을 저장 후 닫습니다.
TPM에 대한 IoT Edge 액세스 권한 부여
IoT Edge 런타임은 디바이스의 TPM에 대한 액세스 권한을 조정하는 TPM 서비스를 사용합니다. 이 서비스에서 디바이스를 자동으로 프로비저닝하려면 TPM에 액세스해야 합니다.
aziottpm
서비스에 루트 권한이 있도록 systemd 설정을 재정의하여 TPM 액세스 권한을 부여할 수 있습니다. 서비스 권한을 승격시키지 않으려는 경우 다음 단계를 사용하여 수동으로 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 aziottpm access to tpm0 and tpmrm0 KERNEL=="tpm0", SUBSYSTEM=="tpm", OWNER="aziottpm", MODE="0660" KERNEL=="tpmrm0", SUBSYSTEM=="tpmrm", OWNER="aziottpm", MODE="0660"
파일을 저장하고 종료합니다.
udev
시스템을 트리거하여 새 규칙을 평가합니다./bin/udevadm trigger --subsystem-match=tpm --subsystem-match=tpmrm
규칙이 성공적으로 적용됐는지 확인합니다.
ls -l /dev/tpm*
성공한 출력은 다음과 같이 표시됩니다.
crw-rw---- 1 root aziottpm 10, 224 Jul 20 16:27 /dev/tpm0 crw-rw---- 1 root aziottpm 10, 224 Jul 20 16:27 /dev/tpmrm0
올바른 사용 권한이 적용됐는지 확인할 수 없는 경우 머신을 재부팅하여
udev
를 새로 고칩니다.디바이스에서 변경된 구성을 적용합니다.
sudo iotedge config apply
성공적인 설치 확인
아직 적용하지 않은 경우 디바이스에서 수행한 구성 변경 내용을 적용합니다.
sudo iotedge config apply
IoT Edge 런타임이 실행되고 있는지 확인합니다.
sudo iotedge system status
디먼 로그를 검사합니다.
sudo iotedge system logs
프로비전 오류가 표시되면 구성 변경 내용이 아직 적용되지 않았을 수 있습니다. 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 모듈을 배포하고 모니터링하는 방법을 알아봅니다.