在 Linux 上使用 TPM 大规模创建和预配 IoT Edge 设备
适用于: IoT Edge 1.1
重要
IoT Edge 1.1 终止支持日期为 2022 年 12 月 13 日。 请查看 Microsoft 产品生命周期,了解此产品、服务、技术或 API 的受支持情况。 有关更新到最新版本的 IoT Edge 的详细信息,请参阅 更新 IoT Edge。
本文提供有关使用受信任的平台模块 (TPM) 为 Linux 设备自动预配 Azure IoT Edge 的说明。 可以通过 Azure IoT 中心设备预配服务自动预配 IoT Edge 设备。 如果你不熟悉自动预配过程,请在继续操作之前查看预配概述。
本文概述了两种方法。 根据解决方案的体系结构选择你的首选方法:
- 使用物理 TPM 硬件自动预配 Linux 设备。 例如,Infineon OPTIGA™ TPM SLB 9670。
- 使用模拟 TPM(在启用了 Hyper-V 的 Windows 开发计算机上运行)自动预配 Linux 虚拟机 (VM)。 建议仅将此方法用作测试方案。 模拟 TPM 无法提供与物理 TPM 相同的安全性。
具体说明因你的方法而异,因此请确保接下来按照正确选项卡上的说明操作。
先决条件
云资源
- 一个活动的 IoT 中心
- Azure 中的一个 IoT 中心设备预配服务实例,该实例已链接到 IoT 中心
- 如果没有设备预配服务实例,则可按照 IoT 中心设备预配服务快速入门的创建新的 IoT 中心设备预配服务和将 IoT 中心和设备预配服务相链接部分的说明进行操作。
- 运行设备预配服务后,从概述页复制“ID 范围”的值。 配置 IoT Edge 运行时时,需要使用此值。
设备要求
一台充当 IoT Edge 设备的物理 Linux 设备。
如果你是设备制造商,请参阅有关如何将 TPM 集成到制造过程中的指南。
注意
将 TPM 证明与设备预配服务结合使用时,需要 TPM 2.0。
使用 TPM 时,只能创建单个设备预配服务注册,不能创建组设备预配服务注册。
设置设备
检索 TPM 的预配信息
在本部分中,你将生成一个可用于检索 TPM 的注册 ID 和认可密钥的工具。
登录设备,然后按照设置 Linux 开发环境中的步骤安装和生成适用于 C 的 Azure IoT 设备 SDK。
运行以下命令,以生成 SDK 工具来检索 TPM 的设备预配信息。
cd azure-iot-sdk-c/cmake cmake -Duse_prov_client:BOOL=ON .. cd provisioning_client/tools/tpm_device_provision make sudo ./tpm_device_provision
输出窗口会显示设备的“注册 ID”和“认可密钥” 。 请复制这些值,以便稍后在设备预配服务中为设备创建单个注册时使用。
获得注册 ID 和认可密钥后,即可继续操作。
提示
如果你不想使用 TPM2 软件工具检索信息,则需要寻找其他方法来获取预配信息。 认可密钥对于每个 TPM 芯片都是唯一的,需从与之关联的 TPM 芯片制造商处获取。 可为 TPM 设备派生唯一的 注册 ID。 例如,可以创建认可密钥的 SHA-256 哈希,如上所示。
创建设备预配服务注册
使用 TPM 的预配信息在设备预配服务中创建单个注册。
在设备预配服务中创建注册时,可以声明“初始设备孪生状态”。 在设备孪生中可以设置标记,以便按解决方案中所用的任何指标(例如区域、环境、位置或设备类型)将设备分组。 这些标记用于创建自动部署。
提示
本文中的步骤适用于 Azure 门户,但你也可使用 Azure CLI 创建单个注册。 有关详细信息,请参阅 az iot dps enrollment。 作为 CLI 命令的一部分,使用 edge-enabled 标志指定注册适用于单个 IoT Edge设备。
在 Azure 门户中,转到你的 IoT 中心设备预配服务实例。
在“设置”下,选择“管理注册”。
选择“添加单个注册”,然后完成以下步骤以配置注册:
对于“机制”,请选择“TPM”。
提供从 VM 或物理设备中复制的认可密钥和注册 ID。
根据需要,为设备提供一个 ID。 如果未提供设备 ID,则会使用注册 ID。
选择“True”,以声明 VM 或物理设备是 IoT Edge 设备。
选择要将设备连接到的已链接 IoT 中心,或者选择“链接到新的 IoT 中心”。 可以选择多个中心,设备将会根据所选分配策略被分配到其中一个中心。
根据需要,将标记值添加到“初始设备孪生状态”。 可以使用标记将设备组指定为模块部署的目标。 有关详细信息,请参阅大规模部署 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 Necessary
和Network Drivers
下的所有项是否都已启用。 如果缺少某些功能,请启用它们,方法是通过源重新构建内核,然后选择关联的模块,将其包括在相应的内核 .config 中。同样,如果使用内核配置生成器(例如defconfig
或menuconfig
),请找到并启用相应的功能,然后以相应方式重新构建内核。 部署新修改的内核后,再次运行 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 中心的信息来配置该设备。
了解之前收集的设备预配服务 ID 范围和设备注册 ID 。
在 IoT Edge 设备上打开配置文件。
sudo nano /etc/iotedge/config.yaml
找到文件的预配配置部分。 取消评论 TPM 预配的行,并确保注释禁止任何其他预配行。
provisioning:
行前面应无空格,并且嵌套项应该缩进两个空格。# 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
将
scope_id
和registration_id
的值更新为你的设备预配服务和设备信息。scope_id
值是设备预配服务实例概述页中的“ID 范围”。(可选)使用
always_reprovision_on_startup
或dynamic_reprovisioning
行来配置设备的重新预配行为。 如果设备设置为在启动时重新预配,它将始终尝试先使用 DPS 进行预配,如果失败,则回退到预配备份。 如果设备设置为动态重新预配,则 IoT Edge(和所有模块)将在检测到重新预配事件时(例如设备从一个 IoT 中心移动到另一个)重启并重新预配。 具体而言,IoT Edge 会检查 SDK 中是否存在bad_credential
或device_disabled
错误,以检测重新预配事件。 若要手动触发此事件,请在 IoT 中心禁用该设备。 有关详细信息,请参阅 IoT 中心设备重新预配概念。保存并关闭该文件。
向 IoT Edge 授予 TPM 的访问权限
IoT Edge 运行时需要访问 TPM 以自动预配设备。
通过覆盖系统设置可以授予 IoT Edge 运行时对 TPM 的访问权限,以便 iotedge
服务获得根特权。 如果不想提升服务权限,也可以使用以下步骤手动提供 TPM 访问权限。
创建一条新规则,用于向 IoT Edge 运行时授予对
tpm0
和tpmrm0
的访问权限。sudo touch /etc/udev/rules.d/tpmaccess.rules
打开 rules 文件。
sudo nano /etc/udev/rules.d/tpmaccess.rules
将以下访问信息复制到 rules 文件。 在使用的内核低于 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"
保存并退出该文件。
触发
udev
系统来评估新规则。/bin/udevadm trigger --subsystem-match=tpm --subsystem-match=tpmrm
验证是否已成功应用该规则。
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
。重启 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
可以验证是否使用了在设备预配服务中创建的单个注册。 在 Azure 门户中转到你的设备预配服务实例。 打开创建的个人注册的注册详细信息。 注意注册状态是否为“已分配”并且设备 ID 已列出。
后续步骤
使用设备预配服务注册过程可以在预配新设备的同时,设置设备 ID 和设备孪生标记。 可以在自动设备管理中,使用这些值将单个设备或设备组指定为目标。