静态数据加密 Amazon IoT Core - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

静态数据加密 Amazon IoT Core

默认情况下,所有静态Amazon IoT Core数据都使用Amazon自有密钥进行加密。 Amazon IoT Core还支持 Amazon Key Management Service (Amazon KMS) 中的对称客户托管密钥。使用客户管理的密钥,您可以创建、拥有和管理Amazon账户中的Amazon KMS密钥。 Amazon IoT Core将使用您的 KMS 密钥加密您的静态数据。您对这些 KMS 密钥拥有完全控制权,包括创建和维护其密钥策略。您还可以为访问这些密钥的角色配置 IAM 策略Amazon KMS以控制这些密钥的权限。

Amazon拥有的密钥

Amazon拥有的密钥是Amazon服务拥有和管理的 KMS 密钥的集合,可在多个Amazon账户中使用。 Amazon服务可以使用Amazon自有密钥来保护您的数据。默认情况下,使用Amazon自有Amazon IoT Core密钥对静态数据进行加密。这些密钥由服务托管。您无法查看、管理或使用Amazon自有密钥。但是,您无需采取任何操作来保护这些密钥。

有关Amazon自有密钥的更多信息,请参阅《Amazon Key Management Service开发者指南》中的Amazon自有密钥

客户自主管理型密钥

客户托管密钥是您在Amazon账户中创建、拥有和管理的 KMS 密钥。您对这些 Amazon KMS 密钥拥有完全控制权,包括创建和维护其密钥策略。您还可以为访问这些密钥的角色配置 IAM 策略Amazon KMS以控制这些密钥的权限。您可以配置Amazon IoT Core为使用客户托管的 KMS 密钥来加密您的数据。

有关客户托管密钥的更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的客户托管密钥

要选择使用客户管理的密钥Amazon IoT Core,请按照以下步骤操作:

步骤 1:创建客户托管式密钥

您可以使用Amazon KMS控制台或 Amazon KMS CLI 命令创建对称客户托管密钥。keySpec 必须是 SYMMETRIC_DEFAULTkeyUsage 必须是 ENCRYPT_DECRYPT

注意

Amazon IoT Core仅支持客户托管Amazon KMS密SYMMETRIC_DEFAULT钥具有密ENCRYPT_DECRYPT钥规格和密钥用法的密钥。

以下是创建 KMS 密钥的示例Amazon CLI命令,该密钥可与客户托管密钥一起Amazon IoT Core使用。

aws kms create-key --key-spec SYMMETRIC_DEFAULT --key-usage ENCRYPT_DECRYPT --region us-west-2

以下是该命令的示例输出。

{ "KeyMetadata": { "AWSAccountId": "111122223333", "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", "Arn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "CreationDate": "2024-09-19T11:45:23.982000-07:00", "Enabled": true, "Description": "", "KeyUsage": "ENCRYPT_DECRYPT", "KeyState": "Enabled", "Origin": "AWS_KMS", "KeyManager": "CUSTOMER", "CustomerMasterKeySpec": "SYMMETRIC_DEFAULT", "KeySpec": "SYMMETRIC_DEFAULT", "EncryptionAlgorithms": [ "SYMMETRIC_DEFAULT" ], "MultiRegion": false } }

有关更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的创建对称客户托管密钥

密钥策略

创建客户托管密钥时,可以指定密钥策略。密钥政策控制对客户托管密钥的访问。每个客户托管式密钥必须只有一个密钥策略,其中包含确定谁可以使用密钥以及如何使用密钥的声明。有关更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的密钥策略

Amazon IoT Core使用您账户中的 IAM 角色访问您的客户托管密钥。如果您使用自定义密钥策略,请确保在此密钥上创建的 IAM 角色具有以下权限:

  • kms:DescribeKey

  • kms:Decrypt

  • kms:Encrypt

  • kms:GenerateDataKeyWithoutPlaintext

  • kms:ReEncryptTo

  • kms:ReEncryptFrom

步骤 2:创建 IAM 角色以授予使用 KMS 密钥的Amazon IoT Core权限

Amazon IoT Core要使用您创建的 KMS 密钥对静态数据进行加密,您还需要在账户中创建一个 IAM 角色,该角色Amazon IoT Core可以假定可以访问 KMS 密钥。

该角色必须具有以下信任策略Amazon IoT Core才能代入该角色。

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "Service": "iot.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333" }, "ArnLike": { "aws:SourceArn": "arn:aws:iot:us-west-2:111122223333:*" } } } }

