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

将密钥部署到 AWS IoT Greengrass 核心

此功能适用于 AWS IoT Greengrass Core v1.7 及更高版本。

通过 AWS IoT Greengrass,您可以从 Greengrass 设备对服务和应用程序进行身份验证,而无需对密码、令牌或其他密钥进行硬编码。

AWS Secrets Manager 是一项服务,您可以用它在云中安全地存储和管理密钥。AWS IoT Greengrass 将 Secrets Manager 扩展到 Greengrass 核心设备,从而使连接器和 Lambda 函数可以使用本地密钥与服务和应用程序交互。例如,Twilio 通知 连接器使用本地存储的身份验证令牌。

要将密钥集成到 Greengrass 组中,您需要创建一个引用 Secrets Manager 密钥的组资源。此密钥资源引用云密钥 ARN。要了解如何创建、管理和使用私有资源,请参阅使用密钥资源

AWS IoT Greengrass 对传输中的密钥和静态密钥进行加密。在组部署期间,AWS IoT Greengrass 从 Secrets Manager 提取密钥并在 Greengrass 核心上创建本地加密副本。在 Secrets Manager 中轮换您的云密钥后,重新部署组,将更新后的值传播到核心。

下图显示了将密钥部署到核心的简要过程。传输和静态中的密钥均经过加密。


            AWS IoT Greengrass 从 AWS Secrets Manager 中提取密钥并将其作为密钥资源部署到核心设备,其中,密钥可供连接器和 Lambda 函数使用。

通过 AWS IoT Greengrass 将密钥存储在本地具有以下优势:

  • 通过代码解耦(而非硬编码)。 这支持集中管理的凭证,并帮助保护敏感数据免受入侵的风险。

  • 适用于离线场景。 连接器和函数可以在 Internet 连接断开的情况下安全访问本地服务和软件。

  • 受控密钥访问。 只有组中经过授权的连接器和函数才可以访问您的密钥。AWS IoT Greengrass 使用私有密钥加密来保护您的密钥。传输和静态中的密钥均经过加密。有关更多信息,请参阅密钥加密

  • 受控轮换。 在 Secrets Manager 中轮换您的密钥后,重新部署 Greengrass 组以更新密钥的本地副本。有关更多信息,请参阅创建和管理密钥

    重要

    在轮换云版本后,AWS IoT Greengrass 不会自动更新本地密钥的值。要更新本地值,必须重新部署组。

密钥加密

AWS IoT Greengrass 对传输和静态中的密钥进行加密。

重要

确保您的用户定义的 Lambda 函数安全地处理密钥并且不记录存储在密钥中的任何敏感数据。有关更多信息,请参阅 AWS Secrets Manager 用户指南 中的降低记录和调试 Lambda 函数的风险。尽管本文档专门提到了轮换函数,但该建议也适用于 Greengrass Lambda 函数。

传输中加密

AWS IoT Greengrass 使用传输层安全性 (TLS) 来加密通过 Internet 和本地网络进行的所有通信。这样可以在传输中保护密钥,在从 Secrets Manager 检索密钥并将其部署到核心时会发生此类情况。有关支持的 TLS 密码套件,请参阅AWS IoT Greengrass 密码套件

静态加密

AWS IoT Greengrass 使用在 config.json 中指定的私有密钥对存储在核心中的密钥进行加密。因此,私有密钥的安全存储对于保护本地密钥至关重要。在 AWS 责任共担模式中,客户有责任保证私有密钥在核心设备上的安全存储。

AWS IoT Greengrass 支持两种私有密钥存储:

  • 使用硬件安全模块。有关更多信息,请参阅 硬件安全性集成

    注意

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

  • 使用文件系统权限(默认)。

私有密钥用于保护数据密钥,数据密钥用于加密本地密钥。数据密钥随每次组部署进行轮换。

AWS IoT Greengrass Core 是唯一有权访问私有密钥的实体。与密钥资源关联的 Greengrass 连接器或 Lambda 函数从核心获取密钥值。

要求

