X.509 証明書を使用して Linux で IoT Edge デバイスを作成およびプロビジョニングする

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

重要

IoT Edge 1.5 LTS および IoT Edge 1.4 LTS がサポートされているリリースです。 IoT Edge 1.4 LTS は、2024 年 11 月 12 日にサポートが終了します。 以前のリリースの場合は、「IoT Edge を更新する」を参照してください。

この記事では、Linux IoT Edge デバイスを登録およびプロビジョニングするエンドツーエンドの手順 (IoT Edge のインストールを含む) について説明します。

IoT ハブに接続するすべてのデバイスには、cloud-to-device または device-to-cloud の通信の追跡に使用されるデバイス ID があります。 デバイスをその接続情報で構成します。これには、IoT ハブ ホスト名、デバイス ID、IoT Hub に対して認証を行うためにデバイスで使用される情報が含まれます。

この記事の手順では、"手動プロビジョニング" と呼ばれるプロセスについて説明します。ここでは、1 つのデバイスを IoT ハブに接続します。 手動プロビジョニングの場合、IoT Edge デバイスの認証には 2 つのオプションがあります。

  • 対称キー: IoT Hub で新しいデバイス ID を作成すると、サービスによって 2 つのキーが作成されます。 いずれかのキーをデバイスに配置すると、認証時にそのキーが IoT Hub に提示されます。

    この認証方法は比較的すばやく開始できますが、それほど安全ではありません。

  • X.509 自己署名: 2 つの X.509 ID 証明書を作成し、デバイスに配置します。 IoT Hub で新しいデバイス ID を作成するときは、両方の証明書の拇印を指定します。 デバイスでは IoT Hub に対して認証を行うときに、1 つの証明書が提示され、その証明書がその拇印と一致することが IoT によって検証されます。

    この認証方法はより安全であり、運用環境のシナリオの場合に推奨されます。

この記事では、認証方法として X.509 証明書を使用する方法について説明します。 対称キーを使用する場合は、「対称キーを使用して Linux で IoT Edge デバイスを作成およびプロビジョニングする」を参照してください。

Note

設定するデバイスが多数あり、それぞれを手動でプロビジョニングしたくない場合は、次の記事のいずれかを使用して、IoT Edge が IoT Hub Device Provisioning Service でどのように動作するかを確認してください。

前提条件

この記事では、IoT Edge デバイスを登録し、そこに IoT Edge をインストールする方法について説明します。 これらのタスクには、実行するために使用されるさまざまな前提条件とユーティリティがあります。 次に進む前に、すべての前提条件が満たされていることを確認してください。

デバイス管理ツール

デバイスを登録する手順には、Azure portalVisual Studio Code、または Azure CLI を使用できます。 各ユーティリティには、独自の前提条件があり、インストールが必要な場合があります。

Azure サブスクリプション内の無料または標準の IoT ハブ

デバイスの要件

X64、ARM32、または ARM64 の Linux デバイス。

Microsoft では、さまざまなオペレーティング システム用のインストール パッケージを公開しています。

運用シナリオ向けに現在サポートされているオペレーティング システムに関する最新の情報については、「Azure IoT Edge のサポートされるシステム」を参照してください。

デバイス ID 証明書を生成する

X.509 証明書を使用した手動プロビジョニングには、バージョン 1.0.10 以降の IoT Edge が必要です。

X.509 証明書を使用して IoT Edge デバイスをプロビジョニングする場合は、デバイス ID 証明書 と呼ばれるものを使用します。 この証明書は、IoT Edge デバイスのプロビジョニングと、Azure IoT Hub でのデバイス認証を行うためにのみ使用されます。 これは、他の証明書には署名しないリーフ証明書です。 デバイス ID 証明書は、IoT Edge デバイスによって検証のためにモジュールやダウンストリーム デバイスに提示される証明機関 (CA) 証明書とは別のものです。

X.509 証明書認証の場合、各デバイスの認証情報は、デバイス ID 証明書から取得した "拇印" の形式で提供されます。 これらの拇印は、サービスが接続時にデバイスを認識できるように、デバイスの登録時に IoT Hub に付与されます。

IoT Edge デバイスでの CA 証明書の使用方法については、「Azure IoT Edge での証明書の使用方法について理解する」を参照してください。