确保附加到 IAM 角色的 IAM 策略对 KMS 密钥具有以下权限:

  • kms:DescribeKey

  • kms:Decrypt

  • kms:Encrypt

  • kms:GenerateDataKeyWithoutPlaintext

  • kms:ReEncryptTo

  • kms:ReEncryptFrom

以下是一个具有客户托管密钥所需权限的示例 IAM 策略。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowIoTToAccessKMSResource", "Effect": "Allow", "Action": [ "kms:DescribeKey", "kms:Decrypt", "kms:Encrypt", "kms:ReEncryptTo", "kms:ReEncryptFrom", "kms:GenerateDataKeyWithoutPlaintext" ], "Resource": [ "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" ], "Condition": { "StringEquals": { "kms:EncryptionContext:aws-crypto-ec:vendor": "iot.amazonaws.com" } } } ] }

有关更多信息,请参阅《Amazon Identity and Access Management 用户指南》中的创建向 IAM 用户委派权限的角色

第 3 步:选择使用客户管理的密钥 Amazon IoT Core

完成所有先前步骤后,运行 update-encryption-configuration CLI 命令以在 Amazon IoT Core 中选择使用客户托管密钥。当您选择使用客户托管密钥时,您的Amazon账户中的所有Amazon IoT Core资源都将使用指定的Amazon KMS密钥进行加密。

  1. 要选择Amazon IoT Core使用客户托管密钥Amazon CLI,请运行 update-encryption-configuration CLI 命令。

    aws iot update-encryption-configuration --encryption-type "CUSTOMER_MANAGED_KMS_KEY" \ --kms-access-role-arn "arn:aws:iam::111122223333:role/myrole" \ --kms-key-arn "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" --region us-west-2
  2. 要在Amazon IoT Core使用中验证客户托管密钥Amazon CLI,请运行 describe-encryption-configuration CLI 命令:

    aws iot describe-encryption-configuration --region us-west-2

    如果您在中启用了客户托管密钥Amazon IoT Core,则输出可能如下所示:

    { "encryptionType": "CUSTOMER_MANAGED_KMS_KEY", "kmsKeyArn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "kmsAccessRoleArn": "arn:aws:iam::111122223333:role/myrole", "configurationDetails": { "configurationStatus": "HEALTHY" }, "lastModifiedDate": "2024-09-26T22:01:02.365000-07:00" }

    lastModifiedDate 字段指示加密配置最后更新的日期。

    如果您尚未启用客户托管密钥,输出可能如下所示:

    { "encryptionType": "AWS_OWNED_KMS_KEY", "lastModifiedDate": "2024-09-26T22:01:02.365000-07:00" }

步骤 4:Amazon IoT Core控制平面操作所需的额外权限

在您选择使用客户托管密钥后,属于您Amazon账户的所有Amazon IoT Core资源都将使用提供的 KMS 密钥进行加密。现在,除了对Amazon IoT Core资源进行特定操作所需的kms:Decrypt权限外,所有控制平面操作都要求调用者拥有 KMS 密钥的权限。如果调用者没有 kms:Decrypt 权限,并且他们进行了需要加密或解密数据的 API 调用(例如,GetPolicy),他们将收到 UnauthorizedException

例如,当您调用 GetPolicy 时,您需要对您的客户托管 KMS 密钥同时拥有 iot:GetPolicykms:Decrypt 权限,API 调用才能成功。

注意

更新 IAM 用户或角色以授予对用于加密配置的密钥的Amazon KMS权限时,请确保 KMS 密钥策略还向相应的 IAM 用户或角色授予所需的权限。

Amazon KMS的权限 UpdateEncryptionConfiguration

UpdateEncryptionConfigurationAPI 调用需要对 KMS 密钥Amazon KMS具有以下权限才能选择使用客户托管密钥或修改密钥配置:

  • kms:DescribeKey

  • kms:Decrypt

  • kms:Encrypt

  • kms:GenerateDataKeyWithoutPlaintext

  • kms:ReEncryptTo

  • kms:ReEncryptFrom

Amazon KMS所有其他控制平面的权限 APIs

启用客户托管密钥后,大多数控制平面都 APIs 需要kms:Decrypt权限。但是,某些 APIs 不需要以下额外权限:

APIs 不需要Amazon KMS权限的

List*Delete* APIs 不属于这个桶。客户始终可以调用任意 List*Delete* 控制面板 API,即使调用者没有 kms:Decrypt 权限,这些 API 调用也会成功。即使您的客户托管密钥不健康List*Delete* APIs 未进行任何解密,这些 API 调用也会成功。

  • 列表* APIs-所有列出操作(例如、ListThingsListPoliciesListCertificates

  • 删除* APIs-所有删除操作(例如、DeleteThingDeletePolicyDeleteCertificate

步骤 5:管理密钥

Amazon IoT Core定期检查您的客户托管密钥配置,以确保加密和解密操作不受影响。这些运行状况检查每分钟运行一次,用于验证Amazon IoT Core访问和使用Amazon KMS密钥和关联的 IAM 角色进行加密和解密操作的能力。

HEALTHY

Amazon IoT Core可以通过指定的 IAM 角色成功访问Amazon KMS密钥并执行 encryption/decryption 操作。所有组件功能正常。

UNHEALTHY

Amazon IoT Core无法访问或使用Amazon KMS密钥。这会阻止新的加密操作,并可能影响服务功能。errorCode 字段指示问题是出在密钥还是 IAM 角色上。

可能影响密钥运行状况的客户操作

以下几个客户操作可能导致密钥运行状况从 HEALTHY 变为 UNHEALTHY

与密钥相关的操作
  • 删除Amazon KMS密钥-当您计划删除密钥时,该密钥处于Pending deletion状态且无法使用

  • 禁用Amazon KMS密钥-禁用 KMS 密钥后,该密钥将无法再用于加密/解密操作

  • 计划删除密钥:密钥在删除完成后变得不可用

  • 修改密钥策略-删除必要的Amazon IoT Core访问权限

  • 更改密钥使用权限-限制所需Amazon KMS操作

与 IAM 角色相关的操作
  • 删除 IAM 角色 — Amazon IoT Core 无法代入该角色来访问密钥

  • 修改角色权限-从角色策略中移除所需Amazon KMS权限

  • 更改信任策略-阻止Amazon IoT Core服务担任该角色

  • 添加限制性条件-Amazon IoT Core 禁止使用角色的条件

账户级操作
  • 跨账户密钥访问更改:修改不同账户中密钥的权限

  • 服务控制策略 (SCPs) — 限制访问的组织级策略 Amazon KMS

  • 账户级 IAM 策略:覆盖或与密钥访问冲突的策略

重要

对使用的Amazon KMS密钥、IAM 角色或策略的任何更改都Amazon IoT Core应先在开发环境中进行测试。进行任何更改后,请密切监视密钥的运行状况,以确保Amazon IoT Core功能不受影响。

更新加密配置

更新您的加密配置,从一个客户管理的密钥更改Amazon IoT Core为另一个客户管理的密钥,或者在Amazon自有密钥和客户管理的密钥之间进行更改。

要将配置更改为其他客户托管密钥,请执行以下操作:

  1. 按照 步骤 1:创建客户托管式密钥 中的步骤创建一个新的客户托管密钥。

  2. 更新您的 IAM 角色策略,以在更新期间包含对新旧密钥的权限。

  3. 更新您的加密配置以使用新密钥:

    aws iot update-encryption-configuration --encryption-type "CUSTOMER_MANAGED_KMS_KEY" \ --kms-access-role-arn "arn:aws:iam::111122223333:role/myrole" \ --kms-key-arn "arn:aws:kms:us-west-2:111122223333:key/new-key-id"

要将配置从客户管理的密钥更改回Amazon自有密钥,请执行以下操作:

aws iot update-encryption-configuration --encryption-type "AWS_OWNED_KMS_KEY"
注意

在为新的客户托管密钥更新加密配置时,请确保新旧密钥在操作期间均可访问,以确保操作成功。

常见故障场景和影响

下表描述了密钥被删除或停用时的常见故障场景:

场景 直接影响 长期后果

密钥已禁用

所有新 encryption/decryption 操作都会立即失败

服务中断,直到密钥被重新启用或替换

密钥计划删除

密钥状态更改为待删除,所有 encryption/decryption 操作都将失败

删除完成后服务自动故障

密钥已永久删除

所有操作立即且永久失败

永久数据丢失且无法恢复加密数据

密钥策略修改不正确

Amazon IoT Core失去对密钥的访问权限

服务故障,直到策略被纠正

IAM 角色已删除

Amazon IoT Core无法扮演访问密钥的角色

加密服务完全故障

IAM 角色被错误修改

Amazon IoT Core无法扮演角色或使用角色访问密钥

服务故障,直到 IAM 角色被纠正

预防和最佳实践

为防止意外密钥删除或停用,并最大限度地降低服务故障风险,请执行以下操作:

实施密钥生命周期策略

建立清晰的密钥创建、轮换和停用流程。记录哪些Amazon IoT Core资源使用了哪些密钥,并维护活动密钥的清单。

使用 IAM 策略限制密钥删除

创建 IAM 策略,防止未经授权的用户删除或禁用关键加密密钥。使用条件要求密钥删除操作需要额外审批。

启用 CloudTrail 日志记录

监控所有Amazon KMS密钥操作 CloudTrail ,以检测未经授权或意外的密钥管理活动。为密钥删除、禁用或策略更改设置警报。

测试密钥替换流程

定期在非生产环境中测试密钥替换流程,以确保您能快速从密钥相关故障中恢复。

维护密钥备份

虽然您无法导出Amazon KMS密钥材料,但请保留密钥 ARNs、策略和相关Amazon IoT Core配置的详细记录,以便在需要时快速更换密钥。

监控密钥运行状况

持续监控 CMK.Health 指标,并为密钥运行状况变化设置自动化警报。实施自动化响应,以快速处理密钥相关问题。

重要

在生产环境实施之前,始终在开发环境中测试密钥更新流程。制定文档化的回滚计划,并确保密钥替换流程在紧急情况下可以快速执行。

步骤 6:监控密钥运行状况

作为定期检查的一部分,系统会发布 CloudWatch 指标和日志,以提供客户托管密钥配置的Amazon IoT Core运行状况的可见性

Amazon IoT Core将该CMK.Health指标 CloudWatch 至少每分钟发出一次。该指标提供有关Amazon IoT Core用于加密和解密数据的客户托管密钥的运行状况的信息。

CMK.Health 指标可能具有以下值:

  • 值Amazon IoT Core为1:能够成功使用加密密钥来加密和解密您的数据。

  • 值Amazon IoT Core为0:无法使用加密密钥来加密和解密您的数据。

Amazon IoT Core当加密密钥的运行状况发生变化时,还会发出 Amazon IoT V2 日志。这些日志提供有关运行状况更新的附加详细信息。要查看这些日志,必须启用 Amazon IoT V2 日志。HEALTHY 日志在 INFO 级别发出,UNHEALTHY 日志在 ERROR 级别发出。有关日志级别的更多信息,请参阅日志级别

以下示例是发出的 CloudWatch 日志条目Amazon IoT Core,用于指示客户托管密钥的运行状况更新。

为了有效监控和响应密钥运行状况变化,请执行以下操作:

  1. CMK.Health指标@@ 设置 CloudWatch 警报

    aws cloudwatch put-metric-alarm --region us-west-2 \ --alarm-name "IoTCore-CMK-Health-Alert" \ --alarm-description "Alert when IoT Core CMK health is unhealthy" \ --metric-name "CMK.Health" \ --namespace "AWS/IoT" \ --statistic "Minimum" \ --period 300 \ --evaluation-periods 1 \ --threshold 1 \ --comparison-operator "LessThanThreshold" \ --alarm-actions "arn:aws:sns:us-west-2:111122223333:iot-alerts"
  2. 启用 Amazon IoT V2 日志记录以捕获包含错误代码和消息的详细运行状况更改事件。

  3. 检查配置状态以进行故障排除:

    aws iot describe-encryption-configuration --region us-west-2
  4. 调查 UNHEALTHY 状态,检查 errorCode 字段:

    • KMS_KEY_VALIDATION_ERROR— Amazon KMS 密钥问题(已禁用、已删除或策略问题)

    • ROLE_VALIDATION_ERROR:IAM 角色问题(删除、策略问题或信任问题)

从不健康到健康

当加密密钥的状态从更新UNHEALTHY为时HEALTHY,Amazon IoT Core将发出以下格式的 Amazon IoT V2 日志消息。

{ "timestamp": "2017-08-10 15:37:23.476", "logLevel": "INFO", "traceId": "8421693b-f4f0-4e4a-9235-0cff8bab897d", "accountId": "111122223333", "status": "SUCCESS", "cmkStatus": "HEALTHY", "kmsKeyArn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "kmsAccessRoleArn": "arn:aws:iam::111122223333:role/myrole", "eventType": "CmkHealthCheck" }

从健康到不健康

当加密密钥的状态从更新HEALTHY为时UNHEALTHY,Amazon IoT Core将发出以下格式的 Amazon IoT V2 日志消息。

{ "timestamp": "2017-08-10 15:37:23.476", "logLevel": "ERROR", "traceId": "8421693b-f4f0-4e4a-9235-0cff8bab897d", "accountId": "111122223333", "status": "FAILURE", "cmkStatus": "UNHEALTHY", "errorCode": "KMS_KEY_VALIDATION_ERROR / ROLE_VALIDATION_ERROR", "errorMessage": "Error message on why there was a failure", "kmsKeyArn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "kmsAccessRoleArn": "arn:aws:iam::111122223333:role/myrole", "eventType": "CmkHealthCheck" }
警告

当密钥运行状况变为时UNHEALTHY,Amazon IoT Core操作会立即失败。如果发生这种情况,请检查您的密钥配置、IAM 角色权限和策略。监控 CMK.Health 指标以了解状态变化。如果在检查配置后操作仍然失败,请联系您的客户经理或 Amazon 支持中心以获取额外帮助。

Amazon CloudTrail事件

您还可以监控 KMS 密钥Amazon IoT Core的使用情况,以进行加密解密操作。 Amazon IoT Core将对您的 KMS 密钥进行DescribeKeyDecryptReEncrypt、、和GenerateDataKeyWithoutPlaintext操作,以加密/解密属于您的Amazon账户的静态数据。

有针 CloudTrail 对DescribeKeyDecryptReEncrypt、和的事件GenerateDataKeyWithoutPlaintext。这些事件会监控Amazon IoT Core为访问由您的客户托管密钥加密的数据而调用的Amazon KMS操作。

Decrypt 示例
{ "eventVersion": "1.09", "userIdentity": { "type": "AssumedRole", "principalId": "AROAIGDTESTANDEXAMPLE:Sampleuser01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01", "accountId": "111122223333", "accessKeyId": "*********************", "sessionContext": { "sessionIssuer": { "type": "Role", "principalId": "AROAIGDTESTANDEXAMPLE:Sampleuser01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01", "accountId": "111122223333", "userName": "*****" }, "attributes": { "creationDate": "2024-09-16T20:23:39Z", "mfaAuthenticated": "false" } }, "invokedBy": "iot.amazonaws.com" }, "eventTime": "2024-09-16T20:32:48Z", "eventSource": "kms.amazonaws.com", "eventName": "Decrypt", "awsRegion": "us-west-2", "sourceIPAddress": "iot.amazonaws.com", "userAgent": "iot.amazonaws.com", "requestParameters": { "encryptionContext": { "kms-arn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "aws-crypto-ec:vendor": "iot.amazonaws.com", "branch-key-id": "111122223333", "type": "branch:ACTIVE" }, "encryptionAlgorithm": "SYMMETRIC_DEFAULT", "keyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" }, "responseElements": null, "requestID": "1afb6d98-8388-455d-8b48-e62c9e0cf7f4", "eventID": "b59a5f16-0d98-46d8-a590-0e040a48b39b", "readOnly": true, "resources": [ { "accountId": "111122223333", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ], "eventType": "AwsApiCall", "managementEvent": true, "recipientAccountId": "111122223333", "eventCategory": "Management" }