以下是本地密钥支持的要求:

  • 您必须使用 AWS IoT Greengrass 核心 v1.7 or later。

  • 要获得本地密钥的值,您的用户定义的 Lambda 函数必须使用 AWS IoT Greengrass Core 开发工具包 v1.3.0 or later。

  • 用于本地密钥加密的私有密钥必须在 Greengrass 配置文件中指定。默认情况下,AWS IoT Greengrass 使用存储在文件系统中的核心私有密钥。要提供您自己的私有密钥,请参阅指定用于密钥加密的私有密钥。仅支持 RSA 密钥类型。

    注意

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

  • 必须为 AWS IoT Greengrass 授予权限才能获取您的密钥值。这样,AWS IoT Greengrass 可以在组部署期间提取值。如果使用的是默认 Greengrass 服务角色,则 AWS IoT Greengrass 已经有权访问名称以 greengrass- 开头的密钥。要自定义访问权限,请参阅允许 AWS IoT Greengrass 获取密钥值

    注意

    我们建议您使用此命名约定来标识允许 AWS IoT Greengrass 访问的密钥,即使您自定义权限也是如此。控制台使用不同的权限来读取您的密钥,以便您在控制台中选择 AWS IoT Greengrass 无权提取的密钥。使用命名约定有助于避免权限冲突,这会导致部署错误。

指定用于密钥加密的私有密钥

在此过程中,您将提供用于本地秘密加密的私有密钥的路径。这必须是最小长度为 2048 位 RSA 密钥。有关 AWS IoT Greengrass Core 上使用的私有密钥的更多信息,请参阅AWS IoT Greengrass 核心安全委托人

AWS IoT Greengrass 支持两种模式的私有密钥存储:基于硬件或基于文件系统(默认)。有关更多信息,请参阅密钥加密

请仅在您想更改默认配置(其使用文件系统中的核心私有密钥)时,按照此过程操作。我们在编写这些步骤时假设您创建了组和核心,如入门教程中的模块 2 所述。

  1. 打开位于 /greengrass-root/config 目录中的 config.json 文件。

    注意

    greengrass-root 表示在您的设备上安装 AWS IoT Greengrass Core 软件的路径。如果您已按照入门教程中的步骤安装此软件,则安装位置为 /greengrass 目录。

  2. crypto.principals.SecretsManager 对象中,对于 privateKeyPath 属性,输入私有密钥的路径:

    • 如果您的私有密钥存储在文件系统中,请指定该密钥的绝对路径。例如:

      "SecretsManager" : { "privateKeyPath" : "file:///somepath/hash.private.key" }
    • 如果私有密钥存储在硬件安全模块 (HSM) 中,请使用 RFC 7512 PKCS#11 URI 方案指定路径:例如:

      "SecretsManager" : { "privateKeyPath" : "pkcs11:object=private-key-label;type=private" }

      有关更多信息,请参阅AWS IoT Greengrass 核心的硬件安全性配置

      注意

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

允许 AWS IoT Greengrass 获取密钥值

在此过程中,您将为允许 AWS IoT Greengrass 获取密钥值的 Greengrass 服务角色添加内联策略。

请仅在需要向 AWS IoT Greengrass 授予自定义密钥权限或 Greengrass 服务角色不包括 AWSGreengrassResourceAccessRolePolicy 托管策略时,才按照此过程操作。AWSGreengrassResourceAccessRolePolicy 授予对名称以 greengrass- 开头的密钥的访问权限。

  1. 运行以下 CLI 命令以获取 Greengrass 服务角色的 ARN:

    aws greengrass get-service-role-for-account --region 区域

    返回的 ARN 包含角色名称。

    { "AssociatedAt": "time-stamp", "RoleArn": "arn:aws-cn:iam::account-id:role/service-role/role-name" }

    您将在以下步骤中使用 ARN 或名称。

  2. 添加允许 secretsmanager:GetSecretValue 操作的内联策略。有关说明,请参阅IAM 用户指南中的添加和删除 IAM 策略

    您可以明确列出密钥或使用通配符 * 命名方案来授予细粒度访问权限,也可以授予对受版本控制或标记的密钥的有条件访问权限。例如,以下策略允许 AWS IoT Greengrass 仅读取指定的密钥。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "arn:aws-cn:secretsmanager:region:account-id:secret:greengrass-SecretA-abc", "arn:aws-cn:secretsmanager:region:account-id:secret:greengrass-SecretB-xyz" ] } ] }

    注意

    如果使用客户管理的 AWS KMS 密钥来加密密钥,则 Greengrass 服务角色还必须允许 kms:Decrypt 操作。

有关 Secrets Manager 的 IAM 策略的更多信息,请参阅AWS Secrets Manager 用户指南中的 AWS Secrets Manager 的身份验证和访问权限控制您可以在 IAM 策略或 AWS Secrets Manager 密钥策略中使用的操作、资源和上下文密钥

另请参阅