X.509 を使用して手動でプロビジョニングするには、次のファイルが必要です。

  • 2 つのデバイス ID 証明書と、それに対応する .cer または pem 形式の秘密キー証明書。 証明書のローテーションには、2 つのデバイス ID 証明書が必要です。 ベスト プラクティスとして、有効期限が異なる 2 つの異なるデバイス ID 証明書を準備します。 一方の証明書が期限切れになっても、もう一方はまだ有効であり、期限切れの証明書をローテーションする時間が与えられます。

    IoT Edge ランタイムには、証明書とキー ファイルのセットが 1 つ用意されています。 デバイス ID 証明書を作成するとき、IoT ハブ内のデバイスで使用するデバイス ID を使って証明書の共通名 (CN) を設定します。

  • 両方のデバイス ID 証明書から取得された拇印。 IoT Hub では、IoT Edge デバイスの登録時に 2 つの拇印が必要です。 登録に使用できる証明書は 1 つだけです。 1 つの証明書を使用するには、デバイスを登録するときに、プライマリとセカンダリの両方の拇印に同じ証明書の拇印を設定します。

    拇印の値は SHA-1 ハッシュの場合は 40 桁の 16 進数、SHA-256 ハッシュの場合は 64 桁の 16 進数です。 両方の拇印は、デバイスの登録時に IoT Hub に提供されます。

    証明書から拇印を取得する方法の 1 つは、次の openssl コマンドを使用することです。

    openssl x509 -in <certificate filename>.pem -text -fingerprint
    

    このコマンドの出力には拇印が含まれています。 次に例を示します。

    SHA1 Fingerprint=D2:68:D9:04:9F:1A:4D:6A:FD:84:77:68:7B:C6:33:C0:32:37:51:12
    

使用できる証明書がない場合は、デモ証明書を作成して IoT Edge デバイスの機能をテストできます。 この記事に記載されている手順に従って、証明書作成スクリプトを設定し、ルート CA 証明書を作成して、IoT Edge デバイス ID 証明書を作成します。 テストでは、1 つのデバイス ID 証明書を作成し、IoT Hub にデバイスを登録するときにプライマリとセカンダリの両方の拇印の値に同じ拇印を使用できます。

デバイスを登録する

デバイスを登録するには、好みに応じて Azure portalVisual Studio Code、または Azure CLI を使用できます。

Azure portal の IoT Hubで、IoT Edge デバイスは、Edge 対応ではない IoT デバイスとは別に作成および管理されます。

  1. Azure Portal にサインインし、IoT Hub に移動します。

  2. 左側のウィンドウで、メニューから [デバイス] を選択し、[デバイスを追加する] を選択します。

  3. [デバイスの作成] ページで、次の情報を指定します。

    • わかりやすいデバイス ID を作成します。 このデバイス ID は、後で使用するのでメモしておいてください。
    • [IoT Edge デバイス] のチェック ボックスをオンにします。
    • 認証の種類として [X.509 自己署名済み] を選択します。
    • プライマリとセカンダリの ID 証明書の拇印を指定します。 拇印の値は SHA-1 ハッシュの場合は 40 桁の 16 進数、SHA-256 ハッシュの場合は 64 桁の 16 進数です。 Azure portal では、16 進数の値のみがサポートされます。 ポータルに入力する前に、拇印の値から列の区切り記号とスペースを削除します。 たとえば、 D2:68:D9:04:9F:1A:4D:6A:FD:84:77:68:7B:C6:33:C0:32:37:51:12D268D9049F1A4D6AFD8477687BC633C032375112として入力されます。

    ヒント

    テストで 1 つの証明書を使用する場合は、プライマリとセカンダリの両方の拇印に同じ証明書を使用できます。

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

デバイスが IoT Hub に登録されたので、IoT Edge ランタイムのインストールとプロビジョニングを完了するために使用する情報を取得します。

登録済みデバイスを表示し、プロビジョニング情報を取得する

X.509 証明書認証を使用するデバイスでは、IoT Edge ランタイムのインストールとプロビジョニングを完了するために、IoT Hub 名、デバイス名、証明書ファイルが必要です。

