静态数据加密 AWS IoT Core - AWS IoT Core

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

静态数据加密 AWS IoT Core

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

AWS拥有的密钥

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

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

客户自主管理型密钥

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

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

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

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

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

注意

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

以下是创建 KMS 密钥的示例AWS CLI命令,该密钥可与客户托管密钥一起AWS 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 } }

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

密钥策略

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

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

  • kms:DescribeKey

  • kms:Decrypt

  • kms:Encrypt

  • kms:GenerateDataKeyWithoutPlaintext

  • kms:ReEncryptTo

  • kms:ReEncryptFrom

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

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

该角色必须具有以下信任策略AWS 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" } } } ] }

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

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

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

  1. 要选择AWS IoT Core使用客户托管密钥AWS 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. 要在AWS IoT Core使用中验证客户托管密钥AWS CLI,请运行 describe-encryption-configuration CLI 命令:

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

    如果您在中启用了客户托管密钥AWS 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:AWS IoT Core控制平面操作所需的额外权限

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

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

注意

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

AWS KMS的权限 UpdateEncryptionConfiguration

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

  • kms:DescribeKey

  • kms:Decrypt

  • kms:Encrypt

  • kms:GenerateDataKeyWithoutPlaintext

  • kms:ReEncryptTo

  • kms:ReEncryptFrom

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

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

APIs 不需要AWS KMS权限的

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

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

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

步骤 5:管理密钥

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

HEALTHY

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

UNHEALTHY

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

重要

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

更新加密配置

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

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

  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"

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

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

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

常见故障场景和影响

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

场景 直接影响 长期后果

密钥已禁用

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

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

密钥计划删除

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

删除完成后服务自动故障

密钥已永久删除

所有操作立即且永久失败

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

密钥策略修改不正确

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

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

IAM 角色已删除

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

加密服务完全故障

IAM 角色被错误修改

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

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

预防和最佳实践

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

实施密钥生命周期策略

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

使用 IAM 策略限制密钥删除

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

启用 CloudTrail 日志记录

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

测试密钥替换流程

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

维护密钥备份

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

监控密钥运行状况

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

重要

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

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

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

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

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

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

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

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

以下示例是发出的 CloudWatch 日志条目AWS 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. 启用 AWS IoT V2 日志记录以捕获包含错误代码和消息的详细运行状况更改事件。

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

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

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

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

从不健康到健康

当加密密钥的状态从更新UNHEALTHY为时HEALTHY,AWS IoT Core将发出以下格式的 AWS 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,AWS IoT Core将发出以下格式的 AWS 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,AWS IoT Core操作会立即失败。如果发生这种情况,请检查您的密钥配置、IAM 角色权限和策略。监控 CMK.Health 指标以了解状态变化。如果在检查配置后操作仍然失败,请联系您的客户经理或 AWS 支持中心以获取额外帮助。

AWS CloudTrail事件

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

有针 CloudTrail 对DescribeKeyDecryptReEncrypt、和的事件GenerateDataKeyWithoutPlaintext。这些事件会监控AWS IoT Core为访问由您的客户托管密钥加密的数据而调用的AWS 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" }