使用对称密钥在 Linux 上大规模创建和预配 IoT Edge 设备

适用于:“是”图标 IoT Edge 1.1

重要

IoT Edge 1.1 终止支持日期为 2022 年 12 月 13 日。 请查看 Microsoft 产品生命周期,了解此产品、服务、技术或 API 的受支持情况。 有关更新到最新版本的 IoT Edge 的详细信息,请参阅 更新 IoT Edge

本文提供有关使用对称密钥自动预配一个或多个 Linux IoT Edge 设备的详尽说明。 可以通过 Azure IoT 中心设备预配服务 (DPS) 自动预配 Azure IoT Edge 设备。 如果你不熟悉自动预配过程,请在继续操作之前查看预配概述

任务如下:

  1. 为单个设备创建单个注册,或为一组设备创建组注册。
  2. 安装 IoT Edge 运行时并连接到 IoT 中心。

对称密钥证明是一种通过设备预配服务实例对设备进行身份验证的简单方法。 此证明方法表示不熟悉设备预配或不具备严格安全要求的开发人员的“Hello world”体验。 使用 TPMX.509 证书的设备证明更加安全,且应该用于更严格的安全要求。

先决条件

云资源

  • 一个活动的 IoT 中心
  • Azure 中的一个 IoT 中心设备预配服务实例,该实例已链接到 IoT 中心

设备要求

一个充当 IoT Edge 设备的物理设备或虚拟 Linux 设备。

您需要定义一个唯一的注册 ID 来标识每个设备。 可以使用 MAC 地址、序列号或设备中的任何唯一信息。 例如,可以使用 MAC 地址和序列号的组合,构成以下注册 ID 字符串:sn-007-888-abc-mac-a1-b2-c3-d4-e5-f6。 有效字符为小写字母数字和短划线 (-)。

创建 DPS 注册

创建注册以通过 DPS 预配一个或多个设备。

如果要预配单个 IoT Edge 设备,请创建单个注册。 如果需要预配多个设备,请按照创建 DPS 组注册的步骤进行操作。

在 DPS 中创建注册时,可以声明“初始设备孪生状态”。 在设备孪生中可以设置标记,以便按解决方案中所需的任何指标(例如区域、环境、位置或设备类型)将设备分组。 这些标记用于创建自动部署

有关设备预配服务中的注册的详细信息,请参阅如何管理设备注册

创建 DPS 单独注册

提示

本文中的步骤适用于 Azure 门户,但你也可使用 Azure CLI 创建单个注册。 有关详细信息,请参阅 az iot dps enrollment。 作为 CLI 命令的一部分,使用 edge-enabled 标志指定注册适用于单个 IoT Edge设备。

  1. Azure 门户中,导航到 IoT 中心设备预配服务实例。

  2. 在“设置”下,选择“管理注册”。

  3. 选择“添加个人注册”,然后完成以下步骤以配置注册:

    1. 对于“机制”,请选择“对称密钥”。

    2. 为设备提供一个唯一的注册 ID。

    3. (可选)为设备提供一个 IoT 中心设备 ID。 可以使用设备 ID 将单个设备指定为模块部署的目标。 如果未提供设备 ID,则会使用注册 ID。

    4. 选择“True”,声明该注册适用于 IoT Edge 设备。

    5. (可选)向“初始设备孪生状态”添加一个标记值。 可以使用标记将设备组指定为模块部署的目标。 例如:

      {
         "tags": {
            "environment": "test"
         },
         "properties": {
            "desired": {}
         }
      }
      
    6. 选择“保存” 。

  4. 复制个人注册的“主密钥”值,以便在安装 IoT Edge 运行时的情况下使用。

既然此设备已存在注册,IoT Edge 运行时在安装期间可以自动预配设备。

安装 IoT Edge

在本节中,你将准备 IoT Edge 的 Linux VM 或物理设备。 然后安装 IoT Edge。

运行以下命令以添加包存储库,然后将 Microsoft 包签名密钥添加到你的受信任密钥列表中。

重要