IoT ハブに接続するエッジ対応デバイスが、デバイス ページに一覧表示されます。 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 を使用してデバイスをプロビジョニングする

これでコンテナー エンジンと IoT Edge ランタイムがデバイスにインストールされたので、クラウド ID と認証情報を使用してデバイスを設定する準備ができました。

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

    sudo cp /etc/aziot/config.toml.edge.template /etc/aziot/config.toml
    
  2. IoT Edge デバイスで構成ファイルを開きます。

    sudo nano /etc/aziot/config.toml
    
  3. ファイルの "Provisioning" セクションを見つけて、X.509 ID 証明書を使用した手動プロビジョニングの行をコメント解除します。 他のプロビジョニング セクションがすべてコメント アウトされていることを確認します。

    # Manual provisioning with x.509 certificates
    [provisioning]
    source = "manual"
    iothub_hostname = "REQUIRED_IOTHUB_HOSTNAME"
    device_id = "REQUIRED_DEVICE_ID_PROVISIONED_IN_IOTHUB"
    
    [provisioning.authentication]
    method = "x509"
    
    identity_cert = "REQUIRED_URI_OR_POINTER_TO_DEVICE_IDENTITY_CERTIFICATE"
    
    identity_pk = "REQUIRED_URI_TO_DEVICE_IDENTITY_PRIVATE_KEY"
    

次のフィールドを更新します。

  • iothub_hostname: デバイスの接続先の IoT Hub のホスト名。 たとえば、{IoT hub name}.azure-devices.net のようにします。
  • device_id: デバイスを登録したときに指定した ID。
  • identity_cert: デバイス上の ID 証明書の URI。たとえば、file:///path/identity_certificate.pem です。 または、EST またはローカル証明機関を使用して証明書を動的に発行します。
  • identity_pk: 指定された ID 証明書の秘密キー ファイルの URI。たとえば、file:///path/identity_key.pem です。 または、PKCS#11 URI を指定してから、構成情報を

構成ファイルの後半の PKCS#11 セクションで指定します。

証明書の詳細については、「IoT Edge 証明書を管理する」を参照してください。

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

CTRL + XYEnter

構成ファイルにプロビジョニング情報を入力した後、変更を適用します。

sudo iotedge config apply

モジュールのデプロイ

IoT Edge モジュールをデプロイするには、Azure portal で IoT ハブに移動し、次のようにします。

  1. [IoT Hub] メニューから [デバイス] を選択します。

  2. デバイスを選択して、そのページを開きます。

  3. [モジュールの設定] タブを選択します。

  4. IoT Edge の既定のモジュール (edgeAgent と edgeHub) をデプロイしますが、このペインにモジュールを追加する必要はないため、下部にある [確認 + 作成] を選択します。

  5. このモジュールについて JSON 形式の確認が表示されます。 [作成] を選択して、モジュールをデプロイします。<

詳細については、「モジュールを展開する」を参照してください。

構成が成功したことを確認する

IoT Edge デバイスにランタイムが正常にインストールされ、構成されていることを確認します。

ヒント

iotedge コマンドの実行には、昇格された特権が必要です。 IoT Edge ランタイムのインストール後に初めてマシンにサインインし直すと、アクセス許可は自動的に更新されます。 それまでは、コマンドの前に sudo を使用します。

IoT Edge システム サービスが実行されていることを確認します。

sudo iotedge system status

正常な状態の応答は Ok です。

サービスのトラブルシューティングが必要な場合は、サービス ログを取得します。

sudo iotedge system logs

check ツールを使用して、デバイスの構成と接続の状態を確認します。

sudo iotedge check

OK (緑)、警告 (黄色)、エラー (赤) など、さまざまな応答が予想されます。 一般的なエラーのトラブルシューティングについては、「Azure IoT Edge に関する一般的な問題の解決策」を参照してください。

check コマンドからのサンプル応答のスクリーンショット。

ヒント

アクセス許可が更新された後でも、必ず sudo を使用してチェック ツールを実行してください。 このツールには、構成状態を確認するために、config ファイルにアクセスするための昇格された特権が必要です。

Note

新しくプロビジョニングされたデバイスでは、IoT Edge ハブに関連するエラーが表示される場合があります。

