复制使用具有 AWS KMS 中存储的加密密钥的服务器端加密 (SSE) 创建的对象 - Amazon Simple Storage Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

复制使用具有 AWS KMS 中存储的加密密钥的服务器端加密 (SSE) 创建的对象

默认情况下,Amazon S3 不会复制使用具有 AWS KMS 中存储的客户主密钥 (CMK) 的服务器端加密静态存储的对象。本节介绍您可以添加的其他配置以指示 Amazon S3 复制这些对象。

重要

加密数据的复制是完全在 Amazon S3 内部执行的服务器端过程。复制不支持客户端加密。

有关带分步说明的示例,请参阅示例 4:复制加密对象。有关创建复制配置的信息,请参阅复制

在复制配置中指定其他信息

在复制配置中,您需要执行以下操作:

  • Destination 配置中,添加您希望 Amazon S3 用来加密对象副本的对称客户托管 AWS KMS CMK。

  • 通过添加 SourceSelectionCriteria 元素,明确选择启用使用 AWS KMS CMK 加密的对象的复制。

<ReplicationConfiguration> <Rule> ... <SourceSelectionCriteria> <SseKmsEncryptedObjects> <Status>Enabled</Status> </SseKmsEncryptedObjects> </SourceSelectionCriteria> <Destination> ... <EncryptionConfiguration> <ReplicaKmsKeyID>AWS KMS key ID for the AWS region of the destination bucket.</ReplicaKmsKeyID> </EncryptionConfiguration> </Destination> ... </Rule> </ReplicationConfiguration>
重要

必须事先已在目标存储桶所在的同一 AWS 区域中创建 AWS KMS CMK。

AWS KMS CMK 必须 有效。PUT 存储桶复制 API 不会检查 AWS KMS CMK 的有效性。如果使用无效 CMK,您将在响应中收到 200 OK 状态代码,但复制将失败。

以下复制配置示例演示包含可选配置元素的复制配置。

<?xml version="1.0" encoding="UTF-8"?> <ReplicationConfiguration> <Role>arn:aws:iam::account-id:role/role-name</Role> <Rule> <ID>Rule-1</ID> <Priority>1</Priority> <Status>Enabled</Status> <DeleteMarkerReplication> <Status>Disabled</Status> </DeleteMarkerReplication> <Filter> <Prefix>Tax</Prefix> </Filter> <Destination> <Bucket>arn:aws:s3:::destination-bucket</Bucket> <EncryptionConfiguration> <ReplicaKmsKeyID>The AWS KMS key ID for the AWS region of the destination bucket (S3 uses it to encrypt object replicas).</ReplicaKmsKeyID> </EncryptionConfiguration> </Destination> <SourceSelectionCriteria> <SseKmsEncryptedObjects> <Status>Enabled</Status> </SseKmsEncryptedObjects> </SourceSelectionCriteria> </Rule> </ReplicationConfiguration>

此复制配置包含一个规则。该规则应用于键前缀为 Tax 的对象。Amazon S3 使用 AWS KMS 密钥 ID 加密这些对象副本。

为 IAM 角色授予额外权限

