将密钥部署到 AWS IoT Greengrass 核心 - AWS IoT Greengrass

AWS IoT Greengrass Version 1 于 2023 年 6 月 30 日进入延长使用寿命阶段。有关更多信息,请参阅 AWS IoT Greengrass V1维护策略。在此日期之后,AWS IoT Greengrass V1 不再发布更新来提供新功能、功能增强、错误修复或安全补丁。在 AWS IoT Greengrass V1 上运行的设备不会受到干扰,并且将继续运行并连接到云。我们强烈建议您迁移到 AWS IoT Greengrass Version 2,从而添加重要的新功能支持更多平台

将密钥部署到 AWS IoT Greengrass 核心

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

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

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

要将密钥集成到 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 密码套件,请参阅TLS 密码套件支持

静态加密

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 核心是唯一有权访问私有密钥的实体。与密钥资源关联的 Greengrass 连接器或 Lambda 函数从核心获取密钥值。

要求

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

  • 您必须使用 AWS IoT Greengrass Core v1.7 或更高版本。

  • 要获取本地密钥的值,用户定义的 Lambda 函数必须使用 AWS IoT Greengrass Core SDK 1.3.0 或更高版本。

  • 用于本地密钥加密的私有密钥必须在 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 核心上使用的私有密钥的更多信息,请参阅 AWS IoT Greengrass 核心安全委托人

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

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

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

    注意

    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 region

    返回的 ARN 包含角色名称。

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

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

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

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

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

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

有关密钥管理器的 IAM policy 的详细信息,请参阅《AWS Secrets Manager 用户指南》中的 AWS Secrets Manager 的身份验证和访问控制以及可以在 IAM policy 或密钥策略中针对 AWS Secrets Manager 使用的操作、资源和上下文密钥

另请参阅