適用対象: IoT Edge 1.5
重要
IoT Edge 1.5 LTS は、サポートされているリリースです。 IoT Edge 1.4 LTS は、2024 年 11 月 12 日をもってサポートが終了しています。 以前のリリースの場合は、「IoT Edge を更新する」を参照してください。
この記事では、X.509 証明書を使用して 1 つ以上の Linux IoT Edge デバイスを自動プロビジョニングする手順について説明します。 Azure IoT Hub デバイス プロビジョニング サービス (DPS) を使用して Azure IoT Edge デバイスを 自動的にプロビジョニングします。 自動プロビジョニングに慣れていない場合は、続行する前にプロビジョニングの 概要を 確認してください。
X.509 証明書を使用して IoT Edge デバイスをプロビジョニングする手順を次に示します。
- 証明書とキーを生成する。
- 1 つのデバイスに対して 個別 登録を作成するか、一連のデバイスの グループ登録 を作成します。
- IoT Edge ランタイムをインストールし、デバイスを IoT Hub に登録する。
X.509 証明書を使用すると、運用環境をスケーリングし、デバイスのプロビジョニングを簡素化できます。 通常、X.509 証明書は信頼する証明書チェーンに配置されます。 チェーンは自己署名または信頼されたルート証明書で始まり、チェーン内の各証明書は次の下位証明書に署名します。 このパターンでは、ルート証明書から各中間証明書を介して、デバイスにインストールされた最終的なダウンストリーム デバイス証明書への信頼の委任されたチェーンが作成されます。
ヒント
デバイスに TPM 2.0 のようなハードウェア セキュリティ モジュール (HSM) がある場合は、X.509 キーを HSM に安全に格納します。 iotedge-tpm2cloud サンプルを使用して、このブループリントでゼロタッチ プロビジョニングを大規模に実装する方法について説明します。
前提条件
クラウド リソース
- アクティブな IoT ハブ
- 自分の IoT ハブにリンクされた、Azure 内の IoT Hub デバイス プロビジョニング サービスのインスタンス
- デバイス プロビジョニング サービスのインスタンスをお持ちでない場合は、IoT Hub デバイス プロビジョニング サービス クイックスタートの「新しい IoT Hub デバイス プロビジョニング サービスの作成」および「IoT ハブとデバイス プロビジョニング サービスとをリンクさせる」の手順に従ってください。
- Device Provisioning Service を実行した後、概要ページから [ID スコープ] の値をコピーします。 この値は、IoT Edge ランタイムを構成するときに使用します。
デバイスの要件
物理または仮想 Linux デバイスを IoT Edge デバイスとして使用します。
デバイス ID 証明書を生成する
デバイス ID 証明書は、証明書の信頼チェーンを介して最上位の X.509 証明機関 (CA) 証明書につながるダウンストリーム デバイス証明書です。 デバイス ID 証明書の共通名 (CN) は、IoT ハブ内のデバイスに付けるデバイス ID に設定されている必要があります。
デバイス ID 証明書は、IoT Edge デバイスのプロビジョニングと、Azure IoT Hub でのデバイス認証を行うためにのみ使用されます。 これらの証明書は署名用の証明書ではありません。 IoT Edge デバイスがモジュールまたはダウンストリーム デバイスに提示する CA 証明書は、検証に使用されます。 詳細については、Azure IoT Edge 証明書の使用方法に関する詳細のページを参照してください。
デバイス ID 証明書を作成すると、証明書の公開部分を含む .cer
または .pem
ファイルと、秘密キーを持つ .cer
または .pem
ファイルの 2 つのファイルが作成されます。 DPS でグループ登録を使用する場合は、信頼の同じ証明書チェーン内の中間またはルート CA 証明書のパブリック部分も必要です。
X.509 を使用して自動プロビジョニングを設定するには、次のファイルが必要です。
- デバイス ID 証明書とその秘密キー証明書。 個別登録を作成すると、デバイス ID 証明書が DPS にアップロードされます。 秘密キーは IoT Edge ランタイムに渡されます。
- 少なくともデバイス ID と中間証明書を含む完全なチェーン証明書。 完全なチェーン証明書は IoT Edge ランタイムに渡されます。
- 信頼する証明書チェーンからの中間証明書またはルート CA 証明書。 グループ登録を作成すると、この証明書は DPS にアップロードされます。
テスト証明書を使用する (省略可能)
新しい ID 証明書を作成する証明機関がなく、このシナリオを試す場合は、Azure IoT Edge Git リポジトリのスクリプトを使用してテスト証明書を生成します。 これらの証明書は、開発テストにのみ使用してください。 運用環境では使用しないでください。
テスト証明書を作成するには、「IoT Edge デバイスの機能をテストするためのデモ用の証明書を作成する」の手順に従います。 証明書生成スクリプトを設定し、ルート CA 証明書を作成するために必要な 2 つのセクションを完了します。 次に、手順に従ってデバイス 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 の登録を作成する
生成された証明書とキーを使用して、DPS で 1 つまたは複数の IoT Edge デバイスの登録を作成します。
単一の IoT Edge デバイスをプロビジョニングする方法を求めている場合は、個別の登録を作成します。 複数のデバイスをプロビジョニングする必要がある場合は、DPS グループ登録を作成する手順に従います。
DPS 内に登録を作成するときに、デバイス ツインの初期状態を宣言する機会があります。 デバイス ツインでは、ソリューションで必要な任意のメトリック (リージョン、環境、場所、デバイスの種類など) によってデバイスをグループ化するためのタグを設定できます。 これらのタグは、自動展開を作成するために使用されます。
デバイス プロビジョニング サービスでの登録の詳細については、デバイス登録の管理方法に関するページをご覧ください。
DPS 個別登録を作成する
個別登録では、デバイスの ID 証明書の公開部分が渡され、デバイス上の証明書と照合されます。
ヒント
この記事の手順は Azure portal 向けですが、Azure CLI を使用して個別登録を作成することもできます。 詳細については、az iot dps enrollment を参照してください。 この CLI コマンドの一部として、edge-enabled フラグを使用して、登録の対象が IoT Edge デバイスであることを指定します。
Azure portal で、IoT Hub Device Provisioning Service のインスタンスに移動します。
[設定] の下の [登録の管理] を選択します。
[Add individual enrollment]\(個別登録の追加\) を選択し、登録を構成する次の手順を完了します。
メカニズム: [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 デバイス]: [True] を選択して、その登録が IoT Edge デバイス用のものであることを宣言します。
[このデバイスを割り当てることができる IoT ハブを選択する]: デバイスの接続先になるリンクされた IoT ハブを選択します。 複数のハブを選択でき、デバイスは、選択した割り当てポリシーに従ってそれらのハブの 1 つに割り当てられます。
[デバイス ツインの初期状態]: 必要に応じて、デバイス ツインに追加するタグ値を追加します。 タグを使用して、デバイス グループを自動展開のターゲットにすることができます。 次に例を示します。
{ "tags": { "environment": "test" }, "properties": { "desired": {} } }
[保存] を選択します。
[登録を管理します] で、作成した登録の登録 ID を確認できます。 デバイスをプロビジョニングするときに使用できるので、メモします。
これで、このデバイスの登録が存在しているので、IoT Edge ランタイムによってインストール時にデバイスを自動的にプロビジョニングできます。
IoT Edge をインストールする
このセクションでは、Linux 仮想マシンまたは IoT Edge の物理デバイスを準備します。 次に、IoT Edge をインストールします。
次のコマンドを実行してパッケージ リポジトリを追加し、信頼できるキーの一覧に Microsoft パッケージ署名キーを追加します。
重要
2022 年 6 月 30 日、Raspberry Pi OS Stretch は階層 1 OS サポート リストから廃止されました。 潜在的なセキュリティの脆弱性を回避するには、ホスト 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
既定では、コンテナー エンジンによってコンテナー ログ サイズの制限は設定されません。 時間の経過と共に、この状況により、デバイスがログでいっぱいになり、ディスク領域が不足する可能性があります。 ただし、ローカルに表示するようにログを構成することはできますが、省略しても構いません。 ログ記録の構成の詳細については、「 運用環境で IoT Edge ソリューションをデプロイする準備」を参照してください。
次の手順では、ログ メカニズムとして 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 以降、 Azure 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 への接続に使用する情報を使用してデバイスを設定します。
次の情報があることを確認します。
- DPS の ID スコープ値。 この値は、Azure portal の DPS インスタンスの概要ページから取得します。
- デバイス上のデバイス ID 証明書チェーン ファイル。
- デバイス上のデバイス ID キー ファイル。
IoT Edge のインストールに含まれているテンプレート ファイルに基づいて、デバイスの構成ファイルを作成します。
sudo cp /etc/aziot/config.toml.edge.template /etc/aziot/config.toml
IoT Edge デバイスで構成ファイルを開きます。
sudo nano /etc/aziot/config.toml
ファイルのプロビジョニング セクションを見つけます。 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" # For example, "file:///var/aziot/device-id.pem"
identity_pk = "DEVICE_IDENTITY_PRIVATE_KEY_HERE" # For example, "file:///var/aziot/device-id.key"
# auto_reprovisioning_mode = Dynamic
DPS インスタンスからコピーしたスコープ ID で
id_scope
の値を更新します。デバイスの
registration_id
を入力します。これは、デバイスが IoT Hub に持っている ID です。 登録 ID は、ID 証明書の共通名 (CN) と一致している必要があります。identity_cert
とidentity_pk
の値をご自分の証明書およびキー情報で更新します。ID 証明書の値をファイル URI として指定することも、EST またはローカル証明機関を使用して動的に発行することもできます。 使用する形式に基づいて、コメントを解除できるのは 1 行だけです。
ID 秘密キーの値は、ファイル URI または PKCS#11 URI として指定できます。 使用する形式に基づいて、コメントを解除できるのは 1 行だけです。
PKCS#11 URI を使用する場合は、構成ファイルで PKCS#11 セクションを見つけて、PKCS#11 構成情報を入力します。
証明書の詳細については、「IoT Edge 証明書を管理する」を参照してください。
プロビジョニング構成設定の詳細については、「IoT Edge デバイスの設定を構成する」を参照してください。
必要に応じて、ファイルの自動再プロビジョニング モード セクションを見つけます。
auto_reprovisioning_mode
パラメーターを使用して、デバイスの再プロビジョニング動作を構成します。 動的 - ある IoT Hub から別の IoT Hub に移動された可能性があることをデバイスが検出したときに再プロビジョニングします。 これが既定です。 AlwaysOnStartup - デバイスが再起動されたとき、またはクラッシュによってデーモンが再起動されたときに再プロビジョニングします。 OnErrorOnly - デバイスの再プロビジョニングを自動的にトリガーしません。 接続エラーが原因で ID プロビジョニング中にデバイスが IoT Hub に接続できない場合、各モードには暗黙的なデバイス再プロビジョニング フォールバックがあります。 詳細については、「IoT Hub デバイスの再プロビジョニングの概念」を参照してください。必要に応じて、
payload
パラメーターのコメントを解除して、ローカル JSON ファイルへのパスを指定します。 デバイスが登録されると、ファイルの内容が 追加データとして DPS に送信されます 。 これは、カスタム割り当てに役立ちます。 たとえば、人間の介入なしに IoT プラグ アンド プレイモデル ID に基づいてデバイスを割り当てる場合などです。ファイルを保存して閉じます。
IoT Edge に加えた構成変更を適用します。
sudo iotedge config apply
インストールの成功を確認する
ランタイムが正常に起動した場合は、IoT Hub に移動し、デバイスへの IoT Edge モジュールのデプロイを開始します。
デバイス プロビジョニング サービスで作成した個々の登録が使用されていることを確認します。 Azure portal で Device Provisioning Service インスタンスに移動します。 作成した個別登録の詳細を開きます。 登録の状態が 割り当てられ、デバイス ID が一覧表示されます。
デバイスで次のコマンドを実行して、IoT Edge がインストールされ、実行されていることを確認します。
IoT Edge サービスの状態を確認します。
sudo iotedge system status
サービス ログを表示します。
sudo iotedge system logs
実行中のモジュールを一覧表示します。
sudo iotedge list
次のステップ
デバイス プロビジョニング サービスの登録プロセスでは、新しいデバイスをプロビジョニングするときにデバイス ID とデバイス ツイン タグを設定できます。 これらの値を使用して、デバイスの自動管理を使用して個々のデバイスまたはデバイス のグループをターゲットにします。 Azure portal または Azure CLI を使用して、大規模な IoT Edge モジュールをデプロイおよび監視する方法について説明します。