在 Linux 上使用 TPM 大规模创建和预配 IoT Edge 设备

适用于:IoT Edge 1.4 复选标记 IoT Edge 1.4

本文提供有关使用受信任的平台模块 (TPM) 为 Linux 设备自动预配 Azure IoT Edge 的说明。 可以通过 Azure IoT 中心设备预配服务自动预配 IoT Edge 设备。 如果你不熟悉自动预配过程,请在继续操作之前查看预配概述

本文概述了两种方法。 根据解决方案的体系结构选择你的首选方法:

  • 使用物理 TPM 硬件自动预配 Linux 设备。 例如,Infineon OPTIGA™ TPM SLB 9670
  • 使用模拟 TPM(在启用了 Hyper-V 的 Windows 开发计算机上运行)自动预配 Linux 虚拟机 (VM)。 建议仅将此方法用作测试方案。 模拟 TPM 无法提供与物理 TPM 相同的安全性。

具体说明因你的方法而异,因此请确保接下来按照正确选项卡上的说明操作。

任务如下:

  1. 检索 TPM 的预配信息。
  2. 在 IoT 中心设备预配服务的实例中为设备创建单个注册。
  3. 安装 IoT Edge 运行时并将设备连接到 IoT 中心。

先决条件

云资源

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

设备要求

一台充当 IoT Edge 设备的物理 Linux 设备。

如果你是设备制造商,请参阅有关如何将 TPM 集成到制造过程中的指南。

注意

将 TPM 证明与设备预配服务结合使用时,需要 TPM 2.0。

使用 TPM 时,只能创建单个设备预配服务注册,不能创建组设备预配服务注册。

设置设备

如果将物理 Linux 设备与 TPM 结合使用,则无需执行额外的步骤来设置设备。

你已准备就绪,可以继续操作。

检索 TPM 的预配信息

注意

本文以前使用 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”。 请复制这些值,以便稍后在设备预配服务中为设备创建单个注册时使用。

获得注册 ID 和认可密钥后,即可继续操作。

提示

如果你不想使用 TPM2 软件工具检索信息,则需要寻找其他方法来获取预配信息。 认可密钥对于每个 TPM 芯片都是唯一的,需从与之关联的 TPM 芯片制造商处获取。 可为 TPM 设备派生唯一的 注册 ID。 例如,可以创建认可密钥的 SHA-256 哈希,如上所示。

创建设备预配服务注册

使用 TPM 的预配信息在设备预配服务中创建单个注册。

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

提示

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

  1. Azure 门户中,转到你的 IoT 中心设备预配服务实例。

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

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

    1. 对于“机制”,请选择“TPM”。

    2. 提供从 VM 或物理设备中复制的认可密钥和注册 ID。

    3. 根据需要,为设备提供一个 ID。 如果未提供设备 ID,则会使用注册 ID。

    4. 选择“True”,以声明 VM 或物理设备是 IoT Edge 设备。

    5. 选择要将设备连接到的已链接 IoT 中心,或者选择“链接到新的 IoT 中心”。 可以选择多个中心,设备将会根据所选分配策略被分配到其中一个中心。

    6. 根据需要,将标记值添加到“初始设备孪生状态”。 可以使用标记将设备组指定为模块部署的目标。 有关详细信息,请参阅大规模部署 IoT Edge 模块

    7. 选择“保存” 。

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

安装 IoT Edge

在本部分,你将准备 IoT Edge 的 Linux 虚拟机或物理设备。 然后安装 IoT Edge。

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

重要

2022 年 6 月 30 日,Raspberry Pi OS Stretch 将在第 1 层 OS 支持列表中停用。 为避免潜在的安全漏洞,请将主机 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 支持的平台

注意

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 运行时的其余部分来启动设备。

注意

从版本 1.2 开始,IoT 标识服务会处理 IoT Edge 以及需要与 IoT 中心通信的其他设备组件的标识预配和管理。

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

提示

如果你已经有运行旧版本的 IoT Edge 设备并想要升级到最新版本,请按照更新 IoT Edge 安全守护程序和运行时中的步骤操作。 最新版本与先前的 IoT Edge 版本有很大不同,因此需要采取特定的步骤进行升级。

安装最新版本的 IoT Edge 和 IoT 标识服务包(如果不是最新版本):

  • 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

为设备预配其云标识

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

了解之前收集的设备预配服务 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 的值更新为你的设备预配服务和设备信息。 scope_id 值是设备预配服务实例概述页中的“ID 范围”。

    有关预配配置设置的详细信息,请参阅配置 IoT Edge 设备设置

  3. (可选)找到文件的自动重新预配模式部分。 使用 auto_reprovisioning_mode 参数来配置设备的重新预配行为。 Dynamic - 设备在检测到它可能已从一个 IoT 中心移动到另一个时进行重新预配。 这是默认情况。 AlwaysOnStartup - 设备在重新启动时或在故障导致守护程序重启时进行重新预配。 OnErrorOnly - 从不自动触发设备重新预配。 如果设备在标识预配过程中由于连接错误而无法连接到 IoT 中心,则每个模式都有隐式设备重新预配回退。 有关详细信息,请参阅 IoT 中心设备重新预配概念

  4. (可选)取消注释 payload 参数以指定本地 JSON 文件的路径。 设备注册时,文件的内容将作为附加数据发送到 DPS。 这对于自定义分配很有用。 例如,如果要根据 IoT 即插即用模型 ID 分配设备而无需人工干预。

  5. 保存并关闭该文件。

向 IoT Edge 授予 TPM 的访问权限

IoT Edge 运行时依赖于 TPM 服务,该服务是对设备 TPM 的访问的中转站。 该服务需要访问 TPM 以自动预配设备。

通过覆盖系统设置可以授予对 TPM 的访问权限,以便 aziottpm 服务获得根特权。 如果不想提升服务权限,也可以使用以下步骤手动提供 TPM 访问权限。

  1. 创建一条新规则,用于向 IoT Edge 运行时授予对 tpm0tpmrm0 的访问权限。

    sudo touch /etc/udev/rules.d/tpmaccess.rules
    
  2. 打开 rules 文件。

    sudo nano /etc/udev/rules.d/tpmaccess.rules
    
  3. 将以下访问信息复制到 rules 文件。 在使用的内核低于 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

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

后续步骤

使用设备预配服务注册过程可以在预配新设备的同时,设置设备 ID 和设备孪生标记。 可以在自动设备管理中,使用这些值将单个设备或设备组指定为目标。

了解如何使用 Azure 门户Azure CLI 大规模部署和监视 IoT Edge 模块。