× 運用環境の準備: Edge ハブのストレージ ディレクトリがホスト ファイル システムに保持されています - エラー

edgeHub コンテナーの現在の状態を確認できませんでした

このエラーは、IoT Edge ハブ モジュールが実行されていないために、新しくプロビジョニングされたデバイスで発生します。 このエラーを解決するには、IoT Hub でデバイスのモジュールを設定し、デプロイを作成します。 デバイスのデプロイを作成することで、IoT Edge ハブ モジュールを含むモジュールがデバイス上で開始されます。

IoT Edge デバイス上で実行されているすべてのモジュールを表示します。 初めてサービスが開始されると、edgeAgent モジュールが実行されていることだけを確認できます。 edgeAgent モジュールが既定で実行され、デバイスにデプロイする追加モジュールのインストールと起動を支援します。

sudo iotedge list

新しい IoT Edge デバイスを作成すると、Azure portal で状態コード 417 -- The device's deployment configuration is not set が表示されます。 この状態は正常であり、デバイスでモジュールのデプロイを受け取る準備ができていることを意味します。

オフラインまたは特定のバージョンのインストール (省略可能)

このセクションの手順は、標準のインストール手順では説明されていないシナリオを対象としています。 これには以下が含まれます。

  • オフラインの間に IoT Edge をインストールする
  • リリース候補バージョンをインストールする

パッケージ マネージャーで使用できない特定のバージョンの Azure IoT Edge ランタイムをインストールする場合は、このセクションの手順を使用します。 Microsoft パッケージのリストには、最近のバージョンとそのサブバージョンの限られたセットしか含まれていないので、これらの手順は、古いバージョンまたはリリース候補バージョンをインストールするユーザーが対象となります。

Ubuntu スナップを使用している場合は、スナップをダウンロードしてオフラインでインストールできます。 詳細については、スナップをダウンロードしてオフラインでインストールに関する記事を参照してください。

curl コマンドを使用すると、IoT Edge GitHub リポジトリから直接、コンポーネント ファイルをターゲットにすることができます。

  1. Azure IoT Edge リリースに移動し、対象とするリリース バージョンを見つけます。

  2. そのバージョンの [Assets] セクションを展開します。

  3. 各リリースには、IoT Edge と ID サービスの新しいファイルがあります。 オフライン デバイスに IoT Edge をインストールする場合は、事前にこれらのファイルをダウンロードします。 それ以外の場合は、以下のコマンドを使用して、これらのコンポーネントを更新します。

    1. IoT Edge デバイスのアーキテクチャに一致する aziot-identity-service ファイルを見つけます。 ファイル リンクを右クリックし、リンクのアドレスをコピーします。

    2. コピーしたリンクを次のコマンドで使用して、そのバージョンの ID サービスをインストールします。

      curl -L <identity service link> -o aziot-identity-service.deb && sudo apt-get install ./aziot-identity-service.deb
      

    1. IoT Edge デバイスのアーキテクチャに対応する aziot-edge ファイルを見つけます。 ファイル リンクを右クリックし、リンクのアドレスをコピーします。

    2. コピーしたリンクを次のコマンドで使用して、そのバージョンの IoT Edge をインストールします。

      curl -L <iotedge link> -o aziot-edge.deb && sudo apt-get install ./aziot-edge.deb
      

IoT Edge をアンインストールする

デバイスから IoT Edge のインストールを削除する必要がある場合は、次のコマンドを使用します。

IoT Edge ランタイムを削除します。

sudo apt-get autoremove --purge aziot-edge

IoT Edge を再インストールし、今後同じ構成情報を使用する場合は、--purgeフラグを使用しないでください。 構成ファイルを含め、IoT Edge に関連付けられているすべてのファイルを削除する場合は、--purge フラグを使用します。

IoT Edge ランタイムが削除されると、作成したコンテナーは停止されますが、デバイスには残っています。 すべてのコンテナーを表示して、どのコンテナーが残っているかを確認します。

sudo docker ps -a

2 つのランタイム コンテナーを含め、デバイスからコンテナーを削除します。

sudo docker rm -f <container name>

最後に、デバイスからコンテナー ランタイムを削除します。

sudo apt-get autoremove --purge moby-engine