移植Amazon IoT over-the-air (OTA) 更新库 - FreeRTOS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

移植Amazon IoT over-the-air (OTA) 更新库

有了 FreeRTOS over-the-air (OTA) 更新,您可以执行下列操作:

  • 将固件映像部署到单个设备、一组设备或整个机群。

  • 在将设备添加到组,或重置或重新预配置设备时,将固件部署到设备。

  • 在新固件部署到设备之后,验证其真实性和完整性。

  • 监控部署进度。

  • 调试失败的部署。

  • 使用 Amazon IoT 的代码签名对固件进行数字签名。

有关更多信息,请参阅 。FreeRTOS 无线更新中的FreeRTOS 用户指南以及Amazon IoT无线更新文档.

您可以使用 OTA 更新库,将 OTA 功能集成到 FFreeRTOS 应用程序中。有关更多信息,请参阅 。FreeRTOS OTA 更新库中的FreeRTOS 用户指南.

FreeRTOS 设备必须在它们接收到的 OTA 固件映像上强制实施加密代码签名验证。我们建议采用下列算法:

  • 椭圆曲线数字签名算法 (ECDSA)

  • NIST P256 曲线

  • SHA-256 哈希

先决条件

移植平台

您必须提供 OTA 便携式抽象层 (PAL) 的实现,才能将 OTA 库移植到新设备。中定义的 PAL APIota_平台_Interface.h必须提供具体实施详细信息的文件。

函数名称

描述

otaPal_Abort

停止 OTA 更新。

otaPal_CreateFileForRx

创建文件来存储接收到的数据块。

otaPal_CloseFile

关闭指定的文件。如果您使用实现加密保护的存储,这可能会对文件进行身份验证。

otaPal_WriteBlock

按照指定偏移量将数据块写入指定文件。成功时,函数将返回写入的字节数。否则,函数将返回负数错误代码。区块大小将始终为 2 的力量,并将保持对齐。有关更多信息,请参阅 。OTA 库配置.

otaPal_ActivateNewImage

激活或启动新的固件映像。对于某些端口,如果以编程方式同步重置设备,此函数将不会返回。

otaPal_SetPlatformImageState

执行平台所需的任何操作来接受或拒绝最新的 OTA 固件映像(或包)。要实现此函数,请参阅您的主板(平台)的文档以了解详细信息和架构。

otaPal_GetPlatformImageState

获取 OTA 更新映像的状态。

如果您的设备已内置相应支持,实施此表中的函数。

函数名称

描述

otaPal_CheckFileSignature

验证指定文件的签名。

otaPal_ReadAndAssumeCertificate

从文件系统读取指定的签署人证书并将其返回给调用方。

otaPal_ResetDevice

重置设备。

注意

确保您有支持 OTA 更新的引导加载程序。有关创建Amazon IoT请参阅设备引导加载程序IoT 设备引导加载程序.

E2E 和 PAL 测试

运行 OTA PAL 和 E2E 测试。

E2E 测试

OTA 端到端 (E2E) 测试用于验证设备的 OTA 功能并从现实中模拟场景。此测试将包括错误处理。

先决条件

要移植此测试,需要以下条件:

  • 具有AmazonOTA 库集成在其中。访问移植 OTA 库指南有关更多信息。

  • 使用 OTA 库移植演示应用程序进行交互Amazon IoT Core要执行 OTA 更新。请参阅 移植 OTA 演示应用程序

  • 设置 IDT 工具。这将运行 OTA E2E 主机应用程序来构建、闪存和监控具有不同配置的设备,并验证 OTA 库的集成。

移植 OTA 演示应用程序

OTA E2E 测试必须有 OTA 演示应用程序来验证 OTA 库的集成。演示应用程序必须具备执行 OTA 固件更新的能力。你可以在这里找到 FreeRTOS OTA 演示应用程序GitHub FreeRTOS存储库。我们建议您使用演示应用程序作为参考,然后根据自己的规格对其进行修改。

移植步骤
  1. 初始化 OTA 代理。

  2. 实现 OTA 应用程序回调函数。

  3. 创建 OTA 座席事件处理任务。

  4. 启动 OTA 代理。

  5. 监控 OTA 代理统计信息。

  6. 关闭 OTA 代理。

