硬件安全性集成 - 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 酷睿 v1.7 及更高版本。

AWS IoT Greengrass 支持通过 PKCS#11 接口使用硬件安全模块 (HSM) 来安全存储和卸载私钥。这样可防止密钥在软件中暴露或重复。私钥可以安全地存储在硬件模块上HSMs,例如可信平台模块 (TPM) 或其他加密元素。

AWS Partner 设备目录中搜索符合此功能条件的设备。

下图显示了内 AWS IoT Greengrass 核的硬件安全架构。

AWS IoT Greengrass Core architecture with hardware security and message routing to AWS IoT Core and local devices.

在标准安装中, AWS IoT Greengrass 使用两个私钥。当 Greengrass 内核连接时,客户 AWS IoT 端(物联网客户端)组件在传输层安全 (TLS) 握手期间使用一个密钥。 AWS IoT Core(此密钥也称为核心私有密钥。) 另一个密钥由本地MQTT服务器使用,这使Greengrass设备能够与Greengrass核心进行通信。如果您要为这两个组件使用硬件安全性,可以使用共享私有密钥或单独的私有密钥。有关更多信息,请参阅 AWS IoT Greengrass 硬件安全的配置实践

注意

对于标准安装,本地 Secrets Manager 还对其加密过程使用 IoT 客户端密钥,但您可以使用您自己的私有密钥。它必须是最小长度为 2048 位的RSA密钥。有关更多信息,请参阅 指定用于密钥加密的私有密钥

要求

在为 Greengrass 核心配置硬件安全性之前,您必须具备以下对象:

  • 硬件安全模块 (HSM),支持物联网客户端、本地MQTT服务器和本地密钥管理器组件的目标私钥配置。该配置可以包含一个、两个或三个基于硬件的私有密钥,具体取决于您是否配置组件共享密钥。有关私有密钥支持的更多信息,请参阅 AWS IoT Greengrass 核心安全主体

    • 对于RSA密钥:RSA-2048 密钥大小(或更大)和 PKCS#1 v1.5 签名方案。

    • 对于 EC 按键:NISTP-256 或 NIST P-384 曲线。

    注意

    AWS Partner 设备目录中搜索符合此功能条件的设备。

  • 一个 PKCS #11 提供程序库,可在运行时加载(使用 libdl),并提供 PKCS#11 函数。

  • 硬件模块必须可通过 slot 标签进行解析,如 PKCS #11 规范中所定义。

  • 必须使用供应商提供的配置工具生成私钥并将其加载到上。HSM

  • 私有密钥必须由对象标签来解析。

  • 核心设备证书。这是与私有密钥对应的 IoT 客户端证书。

  • 如果你使用的是 G OTA reengrass 更新代理,则必须安装 Ope SSLn PKCS libp11 #11 包装器库。有关更多信息,请参阅 配置对 over-the-air 更新的支持

此外,确保满足以下条件:

  • 与私钥关联的 IoT 客户端证书已在中注册 AWS IoT 并激活。你可以在 AWS IoT 控制台的 “管理” 下进行验证,展开 “所有设备”,选择 “事物”,然后为核心内容选择 “证书” 选项卡。

  • AWS IoT Greengrass 核心软件 v1.7 或更高版本安装在核心设备上,如入门教程的模块 2 中所述。需要版本 1.9 或更高版本才能使用MQTT服务器的 EC 密钥。

  • 将证书附加到 Greengrass 核心。您可以从 AWS IoT 控制台的核心内容的 “管理” 页面进行验证。

注意

目前, AWS IoT Greengrass 不支持直接从加载 CA 证书或 IoT 客户端证书HSM。证书必须以纯文本文件形式加载到文件系统中 Greengrass 可读取的位置。

内 AWS IoT Greengrass 核的硬件安全配置

硬件安全性在 Greengrass 配置文件中进行配置。这是 config.json 文件(位于 /greengrass-root/config 目录中)。

注意

要详细了解使用纯软件实现设置HSM配置的过程,请参阅模块 7:模拟硬件安全集成

重要

示例中的模拟配置不提供任何安全优势。它旨在让您了解 PKCS #11 规范,如果您计划将来使用基于硬件HSM的软件,则可以对您的软件进行初步测试。

要在中配置硬件安全 AWS IoT Greengrass,请在中编辑crypto对象config.json

使用硬件安全时,该crypto对象用于指定内核上 PKCS #11 提供程序库的证书、私钥和资产的路径,如以下示例所示。

