静态数据加密 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" } } } ] }

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

第 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 角色上。

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

一些客户操作可能导致关键运行状况从变HEALTHYUNHEALTHY

与密钥相关的操作
  • 删除 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. 通过检查以下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指标的状态变化。如果在查看您的配置后操作仍然失败,请联系您的客户经理或 Su AWS pport Center 寻求更多帮助。

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" }