访问FreeRTOS OTA 通过 MQTT-演示的入口点有关详细说明。

配置

需要以下配置才能与之交互:Amazon IoT Core:

  • Amazon IoT Core客户端凭证

    • 设置democonfigroot_ca_PEMOta_Over_Mqtt_Demo/demo_config.h使用亚马逊信任服务端点。请参阅Amazon服务器身份验证有关更多信息。

    • 设置democonfigClient_认证_PEMdemoconfigClient_private_Key_PEMOta_Over_Mqtt_Demo/demo_config.h用您的Amazon IoT客户端凭证。请参阅Amazon客户端身份验证详情了解客户端证书和私钥。

  • 应用程序版本

  • OTA 控制协议

  • OTA 数据协议

  • 代码签名凭证

  • 其他 OTA 库配置

您可以在中找到上述信息demo_config.hota_config.h在 FreeRTOS OTA 演示应用程序中。访问FreeRTOS OTA 通过 MQTT-设置设备有关更多信息。

构建验证

运行演示应用程序以运行 OTA 作业。成功完成后,您可以继续运行 OTA E2E 测试。

FreeRTOSOTA 演示提供了有关设置 OTA 客户端和Amazon IoT CoreFreeRTOS 窗口模拟器上的 OTA 工作。AmazonOTA 同时支持 MQTT 和 HTTP 协议。有关更多详细信息,请参阅下面的示例:

使用 IDT 工具运行测试

要运行 OTA E2E 测试,你必须使用Amazon IoT Device Tester(IDT) 来自动执行。请参阅Amazon IoT Device Tester用于 FreeRTOS中的FreeRTOS 用户指南有关更多信息。

E2E 测试用例

测试用例

描述

OTAE2EGreaterVersion

定期 OTA 更新的快乐路径测试。它使用较新版本创建更新,设备会成功更新该版本。

OTAE2EBackToBackDownloads

此测试连续创建 3 次 OTA 更新。预计该设备将连续 3 次更新。

OTAE2ERollbackIfUnableToConnectAfterUpdate

此测试验验证如果设备无法使用新固件连接到网络,它是否会回滚到以前的固件。

OTAE2ESameVersion

此测试确认,如果版本保持不变,设备会拒绝传入的固件。

OTAE2EUnsignedImage

此测试验验证如果镜像未签名,设备是否会拒绝更新。

OTAE2EUntrustedCertificate

此测试验验证如果固件使用不受信任的证书签名,设备是否拒绝更新。

OTAE2EPreviousVersion

此测试验验证设备是否拒绝了较旧的更新版本。

OTAE2EIncorrectSigningAlgorithm

不同的设备支持不同的签名和哈希算法。此测试验验证如果设备是使用不受支持的算法创建的 OTA 更新是否失败。

OTAE2EDisconnectResume

这是暂停和恢复功能的快乐路径测试。此测试将创建 OTA 更新并开始更新。然后它连接到Amazon IoT Core具有相同的客户端 ID(事物名称)和凭据。Amazon IoT Core然后断开设备的连接。预计该设备将检测到它已断开连接Amazon IoT Core,在一段时间后,将自己移至暂停状态并尝试重新连接到Amazon IoT Core然后恢复下载。

OTAE2EDisconnectCancelUpdate

此测试检查设备是否可以自行恢复,如果 OTA 作业处于挂起状态时被取消。它做的事情与OTAE2EDisconnectResume测试,除了连接到之后Amazon IoT Core,断开设备的连接,它会取消 OTA 更新。创建了一个新的更新。预计该设备将重新连接到Amazon IoT Core中止当前更新,返回等待状态,然后接受并完成下一次更新。

OTAE2EPresignedUrlExpired

创建 OTA 更新后,您可以配置 S3 预签名 URL 的生命周期。此测试验验证设备是否能够执行 OTA,即使该设备在 url 过期时无法完成下载。预计该设备将请求一份新的作业文档,其中包含用于恢复下载的新 URL。

