次の方法で共有


Linux で TPM を使用して大規模な IoT Edge デバイスを作成およびプロビジョニングする

適用対象: [はい] アイコン IoT Edge 1.1

重要

IoT Edge 1.1 のサポート終了日は、2022 年 12 月 13 日でした。 本製品、サービス、テクノロジ、または API のサポート内容については、Microsoft 製品のライフサイクルに関するページをご確認ください。 最新バージョンの IoT Edge への更新の詳細については、「 Update IoT Edge」を参照してください。

この記事では、トラステッド プラットフォーム モジュール (TPM) を使用して Azure IoT Edge for Linux デバイスを自動プロビジョニングする手順について説明します。 IoT Edge デバイスは、Azure IoT Hub Device Provisioning Service を使用して自動プロビジョニングできます。 自動プロビジョニングの処理に慣れていない場合は、「プロビジョニングの概要」を読んでから先に進んでください。

この記事では、次の 2 つの手法の概要を説明します。 ソリューションのアーキテクチャに基づいて、使用する手法を選択してください。

  • 物理 TPM ハードウェアを使用して Linux デバイスを自動プロビジョニングします。 例は、Infineon OPTIGA™ TPM SLB 9670 などです。
  • Hyper-V が有効な Windows 開発用コンピューターで実行されているシミュレートされた TPM を使用して、Linux 仮想マシン (VM) を自動プロビジョニングします。 この手法は、テスト シナリオとしてのみ使用することをお勧めします。 シミュレートされた TPM では、物理 TPM と同じセキュリティは提供されません。

手順は使用する手法によって異なるので、先に進む前に正しいタブが表示されていることをご確認ください。

タスクは次のとおりです。

  1. TPM のプロビジョニング情報を取得します。
  2. IoT Hub Device Provisioning Service のインスタンスでデバイスに対する個別の登録を作成します。
  3. IoT Edge ランタイムをインストールして、デバイスを IoT ハブに接続します。

前提条件

クラウド リソース

デバイスの要件

IoT Edge デバイスとなる物理 Linux デバイス。

デバイスの製造元の場合は、「製造プロセスへの TPM の統合」のガイダンスを参照してください。

Note

Device Provisioning Service で TPM 構成証明を使用する場合は、TPM 2.0 が必要です。

TPM を使用する場合、グループではなく個別の Device Provisioning Service の登録のみ作成できます。

デバイスの設定

TPM で物理 Linux デバイスを使用している場合は、デバイスをセットアップするための追加の手順はありません。

作業を続ける準備ができました。

TPM のプロビジョニング情報を取得する

このセクションでは、TPM の登録 ID と保証キーを取得するために使用できるツールをビルドします。

  1. お使いのデバイスにサインインし、Linux 開発環境の設定に関するセクションの手順に従って、Azure IoT device SDK for C をインストールしてビルドします。

  2. 次のコマンドを実行して、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
    
  3. 出力ウィンドウに、デバイスの登録 ID保障キーが表示されます。 後ほど Device Provisioning Service でデバイスの個別登録を作成するときに使用できるように、これらの値をコピーします。

登録 ID と保証キーを取得したら、次に進むことができます。

ヒント

TPM2 ソフトウェア ツールを使用してプロビジョニング情報を取得しない場合は、情報を取得するための別の方法を見つける必要があります。 TPM チップごとに固有の保証キーを、それに関連付けられている TPM チップの製造元から取得します。 TPM デバイス用の一意の登録 ID を生成できます。 たとえば、前述のように、保証キーの SHA-256 ハッシュを作成できます。

Device Provisioning Service 登録の作成

TPM のプロビジョニング情報を使用して、Device Provisioning Service で個別登録を作成します。

Device Provisioning Service 内に登録を作成するときに、デバイス ツインの初期状態を宣言する機会があります。 デバイス ツインでは、ソリューションで使用される任意のメトリック (リージョン、環境、場所、デバイスの種類など) によってデバイスをグループ化するためのタグを設定できます。 これらのタグは、自動展開を作成するために使用されます。

ヒント

この記事の手順は Azure portal 向けですが、Azure CLI を使用して個別登録を作成することもできます。 詳細については、az iot dps enrollment を参照してください。 この CLI コマンドの一部として、edge-enabled フラグを使用して、登録の対象が IoT Edge デバイスであることを指定します。

  1. Azure portal で、IoT Hub Device Provisioning Service のインスタンスに移動します。

  2. [設定] の下の [登録の管理] を選択します。

  3. [個別登録の追加] を選択し、登録を構成する次の手順を完了します。

    1. [メカニズム][TPM] を選択します。

    2. VM または物理デバイスからコピーした保証キー登録 ID を指定します。

    3. 必要に応じて、デバイス ID を指定します。 デバイス ID を指定しなかった場合は、登録 ID が使用されます。

    4. [True] を選択し、VM または物理デバイスが IoT Edge デバイスであることを宣言します。

    5. デバイスの接続先になるリンクされた IoT ハブを選択するか、[Link to new IoT Hub]\(新しい IoT ハブへのリンク\) を選択します。 複数のハブを選択でき、デバイスは、選択した割り当てポリシーに従ってそれらのハブの 1 つに割り当てられます。

    6. 必要に応じて、[デバイス ツインの初期状態] にタグ値を追加します。 タグを使用して、デバイス グループをモジュール展開のターゲットにすることができます。 詳細については、大規模な IoT Edge モジュールの展開に関する記事を参照してください。

    7. [保存] を選択します。

これで、このデバイスの登録が存在しているので、IoT Edge ランタイムによってインストール時にデバイスを自動的にプロビジョニングできます。

IoT Edge をインストールする

