適用対象: IoT Edge 1.1
重要
IoT Edge 1.1 サポート終了日は 2022 年 12 月 13 日でした。 本製品、サービス、テクノロジ、または API のサポート内容については、Microsoft 製品のライフサイクルに関するページをご確認ください。 最新バージョンの IoT Edge への更新の詳細については、「IoT Edgeの更新」を参照してください。
この記事では、X.509 証明書を使用して 1 つまたは複数の Linux IoT Edge デバイスを自動プロビジョニングするエンド ツー エンドの手順について説明します。 Azure IoT Edge デバイスは、Azure IoT Hub Device Provisioning Service (DPS) を使用して自動プロビジョニングできます。 自動プロビジョニングの処理に慣れていない場合は、プロビジョニングの概要を確認してから先に進んでください。
タスクは次のとおりです。
- 証明書とキーを生成する。
- 単一のデバイスの個別登録を作成するか、一連のデバイスに対してグループ登録を作成する。
- IoT Edge ランタイムをインストールし、デバイスを IoT Hub に登録する。
X.509 証明書を構成証明メカニズムとして使用することは、実稼働環境を拡張し、デバイスのプロビジョニングを簡素化するための優れた方法です。 通常、X.509 証明書は信頼する証明書チェーンに配置されます。 自己署名証明書または信頼されたルート証明書から開始して、チェーン内の各証明書によって、それよりも 1 つ下位にある証明書が署名されます。 このパターンにより、ルート証明書から各中間証明書を経由して、デバイスにインストールされた最終的なダウンストリーム デバイス証明書に至る、委任された信頼チェーンが作成されます。
ヒント
デバイスに 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 ランタイムを構成するときに使用します。
デバイスの要件
IoT Edge デバイスとなる物理デバイスまたは仮想 Linux デバイス。
デバイス ID 証明書を生成する
デバイス ID 証明書は、証明書の信頼チェーンを介して最上位の X.509 証明機関 (CA) 証明書につながるダウンストリーム デバイス証明書です。 デバイス ID 証明書の共通名 (CN) は、IoT ハブ内のデバイスに付けるデバイス ID に設定されている必要があります。
デバイス 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 にアップロードされます。
注
現時点では、libiothsm の制限により、2038 年 1 月 1 日以降に有効期限が切れる証明書は使用できません。
テスト証明書を使用する (省略可能)
新しい 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 をインストールする
このセクションでは、IoT Edge 用に Linux VM または物理デバイスを準備します。 次に、IoT Edge をインストールします。
次のコマンドを実行してパッケージ リポジトリを追加し、信頼できるキーの一覧に Microsoft パッケージ署名キーを追加します。
重要
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 に接続するための情報を使用してデバイスを構成します。
次の情報を用意しておきます。
- DPS の ID スコープ値。 Azure portal で、使用している DPS インスタンスの概要ページから、この値を取得できます。
- デバイス上のデバイス ID 証明書チェーン ファイル。
- デバイス上のデバイス ID キー ファイル。
IoT Edge デバイスで構成ファイルを開きます。
sudo nano /etc/iotedge/config.yaml
ファイルのプロビジョニング構成セクションを見つけます。 DPS X.509 証明書プロビジョニングの行からコメントを外し、他のプロビジョニング行がコメントアウトされていることを確認します。
provisioning:
行の前に空白文字を含めず、入れ子になった項目は 2 つのスペースでインデントする必要があります。# DPS X.509 provisioning configuration provisioning: source: "dps" global_endpoint: "https://global.azure-devices-provisioning.net" scope_id: "SCOPE_ID_HERE" attestation: method: "x509" # registration_id: "OPTIONAL_REGISTRATION_ID_LEAVE_COMMENTED_OUT_TO_REGISTER_WITH_CN_OF_IDENTITY_CERT" identity_cert: "REQUIRED_URI_TO_DEVICE_IDENTITY_CERTIFICATE_HERE" identity_pk: "REQUIRED_URI_TO_DEVICE_IDENTITY_PRIVATE_KEY_HERE" # always_reprovision_on_startup: true # dynamic_reprovisioning: false
scope_id
、identity_cert
、identity_pk
の値を DPS およびデバイス情報で更新します。x.509 証明書とキー情報を config.yaml ファイルに追加するときは、パスをファイル URI として指定する必要があります。 例えば次が挙げられます。
file:///<path>/identity_certificate_chain.pem
file:///<path>/identity_key.pem
必要に応じて、ID 証明書の共通名 (CN) と一致する必要があるデバイスの
registration_id
を指定します。 その行をコメント アウトしたままにすると、CN が自動的に適用されます。必要に応じて、
always_reprovision_on_startup
またはdynamic_reprovisioning
行を使用して、デバイスの再プロビジョニング動作を構成します。 デバイスが起動時に再プロビジョニングするように設定されている場合、デバイスは常に最初に DPS を使用してプロビジョニングを試行し、失敗した場合はプロビジョニング バックアップにフォールバックします。 デバイスが自身を動的に再プロビジョニングするように設定されている場合、デバイスが 1 つの IoT Hub から別の IoT Hub に移動された場合など、再プロビジョニング イベントが検出されると、IoT Edge (およびすべてのモジュール) が再起動して再プロビジョニングされます。 具体的には、IoT Edge は SDK からのbad_credential
またはdevice_disabled
エラーをチェックして、再プロビジョニング イベントを検出します。 このイベントを手動でトリガーするには、IoT Hub でデバイスを無効にします。 詳細については、「IoT Hub デバイスの再プロビジョニングの概念」を参照してください。config.yaml ファイルを保存して閉じます。
IoT Edge ランタイムを再起動して、デバイスで行ったすべての構成変更を適用します。
sudo systemctl restart iotedge
インストールの成功を確認する
ランタイムが正常に起動されたら、IoT Hub にアクセスし、デバイスに IoT Edge モジュールを展開できます。
デバイス プロビジョニング サービスで作成した個々の登録が使用されたことを確認できます。 Azure portal でデバイス プロビジョニング サービス インスタンスに移動します。 作成した個々の登録の詳細を開きます。 登録ステータスが割り当て済みであり、デバイス ID がリストされています。
IoT Edge が正常にインストールされ、起動されたことを確認するには、デバイスで次のコマンドを使用します。
IoT Edge サービスの状態を確認します。
systemctl status iotedge
サービス ログを調べます。
journalctl -u iotedge --no-pager --no-full
実行中のモジュールを一覧表示します。
iotedge list
次のステップ
デバイス プロビジョニング サービスの登録プロセスでは、新しいデバイスをプロビジョニングするときに、デバイス ID とデバイス ツイン タグを同時に設定できます。 これらの値を使用して、個々のデバイスやデバイス グループを、自動デバイス管理によりターゲットできます。 使用方法については、「Azure Portal を使用した大規模な IoT Edge モジュールの展開と監視」または「Azure CLI を使用した大規模な IoT Edge モジュールの展開と監視」を参照してください。