要复制在 AWS Key Management Service (AWS KMS) 下静态加密的对象,请向复制配置中指定的 IAM 角色授予以下其他权限。通过更新与 IAM 角色关联的权限策略,可授予这些权限。不会复制使用具有客户提供的加密密钥的服务器端加密 (SSE-C) 创建的对象。

  • 源对象的 s3:GetObjectVersionForReplication 操作的权限。该操作的权限允许 Amazon S3 复制未加密的对象,以及使用具有 Amazon S3 托管加密 (SSE-S3) 密钥或 AWS KMS 中存储的 CMK 的服务器端加密 (SSE-KMS) 创建的对象。

    注意

    我们建议您使用 s3:GetObjectVersionForReplication 操作(而不是 s3:GetObjectVersion 操作),因为它仅向 Amazon S3 提供复制所需的最低权限。此外,s3:GetObjectVersion 操作的权限允许复制未加密的对象和 SSE-S3 加密对象,但不允许复制使用 AWS KMS 中存储的 CMK 创建的对象。

  • 以下 AWS KMS 操作的权限:

    • 用于加密源对象的 AWS KMS CMK 的 kms:Decrypt 权限

    • 用于加密对象副本的 AWS KMS CMK 的 kms:Encrypt 权限

    我们建议您使用 AWS KMS 条件键将这些权限限制为特定的存储桶和对象;如以下示例策略语句中所示。

    { "Action": ["kms:Decrypt"], "Effect": "Allow", "Condition": { "StringLike": { "kms:ViaService": "s3.source-bucket-region.amazonaws.com", "kms:EncryptionContext:aws:s3:arn": [ "arn:aws:s3:::source-bucket-name/key-prefix1*", ] } }, "Resource": [ "List of AWS KMS key IDs used to encrypt source objects.", ] }, { "Action": ["kms:Encrypt"], "Effect": "Allow", "Condition": { "StringLike": { "kms:ViaService": "s3.destination-bucket-region.amazonaws.com", "kms:EncryptionContext:aws:s3:arn": [ "arn:aws:s3:::destination-bucket-name/key-prefix1*", ] } }, "Resource": [ "AWS KMS key IDs (for the AWS region of the destination bucket). S3 uses it to encrypt object replicas", ] }

    对于策略中列出的 AWS KMS CMK,拥有 IAM 角色的 AWS 账户必须具有这些 AWS KMS 操作(kms:Encryptkms:Decrypt)的权限。如果 AWS KMS CMK 由另一个 AWS 账户拥有,则 CMK 所有者必须向拥有 IAM 角色的 AWS 账户授予这些权限。有关管理对这些 CMK 的访问的更多信息,请参阅AWS Key Management Service Developer Guide中的在 AWS KMS 中使用 IAM 策略

    以下是一个完整的 IAM 策略,它授予所需的权限以复制未加密的对象,以及使用具有 Amazon S3 托管加密密钥和 AWS KMS 中存储的 CMK 的服务器端加密创建的对象。

    注意

    不会复制使用具有客户提供的加密密钥的服务器端加密 (SSE-C) 创建的对象。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetReplicationConfiguration", "s3:ListBucket" ], "Resource":[ "arn:aws:s3:::source-bucket" ] }, { "Effect":"Allow", "Action":[ "s3:GetObjectVersionForReplication", "s3:GetObjectVersionAcl" ], "Resource":[ "arn:aws:s3:::source-bucket/key-prefix1*" ] }, { "Effect":"Allow", "Action":[ "s3:ReplicateObject", "s3:ReplicateDelete" ], "Resource":"arn:aws:s3:::destination-bucket/key-prefix1*" }, { "Action":[ "kms:Decrypt" ], "Effect":"Allow", "Condition":{ "StringLike":{ "kms:ViaService":"s3.source-bucket-region.amazonaws.com", "kms:EncryptionContext:aws:s3:arn":[ "arn:aws:s3:::source-bucket-name/key-prefix1*" ] } }, "Resource":[ "List of AWS KMS key IDs used to encrypt source objects." ] }, { "Action":[ "kms:Encrypt" ], "Effect":"Allow", "Condition":{ "StringLike":{ "kms:ViaService":"s3.destination-bucket-region.amazonaws.com", "kms:EncryptionContext:aws:s3:arn":[ "arn:aws:s3:::destination-bucket-name/prefix1*" ] } }, "Resource":[ "AWS KMS key IDs (for the AWS region of the destination bucket) to use for encrypting object replicas" ] } ] }

为跨账户方案授予其他权限

在跨账户方案中(存储桶和目标存储桶由不同的 AWS 账户拥有),您可以使用客户托管 CMK 加密对象副本。但是,CMK 拥有者必须向源存储桶拥有者授予使用 CMK 的权限。

向源存储桶拥有者授予使用 AWS KMS CMK 的权限(IAM 控制台)

  1. 登录 AWS 管理控制台并通过以下网址打开 AWS Key Management Service (AWS KMS) 控制台:https://console.amazonaws.cn/kms

  2. 要更改 AWS 区域,请使用页面右上角的区域选择器。

  3. 要查看您账户中自己所创建和管理的密钥,请在导航窗格中选择 Customer managed keys (客户托管密钥).

  4. 选择 CMK。

  5. General configuration 下,选择 Key policy 选项卡。

  6. 选择 Other AWS Accounts

  7. 选择 Add another AWS Account

  8. 对于 arn:aws:iam::,输入源存储桶账户 ID。

  9. 选择 Save Changes

向源存储桶拥有者授予使用 AWS KMS CMK 的权限 (AWS CLI)

AWS KMS 事务限制注意事项

在启用跨区域复制 (CRR) 后使用 AWS KMS 加密添加许多新对象时,您可能会遇到限流(HTTP 503 速度变慢错误)。如果每秒 AWS KMS 事务数超出当前限制,则会发生限流。有关更多信息,请参阅 AWS Key Management Service Developer Guide 中的限制

要请求提高限制,请使用 Service Quotas。有关更多信息,请参阅 Amazon Web Services 限制。如果您的区域不支持 Service Quotas,请开立一个 AWS Support 案例