OTAE2E2UpdatesCancel1st

此测试连续创建两个 OTA 更新。当设备报告正在下载第一个更新时,测试力将取消第一次更新。预计该设备将中止当前更新并获取第二个更新,然后完成。

OTAE2ECancelThenUpdate

此测试连续创建两个 OTA 更新。当设备报告正在下载第一个更新时,测试力将取消第一次更新。预计该设备将中止当前更新并获取第二个更新,然后完成。

OTAE2EImageCrashed

此测试检查设备是否能够在映像崩溃时拒绝更新。

PAL 测试

先决条件

要移植网络传输接口测试,需要具备以下条件:

  • 一个可以使用有效的 FreeRTOS 内核端口构建 FreeRTOS 的项目。

  • OTA PAL 的工作实施。

移植

  • AddFreertoS-图书馆-集成-测试作为项目的子模块。项目中子模块的位置必须是可以构建子模块的位置。

  • Copyconfig_template/test_execution_config_template.hconfig_template/test_param_config_template.h转到构建路径中的某个位置,然后将其重命名为test_execution_config.htest_param_config.h.

  • 在生成系统中包含相关文件。使用 时CMakequalification_test.cmakesrc/ota_pal_tests.cmake可以用来包含相关文件。

  • 通过实现以下功能来配置测试:

    • SetupOtaPalTestParam():中定义src/ota/ota_pal_test.h. 实现必须具有与中定义的相同名称和签名。ota_pal_test.h. 目前,您不需要配置此函数。

  • 实现UNITY_OUTPUT_CHAR以便测试输出日志不会与设备日志交错。

  • CallRunQualificationTest()来自应用程序。必须正确初始化设备硬件,并且必须在呼叫之前连接网络。

测试

本节介绍 OTA PAL 资格考试的本地测试。

启用测试

打开test_execution_config.h然后定义启用 OTA_PAL_TEST__到 1。

Intest_param_config.h中,更新以下选项:

  • OTA_PAL_TEST_CERT_TYPE:选择使用的证书类型。

  • OTA_PAL_认证_文件:设备证书的路径(如果适用)。

  • OTA_PAL_FIRMWARE_FILE:固件文件的名称(如果适用)。

  • OTA_PAL_USE_FILE_SYSTEM:如果 OTA PAL 使用文件系统抽象,则设置为 1。

使用自己选择的工具链构建和刷新应用程序。当RunQualificationTest()被称为,OTA PAL 测试将运行。测试结果将输出到串行端口。

集成 OTA 任务

  • 将 OTA 代理添加到当前的 MQTT 演示中。

  • 运行 OTA 端到端 (E2E) 测试Amazon IoT. 这将验证集成是否按预期工作。

注意

要正式对设备进行 FreeRTOS 资格认证,必须使用 OTA PAL 和 OTA E2E 测试组验证设备移植的源代码。Amazon IoT Device Tester. 按照中的说明进行操作使用Amazon IoT Device Tester用于 FreeRTOS中的FreeRTOS 用户指南设置Amazon IoT Device Tester用于端口验证。要测试特定库的移植,必须在device.json中的文件Amazon IoT Device Tester configsfolder。

IoT 设备引导加载程序

必须提供自己的安全引导加载程序应用程序。确保设计和实施能够适当缓解安全威胁。以下是威胁模型供大家参考。

IoT 设备引导加载程序的威胁建模

背景

作为一个可行的定义,嵌入式Amazon IoT该威胁模型引用的设备是基于微控制器的产品,它们与云服务进行交互。它们可以部署在消费者、商业或工业环境中。IoT 设备可以收集有关用户、患者、机器或环境的数据,并且可以控制从灯泡和门锁到工厂机器的任何事物。

从假设对手的角度看,威胁建模是一种保护安全的方法。通过考虑对手的目标和方法,创建了一个威胁列表。威胁是对手对资源或资产发起的攻击。该列表具有优先级,并用于确定和创建缓解解决方案。在选择缓解解决方案时,实施和维护该解决方案的成本应与它提供的实际安全价值相平衡。可以使用多种威胁模型方法。每种方法可以支持开发安全且成功的Amazon IoT产品。

