AWS IoT Greengrass 的设备身份验证和授权 - AWS IoT Greengrass
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

AWS IoT Greengrass 的设备身份验证和授权

AWS IoT Greengrass 环境中的设备使用 X.509 证书进行身份验证,使用 AWS IoT 策略进行授权。证书和策略可让设备在彼此之间以及与 AWS IoT Core 和 AWS IoT Greengrass 之间安全地相互连接。

X.509 证书属于数字证书,它按照 X.509 公有密钥基础设施标准将公有密钥与证书所含的身份相关联。X.509 证书由一家名为证书颁发机构 (CA) 的可信实体颁发。CA 持有一个或多个名为 CA 证书的特殊证书,它使用这种证书来颁发 X.509 证书。只有证书颁发机构才有权访问 CA 证书。

AWS IoT 策略定义允许 AWS IoT 设备执行的操作集。具体而言,它们允许和拒绝访问 AWS IoT Core 和 AWS IoT Greengrass 数据层面操作,如发布 MQTT 消息和检索设备影子。

所有设备都需要在 AWS IoT Core 注册表中有条目,并且需要带附加 AWS IoT 策略的已激活的 X.509 证书。设备分为两类:

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

  • 连接到 Greengrass 核心的设备。这些连接设备(也称为 Greengrass 设备)使用证书和策略来连接到 AWS IoT Core 和 AWS IoT Greengrass 服务。这使设备能够使用 AWS IoT Greengrass 发现服务查找并连接到核心设备。Greengrass 设备使用的是连接到 AWS IoT Core 设备网关和核心设备所用的同一证书。设备还使用发现信息与核心设备进行双向身份验证。有关更多信息,请参阅 设备连接工作流程使用 Greengrass 核心管理设备身份验证

X.509 证书

核心设备和连接设备之间以及设备和 AWS IoT Core 或 AWS IoT Greengrass 之间的通信必须经过身份验证。此双向身份验证基于注册的 X.509 设备证书和加密密钥。

在 AWS IoT Greengrass 环境中,设备对以下传输层安全性 (TLS) 连接使用带有公钥和私钥的证书:

  • 通过互联网连接到 AWS IoT Core 和 AWS IoT Greengrass 的 Greengrass 核心上的 AWS IoT 客户端组件。

  • 通过互联网连接到 AWS IoT Greengrass 以获取核心发现信息的 Greengrass 连接设备。

  • 通过本地网络连接到组中的 Greengrass 设备的 Greengrass 核心上的 MQTT 服务器组件。

AWS IoT Greengrass Core设备在两个位置存储证书:

  • 核心设备证书 /greengrass-root/certs。通常,核心设备证书 hash.cert.pem (例如, 86c84488a5.cert.pem)。当核心连接到 AWS IoT Core 和 AWS IoT Greengrass 服务时,AWS IoT 客户端将使用此证书进行相互身份验证。

  • 中的MQTT服务器证书 /greengrass-root/ggc/var/state/server。MQTT服务器证书已命名 server.crt。此证书用于本地MQTT服务器(位于Greengrass核心上)和Greengrass设备之间的相互身份验证。

    注意

    greengrass-root 表示在您的设备上安装 AWS IoT Greengrass 核心软件的路径。通常,这是 /greengrass 目录。

有关更多信息,请参阅 AWS IoT Greengrass 核心安全委托人

证书颁发机构 (CA) 证书

核心设备和 Greengrass 连接设备将下载用于使用 AWS IoT Core 和 AWS IoT Greengrass 服务进行身份验证的根 CA 证书。我们建议您使用 Amazon Trust Services (ATS) 根 CA 证书,如 Amazon Root CA 1。有关更多信息,请参阅 AWS IoT Core 开发人员指南 中的用于服务器身份验证的 CA 证书

注意

您的根 CA 证书类型必须与终端节点匹配。使用具有 ATS 终端节点的 ATS 根 CA 证书(首选)或具有旧终端节点的 VeriSign 根 CA 证书。只有部分 AWS 区域支持传统终端节点。有关更多信息,请参阅 服务终端节点必须与根 CA 证书类型匹配

Greengrass 连接设备还将下载 Greengrass 组 CA 证书。这用于在双向身份验证期间验证 Greengrass 核心上的 MQTT 服务器证书。有关更多信息,请参阅 设备连接工作流程。MQTT 服务器证书的默认期限为 7 天。

本地 MQTT 服务器上的证书轮换

Greengrass 连接设备使用本地 MQTT 服务器证书与 Greengrass 核心设备进行双向身份验证。默认情况下,此证书将在 7 天后过期。此时间期限基于安全最佳实践。MQTT 服务器证书由存储在云中的组 CA 证书签署。

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

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

在 AWS IoT 控制台 中,您可以在组的 Settings (设置) 页面管理证书。在 AWS IoT Greengrass API 中,您可以使用 UpdateGroupCertificateConfiguration 操作。

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

