AWS IoT Greengrass
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

AWS IoT Greengrass 安全性

AWS IoT Greengrass 使用 X.509 证书、托管订阅、AWS IoT 策略以及 IAM 策略和角色来保护在本地 Greengrass 环境中的设备上运行的应用程序。

Greengrass 环境中的设备属于以下两种类别。两种设备类型都需要 AWS IoT 注册表中的条目、设备证书和 AWS IoT 策略。

  • AWS IoT Greengrass 核心。核心设备使用证书和策略安全连接到 AWS IoT。该证书和策略还使 AWS IoT Greengrass 能够将配置信息、Lambda 函数、连接器和托管订阅部署到核心设备。

  • 连接到 Greengrass 核心的 AWS IoT 设备。这些 Greengrass 设备使用证书和策略安全连接到 AWS IoT 和 AWS IoT Greengrass 服务。这使设备能够使用 Greengrass Discovery Service 查找并连接到核心设备。Greengrass 设备使用的是连接 AWS IoT 设备网关和核心设备所用的同一证书。

下图显示了 AWS IoT Greengrass 安全模型的组件:

A - Greengrass 服务角色

客户创建的 IAM 角色,该角色允许 AWS IoT Greengrass 访问您的 AWS IoT、Lambda 和其他 AWS 资源。有关更多信息,请参阅Greengrass 服务角色

B - 核心设备证书

用于对 AWS IoT Greengrass Core进行身份验证的 X.509 证书。

C - 设备证书

用于对 AWS IoT Greengrass 设备进行身份验证的 X.509 证书。

D - 组角色

在 AWS IoT Greengrass Core 上从 Lambda 函数或连接器调用 AWS 服务时,由 AWS IoT Greengrass 代入的客户创建的 IAM 角色。

这是核心上运行的所有 Greengrass Lambda 函数和连接器的 Lambda 执行角色。使用此角色可指定用户定义的 Lambda 函数和连接器访问 AWS 服务(例如 DynamoDB)时所需的访问权限。

注意

AWS IoT Greengrass 不使用该函数云版本的 AWS Lambda 中指定的 Lambda 执行角色。

E - 组 CA

一个根 CA 证书,供 AWS IoT Greengrass 设备在传输层安全 (TLS) 双向身份验证期间用来验证 AWS IoT Greengrass Core设备提供的证书。

配置 Greengrass 安全性

要配置您的 Greengrass 应用程序的安全性,请执行以下操作:

  1. 为您的 AWS IoT Greengrass Core设备创建 AWS IoT 事物。

  2. 为您的 AWS IoT Greengrass Core设备生成密钥对和设备证书。

  3. 创建 AWS IoT 策略并将其附加到设备证书。该证书和策略允许 AWS IoT Greengrass Core 设备访问 AWS IoT 和 AWS IoT Greengrass 服务。有关更多信息,请参阅AWS IoT Greengrass 核心设备的最低 AWS IoT 策略

  4. 创建 Greengrass 服务角色。此 IAM 角色授权 AWS IoT Greengrass 代表您访问来自其他 AWS 服务的资源。这允许 AWS IoT Greengrass 执行关键任务,如检索 AWS Lambda 函数和管理 AWS IoT 影子。您可以跨 AWS 区域使用同一个服务角色,但该角色必须与您使用 AWS IoT Greengrass 的每个 AWS 区域关联。有关更多信息,请参阅Greengrass 服务角色

  5. (可选) 创建 Greengrass 组角色。此 IAM 角色将为在 AWS IoT Greengrass Core上运行的 Lambda 函数和连接器授予调用 AWS 服务的权限。例如,Kinesis Firehose 连接器需要将记录写入到 Amazon Kinesis Data Firehose 传输流的权限。您将为每个 Greengrass 组创建单独的组角色。

  6. 为将连接到您的 AWS IoT Greengrass Core的每台设备创建 AWS IoT 事物。

  7. 为连接到您的 AWS IoT Greengrass Core的每台设备创建设备证书、密钥对和 AWS IoT 策略。

注意

您还可以使用现有 AWS IoT 事物和证书。

AWS IoT Greengrass 核心设备的最低 AWS IoT 策略