FreeRTOS 提供 OTA(无线)软件更新,Amazon IoT设备。更新工具将云服务与设备上的软件库和合作伙伴提供的引导加载程序结合使用。该威胁模型明确侧重于针对引导加载程序的威胁。

引导加载程序使用案例

  • 在部署之前对固件进行数字签名和加密。

  • 将新的固件映像部署到单个设备、一组设备或整个队列中。

  • 在新固件部署到设备之后,验证其真实性和完整性。

  • 设备仅运行来自受信任的来源的未修改软件。

  • 设备可以灵活处理通过 OTA 收到的故障软件。

数据流程图

威胁

有些攻击具有多种缓解模型;例如,网络 man-in-the-middle 可以在 TLS 服务器提供的证书和新固件映像的代码签名者证书中验证信任关系,以缓解旨在提供恶意固件映像的攻击。为了最大限度提高引导加载程序的安全性,任何非引导加载程序缓解解决方案都被视为不 引导加载程序应具有每种攻击的内在缓解解决方案。具有分层缓解解决方案被称为深防御。

威胁:

  • 攻击者劫持设备到服务器的连接以提供恶意固件映像。

    缓解措施示例

    • 在引导时,引导加载程序使用已知证书验证映像的加密签名。如果验证失败,引导加载程序将回滚到上一个映像。

  • 攻击者利用缓冲区溢出以将恶意行为引入到闪存中存储的现有固件映像。

    缓解措施示例

    • 在引导时,引导加载程序将按照上面所述进行验证。如果验证失败并且没有以前的映像,引导加载程序将停止。

    • 在引导时,引导加载程序将按照上面所述进行验证。如果验证失败并且没有以前的映像,引导加载程序将进入故障安全仅 OTA 模式。

  • 攻击者将设备引导到以前存储的映像,从而可以利用该映像发起攻击。

    缓解措施示例

    • 在成功安装和测试新映像后,将擦除存储上一个映像的闪存扇区。

    • 在每次成功升级时,都会熔断保险丝,每个映像将会重新熔断保险丝才能运行,除非已熔断正确数量的保险丝。

  • OTA 更新提供故障或恶意映像,从而导致设备无法正常运行。

    缓解措施示例

    • 引导加载程序启动硬件监视程序计时器,以触发回滚到上一个映像。

  • 攻击者修补引导加载程序以绕过映像验证,因此,设备将接受未签名的映像。

    缓解措施示例

    • 引导加载程序位于 ROM(只读存储器)中,无法进行修改。

    • 引导加载程序位于 OTP(一次性可编程存储器)中,无法进行修改。

    • 引导加载程序位于 ARM TrustZone 的安全区域中,无法进行修改。

  • 攻击者替换验证证书,因此,设备将接受恶意映像。

    缓解措施示例

    • 证书位于加密协处理器中,无法进行修改。

    • 证书位于 ROM、OTP 或安全区域中,无法进行修改。

进一步的威胁建模

该威胁模型仅考虑引导加载程序。进一步的威胁建模可能会提高整体安全性。建议的方法是列出对手的目标、这些目标针对的资产以及资产的入口点。可以考虑为控制资产而对入口点发起的攻击以创建威胁列表。以下是 IoT 设备的目标、资产和入口点示例列表。这些列表并非详尽无遗,旨在为您提供一些启发。

对手的目标

  • 敲诈钱财

  • 诋毁声誉

  • 伪造数据

  • 转移资源

  • 远程监视目标

  • 实际访问站点

  • 造成严重破坏

  • 灌输恐怖

主要资产

  • 私有密钥

  • 客户端证书

  • CA 根证书

  • 安全凭证和令牌

  • 客户的个人身份信息

  • 商业机密实施

  • 传感器数据

  • 云分析数据存储

  • 云基础设施

入口点

  • DHCP 响应

  • DNS 响应

  • 基于 TLS 的 MQTT

  • HTTPS 响应

  • OTA 软件映像

  • 应用程序指示的其他内容,例如 USB

  • 实际访问总线

  • 开封 IC