"crypto": { "PKCS11" : { "OpenSSLEngine" : "/path-to-p11-openssl-engine", "P11Provider" : "/path-to-pkcs11-provider-so", "slotLabel" : "crypto-token-name", "slotUserPin" : "crypto-token-user-pin" }, "principals" : { "IoTCertificate" : { "privateKeyPath" : "pkcs11:object=core-private-key-label;type=private", "certificatePath" : "file:///path-to-core-device-certificate" }, "MQTTServerCertificate" : { "privateKeyPath" : "pkcs11:object=server-private-key-label;type=private" }, "SecretsManager" : { "privateKeyPath": "pkcs11:object=core-private-key-label;type=private" } }, "caPath" : "file:///path-to-root-ca"

crypto 对象包含以下属性:

字段 描述 注意
caPath

AWS IoT 根 CA 的绝对路径。

必须是格式为:URI的文件file:///absolute/path/to/file

PKCS11
OpenSSLEngine

可选。在 Open 上启用 PKCS #11 支持的 Open SSL 引擎.so文件的绝对路径SSL。

必须是文件系统上的文件的路径。

如果您使用的是具有硬件安全性的 G OTA reengrass 更新代理,则此属性是必需的。有关更多信息,请参阅 配置对 over-the-air 更新的支持

P11Provider

PKCS#11 实现的 libdl-loadable 库的绝对路径。

必须是文件系统上的文件的路径。

slotLabel

用于标识硬件模块的槽标签。

必须符合 PKCS #11 标签规范。

slotUserPin

用于向模块PIN对 Greengrass 核心进行身份验证的用户。

必须具有足够的权限才能使用配置的私有密钥执行 C_Sign。

principals
IoTCertificate 核心用于向 AWS IoT发出请求的证书和私有密钥。
IoTCertificate  .privateKeyPath

核心私有密钥的路径。

对于文件系统存储,必须是格式为:URI的文件file:///absolute/path/to/file

要进行HSM存储,必须是指定对象标签的 RFC7512 PKCS #11 路径。

IoTCertificate  .certificatePath

核心设备证书的绝对路径。

必须是格式为:URI的文件file:///absolute/path/to/file

MQTTServerCertificate

可选。内核与证书结合使用的私钥,用作MQTT服务器或网关。

MQTTServerCertificate  .privateKeyPath

本地MQTT服务器私钥的路径。

使用此值为本地MQTT服务器指定您自己的私钥。

对于文件系统存储,必须是格式为:URI的文件file:///absolute/path/to/file

要进行HSM存储,必须是指定对象标签的 RFC7512 PKCS #11 路径。

如果省略此属性,则根据您的 AWS IoT Greengrass 旋转设置旋转密钥。如果指定,客户将负责对密钥进行轮换。

SecretsManager 保护用于加密的数据密钥的私有密钥。有关更多信息,请参阅 将密钥部署到 AWS IoT Greengrass 核心
SecretsManager  .privateKeyPath

本地 Secrets Manager 私有密钥的路径。

仅支持RSA密钥。

对于文件系统存储,必须是格式为:URI的文件file:///absolute/path/to/file

要进行HSM存储,必须是指定对象标签的 RFC7512 PKCS #11 路径。私钥必须使用 PKCS#1 v1.5 填充机制生成。

字段 描述 注意
caPath

AWS IoT 根 CA 的绝对路径。

必须是格式为:URI的文件file:///absolute/path/to/file

PKCS11
OpenSSLEngine

可选。在 Open 上启用 PKCS #11 支持的 Open SSL 引擎.so文件的绝对路径SSL。

必须是文件系统上的文件的路径。

如果您使用的是具有硬件安全性的 G OTA reengrass 更新代理,则此属性是必需的。有关更多信息,请参阅 配置对 over-the-air 更新的支持

P11Provider

PKCS#11 实现的 libdl-loadable 库的绝对路径。

必须是文件系统上的文件的路径。

slotLabel

用于标识硬件模块的槽标签。

必须符合 PKCS #11 标签规范。

slotUserPin

用于向模块PIN对 Greengrass 核心进行身份验证的用户。

必须具有足够的权限才能使用配置的私有密钥执行 C_Sign。

principals
IoTCertificate 核心用于向 AWS IoT发出请求的证书和私有密钥。
IoTCertificate  .privateKeyPath

核心私有密钥的路径。

对于文件系统存储,必须是格式为:URI的文件file:///absolute/path/to/file

要进行HSM存储,必须是指定对象标签的 RFC7512 PKCS #11 路径。

IoTCertificate  .certificatePath

核心设备证书的绝对路径。

必须是格式为:URI的文件file:///absolute/path/to/file

MQTTServerCertificate

可选。内核与证书结合使用的私钥,用作MQTT服务器或网关。

MQTTServerCertificate  .privateKeyPath

本地MQTT服务器私钥的路径。

使用此值为本地MQTT服务器指定您自己的私钥。

对于文件系统存储,必须是格式为:URI的文件file:///absolute/path/to/file

要进行HSM存储,必须是指定对象标签的 RFC7512 PKCS #11 路径。

如果省略此属性,则根据您的 AWS IoT Greengrass 旋转设置旋转密钥。如果指定,客户将负责对密钥进行轮换。

SecretsManager 保护用于加密的数据密钥的私有密钥。有关更多信息,请参阅 将密钥部署到 AWS IoT Greengrass 核心
SecretsManager  .privateKeyPath

本地 Secrets Manager 私有密钥的路径。

仅支持RSA密钥。

对于文件系统存储,必须是格式为:URI的文件file:///absolute/path/to/file

要进行HSM存储,必须是指定对象标签的 RFC7512 PKCS #11 路径。私钥必须使用 PKCS#1 v1.5 填充机制生成。

字段 描述 注意
caPath

AWS IoT 根 CA 的绝对路径。

必须是格式为:URI的文件file:///absolute/path/to/file

PKCS11
OpenSSLEngine

可选。在 Open 上启用 PKCS #11 支持的 Open SSL 引擎.so文件的绝对路径SSL。

必须是文件系统上的文件的路径。

如果您使用的是具有硬件安全性的 G OTA reengrass 更新代理,则此属性是必需的。有关更多信息,请参阅 配置对 over-the-air 更新的支持

P11Provider

PKCS#11 实现的 libdl-loadable 库的绝对路径。

必须是文件系统上的文件的路径。

slotLabel

用于标识硬件模块的槽标签。

必须符合 PKCS #11 标签规范。

slotUserPin

用于向模块PIN对 Greengrass 核心进行身份验证的用户。

必须具有足够的权限才能使用配置的私有密钥执行 C_Sign。

principals
IoTCertificate 核心用于向 AWS IoT发出请求的证书和私有密钥。
IoTCertificate  .privateKeyPath

核心私有密钥的路径。

对于文件系统存储,必须是格式为:URI的文件file:///absolute/path/to/file

要进行HSM存储,必须是指定对象标签的 RFC7512 PKCS #11 路径。

IoTCertificate  .certificatePath

核心设备证书的绝对路径。

必须是格式为:URI的文件file:///absolute/path/to/file

MQTTServerCertificate

可选。内核与证书结合使用的私钥,用作MQTT服务器或网关。

MQTTServerCertificate  .privateKeyPath

本地MQTT服务器私钥的路径。

使用此值为本地MQTT服务器指定您自己的私钥。

对于文件系统存储,必须是格式为:URI的文件file:///absolute/path/to/file

要进行HSM存储,必须是指定对象标签的 RFC7512 PKCS #11 路径。

如果省略此属性,则根据您的 AWS IoT Greengrass 旋转设置旋转密钥。如果指定,客户将负责对密钥进行轮换。

SecretsManager 保护用于加密的数据密钥的私有密钥。有关更多信息,请参阅 将密钥部署到 AWS IoT Greengrass 核心
SecretsManager  .privateKeyPath

本地 Secrets Manager 私有密钥的路径。

仅支持RSA密钥。

对于文件系统存储,必须是格式为:URI的文件file:///absolute/path/to/file

要进行HSM存储,必须是指定对象标签的 RFC7512 PKCS #11 路径。私钥必须使用 PKCS#1 v1.5 填充机制生成。

AWS IoT Greengrass 硬件安全的配置实践

以下是安全性和性能相关的预配置实践。

安全性

注意

在上生成私钥时,轮换密钥的做法不适用HSM。

性能

下图显示了 AWS IoT Greengrass 核心上的 IoT 客户端组件和本地MQTT服务器。如果要为两个组件使用HSM配置,则可以使用相同的私钥或单独的私钥。如果您使用单独的密钥,则它们必须存储在相同的插槽中。

注意

AWS IoT Greengrass 不会对您在上存储的密钥数量施加任何限制HSM,因此您可以存储 IoT 客户端、MQTT服务器和密钥管理器组件的私钥。但是,某些HSM供应商可能会限制您可以存储在插槽中的密钥数量。

IoT client and MQTT server interacting with AWS IoT Greengrass Core and AWS IoT Core.

通常,物联网客户端密钥的使用频率不高,因为 AWS IoT Greengrass 核心软件与云保持着长期的连接。但是,每当 Greengrass 设备连接到核心时,都会使用MQTT服务器密钥。这些交互直接影响着性能。

当MQTT服务器密钥存储在上时HSM,设备可以连接的速率取决于它们每秒HSM可以执行的RSA签名操作数。例如,如果在-RSA 2048 私钥上执行 RSASSA-PKCS1-v1.5 签名HSM需要 300 毫秒,则每秒只有三台设备可以连接到 Greengrass 内核。建立连接后,将HSM不再使用,标准配额 AWS IoT Greengrass适用

为了缓解性能瓶颈,您可以将MQTT服务器的私钥存储在文件系统上,而不是存储在文件系统上HSM。使用此配置,MQTT服务器的行为就像未启用硬件安全一样。

AWS IoT Greengrass 支持 IoT 客户端和MQTT服务器组件的多种密钥存储配置,因此您可以根据自己的安全和性能要求进行优化。下表包含一些示例配置。

配置 IoT 密钥 MQTT钥匙 Performance
HSM共享密钥 HSM: 按键 A HSM: 按键 A 受HSM或的限制 CPU
HSM单独的钥匙 HSM: 按键 A HSM: 按键 B 受HSM或的限制 CPU
HSM仅适用于物联网 HSM: 按键 A 文件系统:密钥 B 受限于 CPU
传统 文件系统:密钥 A 文件系统:密钥 B 受限于 CPU

要将 Greengrass 核心配置为服务器使用基于文件系统的密钥,请省略MQTTprincipals.MQTTServerCertificate该部分(如果您不使用生config.json成的默认密钥,则指定密钥的基于文件的路径)。 AWS IoT Greengrass生成的 crypto 对象如下所示:

"crypto": { "PKCS11": { "OpenSSLEngine": "...", "P11Provider": "...", "slotLabel": "...", "slotUserPin": "..." }, "principals": { "IoTCertificate": { "privateKeyPath": "...", "certificatePath": "..." }, "SecretsManager": { "privateKeyPath": "..." } }, "caPath" : "..." }

硬件安全性集成支持的密码套件

AWS IoT Greengrass 当内核配置为硬件安全时,支持一组密码套件。这是在配置核心以使用基于文件的安全性时所支持的密码套件的一部分。有关更多信息,请参阅 TLS 密码套件支持

注意

通过本地网络从 Greengrass 设备连接到 Greengrass 核心时,请务必使用支持的密码套件之一进行连接。TLS

配置对 over-the-air 更新的支持

要在使用硬件安全时启用 C AWS IoT Greengrass ore 软件的 over-the-air (OTA) 更新,必须安装 OpenSC libp11 PKCS#11 包装器库并编辑 Greengrass 配置文件。有关更OTA新的更多信息,请参阅AWS IoT Greengrass Core 软件的 OTA 更新

  1. 停止 Greengrass 守护程序。

    cd /greengrass-root/ggc/core/ sudo ./greengrassd stop
    注意

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

  2. 安装 Open SSL 引擎。支持打开SSL版本 1.0 或 1.1。

    sudo apt-get install libengine-pkcs11-openssl
  3. 在您的系统上找到 Open SSL 引擎 (libpkcs11.so) 的路径:

    1. 获取库的已安装程序包的列表。

      sudo dpkg -L libengine-pkcs11-openssl

      libpkcs11.so 文件位于 engines 目录中。

    2. 复制文件的完整路径(例如 /usr/lib/ssl/engines/libpkcs11.so)。

  4. 打开 Greengrass 配置文件。这是位于 /greengrass-root/config 目录中的 config.json 文件。

  5. 对于 OpenSSLEngine 属性,输入 libpkcs11.so 文件的路径。

    { "crypto": { "caPath" : "file:///path-to-root-ca", "PKCS11" : { "OpenSSLEngine" : "/path-to-p11-openssl-engine", "P11Provider" : "/path-to-pkcs11-provider-so", "slotLabel" : "crypto-token-name", "slotUserPin" : "crypto-token-user-pin" }, ... } ... }
    注意

    如果 PKCS11 对象中不存在 OpenSSLEngine 属性,请进行添加。

  6. 启动 Greengrass 守护程序。

    cd /greengrass-root/ggc/core/ sudo ./greengrassd start

向后兼容早期版本的 AWS IoT Greengrass 核心软件

支持硬件安全的 AWS IoT Greengrass Core 软件与为 v1.6 及更早版本生成的config.json文件完全向后兼容。如果config.json配置文件中不存在该crypto对象,则 AWS IoT Greengrass 使用基于文件的coreThing.certPathcoreThing.keyPath、和coreThing.caPath属性。这种向后兼容性适用于 G OTA reengrass 更新,这些更新不会覆盖中指定的基于文件的配置。config.json

不支持 PKCS #11 的硬件

PKCS#11 库通常由硬件供应商提供或是开源的。例如,使用符合标准的硬件(例如 TPM1 .2),可能可以使用现有的开源软件。但是,如果您的硬件没有相应的 PKCS #11 库实现,或者您想编写自定义 PKCS #11 提供程序,则应联系您的 E AWS nterprise Support 代表提出与集成相关的问题。

另请参阅