AWS IoT 策略定义了 AWS IoT 事物(在此示例中,为 Greengrass 核心设备)允许的一组操作。该策略将附加到设备证书,并用于访问 AWS IoT 和 AWS IoT Greengrass 服务。AWS IoT 策略是遵循 IAM 策略的约定的 JSON 文档。有关更多信息,请参阅 AWS IoT 开发人员指南 中的 AWS IoT 策略

以下示例策略包含为支持核心设备的基本 Greengrass 功能所需的一组最少操作。记下以下内容:

  • 该策略列出了核心设备可将消息发布到、订阅和从中接收消息的 MQTT 主题和主题筛选条件(包括用于影子状态的主题)。要支持在 AWS IoT、Lambda 函数、连接器和 Greengrass 组中的设备之间进行信息交换,请指定要允许的主题和主题筛选条件。有关更多信息,请参阅 AWS IoT 开发人员指南 中的发布/订阅策略示例

  • 该策略包含一个部分,该部分允许 AWS IoT 获取、更新和删除核心设备的阴影。要允许针对 Greengrass 组中的其他设备的阴影同步,请在 Resource 列表中指定目标 ARN(例如,arn:aws-cn:iot:区域:account-id:thing/device-name)。

  • 对于 greengrass:UpdateCoreDeploymentStatus 权限,Resource ARN 中的最终段是核心设备的 URL 编码的 ARN。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "iot:Publish", "iot:Subscribe", "iot:Receive" ], "Resource": [ "arn:aws-cn:iot:区域:account-id:topicfilter/$aws/things/core-name-*", "arn:aws-cn:iot:区域:account-id:topic/$aws/things/core-name-*" ] }, { "Effect": "Allow", "Action": [ "iot:GetThingShadow", "iot:UpdateThingShadow", "iot:DeleteThingShadow" ], "Resource": [ "arn:aws-cn:iot:区域:account-id:thing/core-name-*" ] }, { "Effect": "Allow", "Action": [ "greengrass:AssumeRoleForGroup", "greengrass:CreateCertificate" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "greengrass:GetDeployment" ], "Resource": [ "arn:aws-cn:greengrass:区域:account-id:/greengrass/groups/group-id/deployments/*" ] }, { "Effect": "Allow", "Action": [ "greengrass:GetDeploymentArtifacts" ], "Resource": [ "arn:aws-cn:greengrass:区域:account-id:/greengrass/groups/group-id/deployments/*" ] }, { "Effect": "Allow", "Action": [ "greengrass:UpdateCoreDeploymentStatus" ], "Resource": [ "arn:aws-cn:greengrass:区域:account-id:/greengrass/groups/group-id/deployments/*/cores/arn%3Aaws%3Aiot%3A区域%3Aaccount-id%3Athing%2Fcore-name" ] }, { "Effect": "Allow", "Action": [ "greengrass:GetConnectivityInfo", "greengrass:UpdateConnectivityInfo" ], "Resource": [ "arn:aws-cn:iot:区域:account-id:thing/core-name" ] } ] }

在 AWS IoT 控制台上,您可以轻松查看和编辑附加到核心的证书的策略。

  1. 在导航窗格中,依次选择 Manage (管理)Things (事物) 和核心。

  2. 在核心的配置页面上,选择 Security (安全性)

  3. Certificates (证书) 页面上,选择您的证书。

  4. 在证书的配置页面上,选择 Policies (策略),然后选择该策略。

    如果要编辑策略,请选择 Edit policy document (编辑策略文档)

AWS IoT Greengrass 核心安全委托人

AWS IoT Greengrass Core使用以下安全委托人:AWS IoT 客户端、本地 MQTT 服务器和本地密钥管理器。这些委托人的配置存储在 config.json 配置文件的 crypto 对象中。有关更多信息,请参阅 AWS IoT Greengrass 核心配置文件

此配置包含用于身份验证和加密的主要组件使用的私有密钥的路径。AWS IoT Greengrass 支持两种模式的私有密钥存储:基于硬件或基于文件系统(默认)。有关在硬件安全模块上存储密钥的更多信息,请参阅硬件安全性集成

AWS IoT 客户端

AWS IoT 客户端管理 Greengrass 核心与 AWS IoT 之间通过 Internet 进行的通信。AWS IoT Greengrass 将 X.509 证书与公有和私有密钥一起使用,以便在为此通信建立 TLS 连接时实现双向身份验证。有关更多信息,请参阅 AWS IoT 开发人员指南 中的 X.509 证书和 AWS IoT

