Amazon Simple Storage Service
开发人员指南 (API 版本 2006-03-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

CRR 其他配置:复制使用 AWS KMS 托管加密密钥通过服务器端加密 (SSE) 创建的对象

默认情况下,Amazon S3 不复制您的源存储桶中使用 AWS KMS 托管密钥通过服务器端加密静态存储的对象。本部分介绍您可以添加的其他配置以指示 Amazon S3 复制这些对象。

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

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

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

  • Destination 配置中,添加您希望 Amazon S3 用来加密对象副本的 AWS KMS 密钥:

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

<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 密钥。

AWS KMS 密钥必须 有效。PUT 存储桶复制 API 不会检查 AWS KMS 密钥的有效性。如果使用无效密钥,您将在响应中收到 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 KMS 托管密钥通过服务器端加密创建的对象,请向复制配置中指定的 IAM 角色授予以下其他权限。通过更新与 IAM 角色关联的权限策略,可授予这些权限。

  • 源对象的 s3:GetObjectVersionForReplication 操作的权限。此操作的权限允许 Amazon S3 复制未加密的对象以及使用 Amazon S3 托管加密 (SSE-S3) 密钥或 AWS KMS 托管加密 (SSE-KMS) 密钥通过服务器端加密创建的对象。

    注意

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

  • 以下 AWS KMS 操作的权限:

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

    • 用于加密对象副本的 AWS KMS 密钥的 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 密钥,拥有 IAM 角色的 AWS 账户必须具有这些 AWS KMS 操作(kms:Encryptkms:Decrypt)的权限。如果 AWS KMS 密钥由另一个 AWS 账户拥有,则该密钥所有者必须向拥有 IAM 角色的 AWS 账户授予这些权限。有关管理对这些密钥的访问的更多信息,请参阅 AWS Key Management Service Developer Guide中的在 AWS KMS 中使用 IAM 策略

    以下是一个完整的 IAM 策略,该策略授予必要权限来复制未加密的对象以及使用 Amazon S3 托管加密密钥和 AWS KMS 托管加密密钥通过服务器端加密创建的对象。

    注意

    不会复制使用客户提供的加密密钥通过服务器端加密 (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 账户拥有),用于加密对象副本的 AWS KMS 密钥必须是客户主密钥 (CMK)。该密钥所有者必须向源存储桶拥有者授予使用该密钥的权限。

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

  1. 登录 AWS 管理控制台 并通过以下网址打开 IAM 控制台 https://console.amazonaws.cn/iam/

  2. 选择 Encryption keys

  3. 选择 AWS KMS 密钥。

  4. Key PolicyKey UsersExternal Accounts 中,选择 Add External Account

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

  6. 选择 Save Changes

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

AWS KMS 事务限制注意事项

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

我们建议您通过在 AWS 支持中心创建一个案例来请求增加您的 AWS KMS API 速率限制。 有关更多信息,请参阅 https://console.amazonaws.cn/support/home#/。