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

適用対象:IoT Edge 1.4 チェックマーク IoT Edge 1.4

重要

IoT Edge 1.4 がサポートされているリリースです。 以前のリリースの場合は、「IoT Edge を更新する」を参照してください。

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

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

  • 物理 TPM ハードウェアを使用して Linux デバイスを自動プロビジョニングします。
  • 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 のプロビジョニング情報を取得する

Note

この記事では以前、IoT C SDK の tpm_device_provision ツールを使用してプロビジョニング情報を生成しました。 以前にこのツールを利用していた場合、以下の手順に従うと、同じ公開保証キーに対して別の登録 ID が生成されることに注意してください。 以前のように登録 ID を作成し直す必要がある場合は、C SDK の tpm_device_provision ツールによって生成する方法を参照してください。 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 が表示されます。 後ほど 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 仮想マシンまたは IoT Edge の物理デバイスを準備します。 次に、IoT Edge をインストールします。

次のコマンドを実行してパッケージ リポジトリを追加し、信頼できるキーの一覧に Microsoft パッケージ署名キーを追加します。

重要

2022 年 6 月 30 日に、レベル 1 OS サポート リストから Raspberry Pi OS Stretch が廃止されました。 潜在的なセキュリティの脆弱性を回避するために、ホスト OS を Bullseye に更新してください。

インストールは、数個のコマンドで実行できます。 ターミナルを開き、次のコマンドを実行します。

  • 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 でサポートされているプラットフォーム」を参照してください。

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

既定では、コンテナー エンジンによってコンテナー ログ サイズの制限は設定されません。 これにより、時間の経過と共に、デバイスがログでいっぱいになり、ディスク容量が不足する可能性があります。 ただし、ローカルに表示するようにログを構成することはできますが、省略しても構いません。 ログ構成の詳細については、「運用環境デプロイのチェックリスト」を参照してください。

次の手順では、ログ メカニズムとして local ログ ドライバーを使用するようにコンテナーを構成する方法を示します。

  1. 既存の Docker デーモンの構成ファイルを作成または編集します

    sudo nano /etc/docker/daemon.json
    
  2. 例で示すように、既定のログ ドライバーを local ログ ドライバーに設定します。

       {
          "log-driver": "local"
       }
    
  3. コンテナー エンジンを再起動して、変更を有効にします。

    sudo systemctl restart docker
    

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

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

Note

バージョン 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 defender-iot-micro-agent-edge
    

オプションの defender-iot-micro-agent-edge パッケージには、セキュリティ態勢管理、脆弱性、脅威検出、フリート管理などのエンドポイントの可視性を提供する Microsoft Defender for IoT セキュリティ マイクロ エージェントが含まれており、IoT Edge デバイスのセキュリティ保護に役立ちます。 Edge デバイスのセキュリティ監視とセキュリティ強化を有効にするには、Edge エージェントを使ってマイクロ エージェントをインストールすることをお勧めします。 Microsoft Defender for IoT の詳細については、「デバイス ビルダー向け Microsoft Defender for IoT とは」を参照してください。

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

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

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

IoT Edge のインストールの一部として提供されるテンプレート ファイルに基づいて、デバイスの構成ファイルを作成します。

sudo cp /etc/aziot/config.toml.edge.template /etc/aziot/config.toml

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

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

    # DPS provisioning with TPM
    [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 = "tpm"
    registration_id = "REGISTRATION_ID_HERE"
    
    # auto_reprovisioning_mode = Dynamic
    
  2. id_scoperegistration_id の値を、Device Provisioning Service とデバイス情報で更新します。 scope_id の値は、Device Provisioning Service のインスタンスの概要ページにある ID スコープです。

    プロビジョニング構成設定の詳細については、「IoT Edge デバイスの設定を構成する」を参照してください。

  3. 必要に応じて、ファイルの自動再プロビジョニング モード セクションを見つけます。 auto_reprovisioning_mode パラメーターを使用して、デバイスの再プロビジョニング動作を構成します。 動的 - 1 つの IoT Hub から別の IoT Hub にデバイスが移動されたことがデバイスで検出されたときに再プロビジョニングします。 これが既定です。 AlwaysOnStartup - デバイスが再起動されたとき、またはクラッシュによってデーモンが再起動されたときに再プロビジョニングします。 OnErrorOnly - デバイスの再プロビジョニングを自動的にトリガーしません。 接続エラーが原因で ID プロビジョニング中にデバイスが IoT Hub に接続できない場合、各モードには暗黙的なデバイス再プロビジョニング フォールバックがあります。 詳細については、「IoT Hub デバイスの再プロビジョニングの概念」を参照してください。

  4. 必要に応じて、payload パラメーターのコメントを解除して、ローカル JSON ファイルへのパスを指定します。 デバイスが登録されると、ファイルの内容が追加データとして DPS に送信されます。 これは、カスタム割り当てに役立ちます。 たとえば、人間の介入なしに IoT プラグ アンド プレイモデル ID に基づいてデバイスを割り当てる場合などです。

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

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

IoT Edge ランタイムは、デバイスの TPM へのアクセスを仲介する TPM サービスに依存しています。 デバイスを自動的にプロビジョニングするには、このサービスが TPM にアクセスする必要があります。

TPM へのアクセス権を付与するには、systemd 設定をオーバーライドして、aziottpm サービスに 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 aziottpm access to tpm0 and tpmrm0
    KERNEL=="tpm0", SUBSYSTEM=="tpm", OWNER="aziottpm", MODE="0660"
    KERNEL=="tpmrm0", SUBSYSTEM=="tpmrm", OWNER="aziottpm", MODE="0660"
    
  4. ファイルを保存して終了します。

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

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

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

  7. デバイスで行った構成の変更を適用します。

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

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

iotedge list

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

次のステップ

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

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