该 IoT 客户端支持 RSA 和 EC 证书和密钥。该证书和私有密钥是为 config.json 中的 IoTCertificate 委托人指定的。

MQTT 服务器

本地 MQTT 服务器管理 Greengrass 核心与该组中其他 Greengrass 设备之间通过本地网络进行的通信。AWS IoT Greengrass 将X.509 证书与公有和私有密钥一起,以便在为此通信建立 TLS 连接时实现双向身份验证。

默认情况下,AWS IoT Greengrass 会为您生成一个 RSA 私有密钥。要将核心配置为使用其他私有密钥,您必须为 config.json 中的 MQTTServerCertificate 委托人提供关键路径。

私有密钥支持

RSA 密钥 EC 密钥
密钥类型 支持 支持
关键参数 最小长度为 2048 位 NIST P-256 或 NIST P-384 曲线
磁盘格式 PKCS#1、PKCS#8 SECG1、PKCS#8
最低 GGC 版本
  • 使用默认 RSA 密钥:1.0

  • 指定 RSA 密钥:1.7

  • 指定 EC 密钥:1.9

私有密钥的配置决定了相关过程。有关 Greengrass 核心作为服务器支持的密码套件的列表,请参阅 AWS IoT Greengrass 密码套件

如果未指定私有密钥(默认)
  • AWS IoT Greengrass 基于轮换设置来轮换密钥。

  • 核心生成一个 RSA 密钥,用于生成证书。

  • MQTT 服务器证书包含一个 RSA 公有密钥和一个 SHA-256 RSA 签名。

如果指定了 RSA 私有密钥(需要 GGC v1.7 or later)
  • 您负责轮换密钥。

  • 核心使用指定密钥来生成证书。

  • RSA 密钥的最小长度必须为 2048 位。

  • MQTT 服务器证书包含一个 RSA 公有密钥和一个 SHA-256 RSA 签名。

如果指定了 EC 私有密钥(需要 GGC v1.9)
  • 您负责轮换密钥。

  • 核心使用指定密钥来生成证书。

  • EC 私有密钥必须使用 NIST P-256 或 NIST P-384 曲线。

  • MQTT 服务器证书包含一个 EC 公有密钥和一个 SHA-256 RSA 签名。

    核心提供的 MQTT 服务器证书包含一个 SHA-256 RSA 签名,无理论密钥类型如何。因此,客户端必须支持 SHA-256 RSA 证书验证才能与核心建立安全连接。

Secrets Manager

本地密钥管理器安全地管理您在 AWS Secrets Manager 中创建的密钥的本地副本。它使用私有密钥来保护用于对密钥进行加密的数据密钥。有关更多信息,请参阅 将密钥部署到 AWS IoT Greengrass 核心

默认情况下将使用 IoT 客户端私有密钥,但您可以为 config.json 中的 SecretsManager 委托人指定其他私有密钥。仅支持 RSA 密钥类型。有关更多信息,请参阅 指定用于密钥加密的私有密钥

注意

目前,AWS IoT Greengrass 仅支持 PKCS#1 v1.5 填充机制,该机制用于在使用基于硬件的私有密钥时加密和解密本地密钥。如果您按照供应商提供的说明手动生成基于硬件的私有密钥,请确保选择 PKCS#1 v1.5。AWS IoT Greengrass 不支持最优非对称加密填充 (OAEP)。

私有密钥支持

RSA 密钥 EC 密钥
密钥类型 支持 不支持
关键参数 最小长度为 2048 位 不适用
磁盘格式 PKCS#1、PKCS#8 不适用
最低 GGC 版本 1.7 不适用

设备连接工作流程

本节介绍设备如何连接到 AWS IoT Greengrass 云服务和 AWS IoT Greengrass Core设备。

  • AWS IoT Greengrass Core设备使用其设备证书、私有密钥和 AWS IoT 根 CA 证书连接到 Greengrass 云服务。

  • AWS IoT Greengrass Core设备从 Greengrass 服务下载组成员资格信息。

  • 当针对 AWS IoT Greengrass Core设备进行部署时,设备证书管理器 (DCM) 将为 AWS IoT Greengrass Core设备处理证书管理。

  • AWS IoT 设备使用其设备证书、私有密钥和 AWS IoT 根 CA 连接到 Greengrass 云服务。连接后,AWS IoT 设备将使用 Greengrass Discovery Service 查找其 AWS IoT Greengrass Core设备的 IP 地址。该设备还可下载组的根 CA 证书,该证书可用于对 Greengrass 核心设备进行身份验证。

  • AWS IoT 设备尝试连接到 AWS IoT Greengrass Core,并传递其设备证书和客户端 ID。如果客户端 ID 与设备的事物名称匹配并且证书有效,则将进行连接。否则,将终止连接。