2022 年 6 月 30 日,Raspberry Pi OS Stretch 将在第 1 层 OS 支持列表中停用。 为避免潜在的安全漏洞,请将主机 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 NecessaryNetwork Drivers 下的所有项是否都已启用。 如果缺少某些功能,请启用它们,方法是通过源重新构建内核,然后选择关联的模块,将其包括在相应的内核 .config 中。同样,如果使用内核配置生成器(例如 defconfigmenuconfig),请找到并启用相应的功能,然后以相应方式重新构建内核。 部署新修改的内核后,再次运行 check-config 脚本,验证是否已成功启用所有必要的功能。

安装 IoT Edge 运行时

IoT Edge 安全守护程序提供和维护 IoT Edge 设备上的安全标准。 守护程序在每次开机时启动,并通过启动 IoT Edge 运行时的其余部分来启动设备。

本部分中的步骤表示在具有 Internet 连接的设备上安装最新版本的典型过程。 如果需要安装特定版本(如预发行版)或需要在脱机状态下安装,请按照本文后面的脱机或特定版本安装步骤进行操作。

安装 IoT Edge 版本 1.1.* 以及 libiothsm-std 包:

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

注意

IoT Edge 1.1 版本是 IoT Edge 的长期支持分支。 如果运行的是旧版本,建议安装或更新到最新补丁,因为旧版本不再受支持。

为设备预配其云标识

在设备上安装运行时后,请使用供设备用来连接到设备预配服务和 IoT 中心的信息来配置该设备。

准备好以下信息:

  • DPS 的“ID 范围”值
  • 为设备创建的“注册 ID”
  • 个人注册的主密钥,或者使用组注册时设备的派生密钥。
  1. 在 IoT Edge 设备上打开配置文件。

    sudo nano /etc/iotedge/config.yaml
    
  2. 找到该文件的预配配置部分。 取消注释 DPS 对称密钥预配的行,并确保注释掉任何其他预配行。

    provisioning: 行前面应无空格,并且嵌套项应该缩进两个空格。

    # DPS TPM provisioning configuration
    provisioning:
      source: "dps"
      global_endpoint: "https://global.azure-devices-provisioning.net"
      scope_id: "PASTE_YOUR_SCOPE_ID_HERE"
      attestation:
        method: "symmetric_key"
        registration_id: "PASTE_YOUR_REGISTRATION_ID_HERE"
        symmetric_key: "PASTE_YOUR_PRIMARY_KEY_OR_DERIVED_KEY_HERE"
    
    # always_reprovision_on_startup: true
    # dynamic_reprovisioning: true
    
  3. scope_idregistration_idsymmetric_key 的值更新为你的 DPS 和设备信息。

  4. (可选)使用 always_reprovision_on_startupdynamic_reprovisioning 行来配置设备的重新预配行为。 如果设备设置为在启动时重新预配,它将始终尝试先使用 DPS 进行预配,如果失败,则回退到预配备份。 如果设备设置为动态重新预配,则 IoT Edge(和所有模块)将在检测到重新预配事件时(例如设备从一个 IoT 中心移动到另一个)重启并重新预配。 具体而言,IoT Edge 会检查 SDK 中是否存在 bad_credentialdevice_disabled 错误,以检测重新预配事件。 若要手动触发此事件,请在 IoT 中心禁用该设备。 有关详细信息,请参阅 IoT 中心设备重新预配概念

  5. 重启 IoT Edge 运行时,使之拾取你在设备上所做的所有配置更改。

    sudo systemctl restart iotedge
    

验证是否成功安装

如果运行时成功启动,则可以进入 IoT 中心,开始将 IoT Edge 模块部署到你的设备。

可以验证是否使用了在设备预配服务中创建的单独注册。 在 Azure 门户中导航到你的设备预配服务实例。 打开创建的个人注册的注册详细信息。 注意注册状态是否为“已分配”并且设备 ID 已列出。

在设备上,使用以下命令验证是否已成功安装并启动 IoT Edge。

检查 IoT Edge 服务的状态。

systemctl status iotedge

检查服务日志。

journalctl -u iotedge --no-pager --no-full

列出正在运行的模块。

iotedge list

后续步骤

使用设备预配服务注册过程可以在预配新设备的同时,设置设备 ID 和设备孪生标记。 可以在自动设备管理中,使用这些值将单个设备或设备组指定为目标。 了解如何使用 Azure 门户大规模部署和监视 IoT Edge 模块,或使用 Azure CLI 执行此操作。