你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
设备更新安全模型
IoT 中心设备更新提供了一种安全的方法,可用于将设备固件、映像和应用程序的更新部署到 IoT 设备。 该工作流提供了一个端到端安全通道,其中包含一个完整的监管链模型,设备可使用该模型来证明更新受信任、未经修改和有意设计。
设备更新工作流中的每个步骤都通过各种安全功能和过程进行保护,以确保管道中的每个步骤都安全移交到下一个步骤。 设备更新代理参考代码可识别并正确管理任何非法更新请求。 参考代理还会检查每个下载,以确保内容受信任、未经修改,且属于意向性内容。
总结
将更新导入到设备更新实例时,服务将上传并检查更新二进制文件,以确保它们未被恶意用户修改或交换。 验证完成后,设备更新服务将生成包含导入清单和其他元数据的文件哈希的内部更新清单。 然后,设备更新服务对此更新清单进行签名。
导入到服务并存储在 Azure 中后,Azure 存储服务自动对更新二进制文件和关联的客户元数据进行静态加密。 设备更新服务不会自动提供额外的加密,但允许开发人员在内容到达设备更新服务之前自行对内容进行加密。
将更新从设备更新服务部署到设备时,会通过受保护的 IoT 中心通道将已签名的消息发送到设备。 设备的设备更新代理会将请求的签名验证为可信。
生成的任何二进制下载将通过验证更新清单签名来进行保护。 更新清单包含二进制文件哈希,因此,清单被信任后,设备更新代理即信任这些哈希,并将其与二进制文件进行匹配。 下载并验证了更新二进制文件后,会将其移交给设备上的安装程序。
实现详细信息
为了确保设备更新服务向下扩展到简单、低性能的设备,安全模型使用原始非对称密钥和原始签名。 它们使用基于 JSON 的格式,如 JSON Web 令牌和 JSON Web 密钥。
通过更新清单保护更新内容
使用两个签名来验证更新清单。 使用由“签名”密钥和“根”密钥组成的结构创建签名。
设备更新代理嵌入了公钥,用于所有设备更新兼容设备。 这些公钥是“根”密钥。 对应的私钥由 Microsoft 控制。
Microsoft 还会生成一个公钥/私钥对,其未包含在设备更新代理中或存储在设备上。 此密钥是“签名”密钥。
将更新导入到 IoT 中心的设备更新中时,服务将生成更新清单,服务使用签名密钥对清单进行签名,并包括签名密钥本身(由根密钥签名)。 将更新清单发送到设备时,设备更新代理会收到以下签名数据:
- 签名值本身。
- 用于生成 #1 的算法。
- 用于生成 #1 的签名密钥的公钥信息。
- #3 中的公共签名密钥的签名。
- 用于生成 #3 的根密钥的公钥 ID。
- 用于生成 #4 的算法。
设备更新代理使用上面定义的信息来验证公共签名密钥的签名是否由根密钥进行签名。 然后,设备更新代理会验证是否已通过签名密钥对更新清单签名进行签名。 如果所有签名均正确,则更新清单将受设备更新代理信任。 由于更新清单包含对应于更新文件本身的文件哈希,因此,如果哈希匹配,则更新文件也会受信任。
使用根密钥和签名密钥,Microsoft 可以定期滚动更新签名密钥,这是最佳安全做法。
JSON Web 签名 (JWS)
updateManifestSignature
用于确保 updateManifest
中包含的信息未被篡改。 updateManifestSignature
使用带有 JSON Web 密钥的 JSON Web 签名生成,用于进行来源验证。 签名是一个 Base64Url 编码字符串,包含三个部分,以“.”分隔。 有关分析和验证 JSON 密钥和令牌的信息,请参阅 jws_util.h 帮助器方法。
JSON Web 签名是一种广泛使用的建议 IETF 标准,用于使用基于 JSON 的数据结构对内容进行签名。 这是一种通过验证数据签名确保数据完整性的方法。 可以在 JSON Web 签名 (JWS) RFC 7515 中找到更多信息。
JSON Web 令牌
JSON Web 令牌是一种开放的行业标准方法,可用于在两方之间安全表示声明。
根密钥
每个设备更新设备必须包含一组根密钥。 对于所有设备更新的签名,这些密钥是信任的根。 任何签名都必须通过其中一个根密钥进行链接,才能被视为合法。
根密钥集会随时间而改变,因为为了安全起见,需要定期轮换签名密钥。 因此,需要按照设备更新团队指定的间隔,使用最新的一组根密钥来更新设备更新代理软件。 下一个计划的根密钥轮换将于 2025 年 5 月进行。
从设备更新代理版本 1.1.0 开始,每次将更新部署到该设备时,代理都会自动检查对根密钥所做的任何更改。 可能的更改:
- 新的根密钥可用。
- 现有根密钥被禁用(有效“吊销”),这意味着它不再对建立信任有效。
如果上述任一或两者均为 true,则设备更新代理将自动从 DU 服务下载新的 根密钥包。 此包包含所有根密钥的完整集,以及一个 已禁用的列表 ,其中包含有关哪些根密钥和/或签名密钥不再有效的信息。 根密钥包本身使用每个根密钥进行签名,以便可以从属于 DU 代理本身的原始根密钥以及随后下载的任何根密钥中建立包的信任。 验证过程完成后,将考虑信任任何新的根密钥,以便使用给定更新清单的签名密钥验证信任,而禁用列表中列出的任何根密钥或签名密钥不再信任该目的。
签名
所有签名都附带某个根密钥签名的签名密钥(公钥)。 该签名标识用于对签名密钥进行签名的根密钥。
设备更新代理必须首先验证签名密钥(公钥)的签名是否正确,是否有效,并由某个已批准的根密钥进行签名,对签名进行验证。 成功验证签名密钥后,可以使用现在受信任的签名公钥来验证签名本身。
签名密钥的轮换速度比根密钥快得多,因此消息会被各种不同的签名密钥进行签名。
签名密钥吊销由设备更新服务进行管理,因此用户不应尝试缓存签名密钥。 始终使用签名附带的签名密钥。
保护设备
务必确保设备上的设备更新相关安全资产得到适当的保护。 需要防止根密钥等资产被修改。 有多种方法可以保护根密钥,例如使用安全设备(TPM、SGX、HSM、其他安全设备),或者如同目前在参考实现中所做的那样,在设备更新代理中对其进行硬编码。 后者要求设备更新代理代码已进行数字签名,并且系统的代码完整性支持可防止恶意修改代理代码。
可以保证其他安全措施,例如确保以安全的方式执行从组件到组件的移交。 例如,注册特定的独立帐户以运行各种组件,并将基于网络的通信(例如 REST API 调用)限制为 localhost。