数据层面操作的 AWS IoT 策略

使用 AWS IoT 策略授权对 AWS IoT Core 和 AWS IoT Greengrass 数据层面的访问。AWS IoT Core 数据层面由设备、用户和应用程序的操作组成,如连接到 AWS IoT Core 和订阅主题。AWS IoT Greengrass 数据层面由 Greengrass 设备的操作组成,如检索部署和更新连接信息。

AWS IoT 策略是一个与 IAM 策略类似的 JSON 文档。它包含一个或多个策略语句,用于指定以下属性:

  • Effect。访问模式:AllowDeny

  • Action。策略允许或拒绝的操作的列表。

  • Resource。允许或拒绝对其执行操作的资源的列表。

有关更多信息,请参阅 AWS IoT Core 开发人员指南 中的 AWS IoT 策略AWS IoT 策略操作

 

AWS IoT Greengrass 策略操作

Greengrass 核心操作

AWS IoT Greengrass 定义 Greengrass 核心设备可以在 AWS IoT 策略中使用的以下策略操作:

greengrass:AssumeRoleForGroup

Greengrass 核心设备使用 Token Exchange Service (TES) 系统 Lambda 功能检索凭证的权限。绑定到检索到的凭证的权限基于附加到已配置组角色的策略。

当 Greengrass 核心设备尝试检索凭证时(假设凭证未在本地缓存),将检查此权限。

greengrass:CreateCertificate

Greengrass 核心设备创建自己的服务器证书的权限。

当 Greengrass 核心设备创建证书时,将检查此权限。Greengrass 核心设备尝试在第一次运行时、当核心的连接信息更改时,以及在指定的轮换周期内创建服务器证书。

greengrass:GetConnectivityInfo

Greengrass 核心设备检索自己的连接信息的权限。

当 Greengrass 核心设备尝试从 AWS IoT Core 检索其连接信息时,将检查此权限。

greengrass:GetDeployment

Greengrass 核心设备检索部署的权限。

当 Greengrass 核心设备尝试从云中检索部署和部署状态时,将检查此权限。

greengrass:GetDeploymentArtifacts

Greengrass 核心设备检索部署构件(如组信息或 Lambda 函数)的权限。

当 Greengrass 核心设备接收部署,然后尝试检索部署构件时,将检查此权限。

greengrass:UpdateConnectivityInfo

Greengrass 核心设备使用 IP 或主机名信息更新自己的连接信息的权限。

当 Greengrass 核心设备尝试更新云中的连接信息时,将检查此权限。

greengrass:UpdateCoreDeploymentStatus

Greengrass 核心设备更新部署状态的权限。

当 Greengrass 核心设备接收部署,然后尝试更新部署状态时,将检查此权限。

 

Greengrass 设备操作

AWS IoT Greengrass 定义 Greengrass 设备可以在 AWS IoT 策略中使用的以下策略操作:

greengrass:Discover

Greengrass 设备使用发现 API 检索其组的核心连接信息和组证书颁发机构的权限。

当 Greengrass 设备通过 TLS 双向身份验证调用发现 API 时,将检查此权限。

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

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

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

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

  • 不支持在核心设备的 AWS IoT 策略中使用事物策略变量 (iot:Connection.Thing.*)。核心使用相同的设备证书与 AWS IoT Core 建立多个连接,但是连接中的客户端 ID 可能与核心事物名称不完全匹配。

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

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "iot:Publish", "iot:Receive" ], "Resource": [ "arn:aws-cn:iot:区域:account-id:topic/$aws/things/core-name-*" ] }, { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws-cn:iot:区域:account-id:topicfilter/$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%3Aregion%3Aaccount-id%3Athing%2Fcore-name" ] }, { "Effect": "Allow", "Action": [ "greengrass:GetConnectivityInfo", "greengrass:UpdateConnectivityInfo" ], "Resource": [ "arn:aws-cn:iot:区域:account-id:thing/core-name" ] } ] }
注意

已连接的 Greengrass 设备的 AWS IoT 策略通常需要 iot:Connectiot:Publishiot:Receiveiot:Subscribe 操作的类似权限。

要允许设备自动检测设备所属 Greengrass 组中核心的连接信息,已连接设备的 AWS IoT 策略必须包含 greengrass:Discover 操作。在 Resource 部分中,指定已连接设备的 ARN,而不是 Greengrass 核心设备的 ARN。例如:

{ "Effect": "Allow", "Action": [ "greengrass:Discover" ], "Resource": [ "arn:aws-cn:iot:区域:account-id:thing/device-name" ] }

已连接设备的 AWS IoT 策略通常不需要 iot:GetThingShadowiot:UpdateThingShadowiot:DeleteThingShadow 操作的权限,因为 Greengrass 核心会处理已连接设备的影子同步操作。在这种情况下,请确保核心的 AWS IoT 策略中针对影子操作的 Resource 部分包含已连接设备的 ARN。

 

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

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

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

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

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

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