适用于: IoT Edge 1.1
重要
IoT Edge 1.1 终止支持日期为 2022 年 12 月 13 日。 有关此产品、服务、技术或 API 支持方式的信息,请查看 Microsoft产品生命周期 。 有关更新到最新版本的 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 Hub 设备预配服务实例
- 如果您还没有设备预配服务实例,可以按照 IoT 中心设备预配服务快速入门中的“创建新的 IoT 中心设备预配服务”和“链接 IoT 中心和设备预配服务”部分中的说明进行操作。
- 运行设备预配服务后,从概述页复制“ID 范围”的值。 配置 IoT Edge 运行时时,需要使用此值。
设备要求
一台充当 IoT Edge 设备的物理 Linux 设备。
如果你是设备制造商,请参阅有关 将 TPM 集成到制造过程的指南。
注释
将 TPM 证明与设备预配服务结合使用时,需要 TPM 2.0。
使用 TPM 时,只能创建单个设备预配服务注册,不能创建组设备预配服务注册。
设置设备
检索 TPM 的预配信息
在本部分中,将生成一个工具,可用于检索 TPM 的注册 ID 和认可密钥。
登录到设备,然后按照 “设置 Linux 开发环境” 中的步骤安装和生成适用于 C 的 Azure IoT 设备 SDK。
运行以下命令以生成用于检索 TPM 的设备预配信息的 SDK 工具。
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 中心一样。 具体来说,IoT Edge 会检查 SDK 中的bad_credential
或device_disabled
错误,以识别重新预配事件。 若要手动触发此事件,请在 IoT 中心禁用设备。 有关详细信息,请参阅 IoT 中心设备重新预配概念。保存并关闭该文件。
向 IoT Edge 授予 TPM 的访问权限
IoT Edge 运行时需要访问 TPM 才能自动预配设备。
可以通过重写系统设置来授予 TPM 对 IoT Edge 运行时的访问权限,以便 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 和设备孪生标记。 可以在自动设备管理中,使用这些值将单个设备或设备组指定为目标。