Greengrass 消息收发工作流程

AWS IoT Greengrass 使用订阅表来定义如何在 Greengrass 组中的设备、函数和连接器之间交换 MQTT 消息以及如何与 AWS IoT 或本地影子服务交换 MQTT 消息。每个订阅都指定了发送或接收消息所借助的源、目标和 MQTT 主题。仅当定义了相应的订阅时,AWS IoT Greengrass 才允许将消息从源发送到目标。

订阅仅定义从源到目标的单向消息流。要支持双向消息交换,您必须创建两个订阅,每个订阅针对一个方向。

MQTT 核心服务器上的证书轮换

Greengrass 设备使用 MQTT 核心服务器证书向 Greengrass 核心设备进行身份验证。 默认情况下,此证书将在 7 天后到期。出于安全考虑,其生命周期受限,因此,如果未授权方获得此证书,将无法长期使用。

要进行证书轮换,启用 Greengrass 的设备必须在线并能够定期直接访问 Greengrass 云服务。当证书过期后,Greengrass 核心设备将尝试连接到 Greengrass 云服务以获取新证书。如果连接成功,核心设备将下载新的 MQTT 核心服务器证书并重新启动本地 MQTT 服务。此时,连接到核心的所有 Greengrass 设备都将断开。如果设备在过期时处于离线状态,它不会接收替换证书。任何新的连接到核心服务的尝试都会被拒绝。现有连接不会受影响。设备将无法连接到核心,直至恢复了到 Greengrass 云服务的连接,并且可以下载新的 MQTT 核心服务器证书。

您可以将过期时间设置为 7 天到 30 天之间的任何值,具体取决于您的需要。轮换越频繁,就需要越频繁地进行云连接。轮换频率较低可能会带来安全问题。如果您要将证书过期时间值设置为高于 30 天,请联系 AWS Support。

当 MQTT 核心服务器证书过期后,所有验证证书的尝试都将失败。设备必须能够检测故障并终止连接。

AWS IoT Greengrass 密码套件

AWS IoT Greengrass 使用 AWS IoT 传输安全模型通过 TLS 密码套件来加密与云的通信。此外,AWS IoT Greengrass 数据还采用静态时加密(在云中)。有关 AWS IoT 传输安全及支持的密码包的更多信息,请参阅 AWS IoT 开发人员指南中的传输安全

用于本地网络通信的受支持密码套件

与 AWS IoT 云相反,AWS IoT Greengrass Core对证书签名算法支持以下本地网络 TLS 密码套件。当私有密钥存储在文件系统上时,所有这些密码套件都受支持。当核心被配置为使用硬件安全模块 (HSM) 时,子集将受支持。有关更多信息,请参阅 AWS IoT Greengrass 核心安全委托人硬件安全性集成。该表还包含支持所需的最低 AWS IoT Greengrass 核心软件版本。

密码 HSM 支持 最低 GGC 版本
TLSv1.2 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 支持 1.0
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 支持 1.0
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 支持 1.0
TLS_RSA_WITH_AES_128_CBC_SHA 不支持 1.0
TLS_RSA_WITH_AES_128_GCM_SHA256 不支持 1.0
TLS_RSA_WITH_AES_256_CBC_SHA 不支持 1.0
TLS_RSA_WITH_AES_256_GCM_SHA384 不支持 1.0
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 支持 1.9
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 支持 1.9
TLSv1.1 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 支持 1.0
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 支持 1.0
TLS_RSA_WITH_AES_128_CBC_SHA 不支持 1.0
TLS_RSA_WITH_AES_256_CBC_SHA 不支持 1.0
TLSv1.0 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 支持 1.0
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 支持 1.0
TLS_RSA_WITH_AES_128_CBC_SHA 不支持 1.0
TLS_RSA_WITH_AES_256_CBC_SHA 不支持 1.0