このセクションでは、Linux VM または IoT Edge の物理デバイスを準備します。 次に、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
    

Note

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 NecessaryNetwork Drivers の下のすべての項目が有効になっていることを確認します。 機能が欠けている場合は、カーネルをソースから再構築し、カーネルの適切な .config に含める関連モジュールを選択することで、それらを有効にします。同様に、defconfigmenuconfig などのカーネル構成ジェネレーターを使用している場合は、それぞれの機能を見つけて有効にし、ご自分のカーネルを適宜再構築します。 新たに変更されたカーネルを展開したら、check-config スクリプトをもう一度実行して、必要なすべての機能が正常に有効になっていることを確認します。

IoT Edge ランタイムをインストールする

IoT Edge セキュリティ デーモンによって、IoT Edge デバイス上にセキュリティ標準が提供されて維持されます。 デーモンは起動のたびに開始され、IoT Edge ランタイムの残りの部分を開始することでデバイスをブートストラップします。

このセクションの手順では、インターネットに接続されているデバイスに最新バージョンをインストールする一般的なプロセスが示されています。 プレリリース バージョンなどの特定のバージョンをインストールする必要がある場合、またはオフラインの間にインストールする必要がある場合は、この記事で後述する「オフラインまたは特定のバージョンのインストール」の手順に従ってください。

IoT Edge バージョン 1.1* と libiothsm-std パッケージをインストールします。

sudo apt-get update; \
  sudo apt-get install iotedge

Note

IoT Edge バージョン 1.1 は、IoT Edge の長期サポート ブランチです。 古いバージョンを実行している場合は、サポートされなくなるため、最新のパッチのインストールまたは更新をお勧めします。

クラウド ID を使用してデバイスをプロビジョニングする

ランタイムがデバイスにインストールされたら、Device Provisioning Service と IoT Hub に接続するために使用される情報でデバイスを構成します。

  1. 前に集めた Device Provisioning Service の ID スコープとデバイスの登録 ID を把握しておきます。

  2. IoT Edge デバイスで構成ファイルを開きます。

    sudo nano /etc/iotedge/config.yaml
    
  3. ファイルのプロビジョニング構成セクションを見つけます。 TPM プロビジョニング行のコメントを解除し、他にもプロビジョニング行があれば、それらのコメントが解除されていることを確認します。

    provisioning: の行の先頭には空白文字を入れず、入れ子の項目には 2 つの空白でインデントする必要があります。

    # 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
    
  4. scope_idregistration_id の値を、Device Provisioning Service とデバイス情報で更新します。 scope_id の値は、Device Provisioning Service のインスタンスの概要ページにある ID スコープです。

  5. 必要に応じて、always_reprovision_on_startup または dynamic_reprovisioning の行を使用して、デバイスの再プロビジョニング動作を構成します。 起動時に再プロビジョニングするようにデバイスが設定されている場合、常に最初に DPS を使用してプロビジョニングが試行され、失敗した場合はプロビジョニングのバックアップにフォールバックします。 デバイスが動的に自分自身を再プロビジョニングするように設定されている場合、再プロビジョニング イベントが検出されると (デバイスが IoT Hub 間で移動された場合など)、IoT Edge (およびすべてのモジュール) が再起動して再プロビジョニングされます。 具体的には、IoT Edge は、再プロビジョニング イベントを検出するため、SDK からの bad_credential または device_disabled エラーをチェックします。 このイベントを手動でトリガーするには、IoT Hub でデバイスを無効にします。 詳細については、「IoT Hub デバイスの再プロビジョニングの概念」を参照してください。

  6. ファイルを保存して閉じます。

IoT Edge に TPM へのアクセス権を付与する

デバイスを自動的にプロビジョニングするには、IoT Edge ランタイムが TPM にアクセスする必要があります。

IoT Edge ランタイムに TPM へのアクセス権を付与するには、systemd 設定をオーバーライドして、iotedge サービスに root 特権を付与します。 サービス権限を昇格したくない場合は、次の手順を使用して、TPM へのアクセス権を手動で付与することもできます。

  1. IoT Edge ランタイムに tpm0tpmrm0 へのアクセス権を付与する新しいルールを作成します。

    sudo touch /etc/udev/rules.d/tpmaccess.rules
    
  2. 規則ファイルを開きます。

    sudo nano /etc/udev/rules.d/tpmaccess.rules
    
  3. 次のアクセス情報を規則ファイルにコピーします。 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"
    
  4. ファイルを保存して終了します。

  5. udev システムをトリガーして、新しい規則を評価します。

    /bin/udevadm trigger --subsystem-match=tpm --subsystem-match=tpmrm
    
  6. 規則が正常に適用されたことを確認します。

    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 を更新してみてください。

  7. デバイスで行ったすべての構成の変更が反映されるように、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 ハブに移動して、新しいデバイスが自動的にプロビジョニングされたことを確認できます。 これで、デバイスで IoT Edge モジュールを実行する準備ができました。

実行中のモジュールを一覧表示します。

iotedge list

Device Provisioning Service で作成した個々の登録が使用されたことを確認できます。 Azure portal で Device Provisioning Service インスタンスに移動します。 作成した個々の登録の詳細を開きます。 登録の状態が割り当てられており、デバイス ID が表示されています。

次のステップ

デバイス プロビジョニング サービスの登録プロセスでは、新しいデバイスをプロビジョニングするときに、デバイス ID とデバイス ツイン タグを同時に設定できます。 これらの値を使用して、個々のデバイスまたはデバイス グループをデバイスの自動管理で使用できます。

Azure portal を使用して大規模な IoT Edge モジュールの展開と監視を行う方法または Azure CLI を使用する方法を理解します。