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

复制使用 Amazon KMS CMK 的服务器端加密 (SSE) 创建的对象

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

注意

您可以在 Amazon S3 中使用多区域密钥。多区域密钥的作用像目前的客户主密钥 (CMK),但它们不会使用密钥的多区域功能。有关更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的使用多区域密钥

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

重要

加密数据的复制是完全在 Amazon S3 内部执行的服务器端过程。不会复制使用具有客户提供的加密密钥的服务器端加密 (SSE-C) 创建的对象。

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

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

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

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

<ReplicationConfiguration> <Rule> ... <SourceSelectionCriteria> <SseKmsEncryptedObjects> <Status>Enabled</Status> </SseKmsEncryptedObjects> </SourceSelectionCriteria> <Destination> ... <EncryptionConfiguration> <ReplicaKmsKeyID>Amazon KMS key ID for the Amazon Web Services 区域 of the destination bucket.</ReplicaKmsKeyID> </EncryptionConfiguration> </Destination> ... </Rule> </ReplicationConfiguration>
重要

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

Amazon KMS CMK 必须 有效。PUT 存储桶复制 API 不会检查 Amazon 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 Amazon KMS key ID for the Amazon Web Services 区域 of the destination buckets (S3 uses it to encrypt object replicas).</ReplicaKmsKeyID> </EncryptionConfiguration> </Destination> <SourceSelectionCriteria> <SseKmsEncryptedObjects> <Status>Enabled</Status> </SseKmsEncryptedObjects> </SourceSelectionCriteria> </Rule> </ReplicationConfiguration>

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

为 IAM 角色授予额外权限

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

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

    注意

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

  • kms:Decryptkms:Encrypt Amazon KMS 操作

    • 用于解密源对象的 kms:Decrypt CMK 的 Amazon KMS 权限

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

我们建议您将这些权限仅限于使用 Amazon KMS 条件键的目标存储桶和对象。对于策略中列出的 Amazon KMS CMK,拥有 IAM 角色的 Amazon Web Services 账户 必须具有这些 Amazon KMS 操作(kms:Encryptkms:Decrypt)的权限。如果 Amazon KMS CMK 由另一个 Amazon Web Services 账户 拥有,则 CMK 拥有者必须向拥有 IAM 角色的 Amazon Web Services 账户 授予这些权限。有关管理对这些 CMK 的访问的更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的使用具有 Amazon KMS 的IAM 策略

Amazon S3 存储桶密钥和复制

当为源存储桶和目标存储桶启用 S3 存储桶密钥时,加密上下文将是存储桶 Amazon Resource Name (ARN),而不是对象 ARN,例如 arn:aws:s3:::bucket_ARN。您需要更新 IAM 策略才能将存储桶 ARN 用于加密上下文。但是,如果 S3 存储桶密钥仅在目标存储桶启用,而未在源存储桶上启用,则无需更新 IAM 策略即可将存储桶 ARN 用于加密上下文。

下面的示例显示了带存储桶 ARN 的加密上下文。

"kms:EncryptionContext:aws:s3:arn": [ "arn:aws:s3:::bucket_ARN" ]

有关更多信息,请参阅 加密上下文启用 S3 存储桶密钥之前需要注意的更改

示例策略 – 将 Amazon KMS 服务器端加密 (SSE-KMS) 与复制结合使用

以下 IAM 策略示例显示了将 Amazon KMS 服务器端加密与复制结合使用的语句。

在此示例中,加密上下文为对象 ARN。如果在使用 SSE-KMS 时启用S3 存储桶密钥,则必须将存储桶 ARN 用作加密上下文。有关更多信息,请参阅 加密上下文

如果

例 使用 Amazon KMS 服务器端加密 (SSE-KMS) – 单独的目标存储桶

以下示例策略显示了将 Amazon KMS 与单独的目标存储桶结合使用的语句。

{ "Version": "2012-10-17", "Statement": [{ "Action": ["kms:Decrypt"], "Effect": "Allow", "Resource": "List of Amazon KMS key ARNs used to encrypt source objects.", "Condition": { "StringLike": { "kms:ViaService": "s3.source-bucket-region.amazonaws.com", "kms:EncryptionContext:aws:s3:arn": "arn:aws:s3:::source-bucket-name/key-prefix1/*" } } }, { "Action": ["kms:Encrypt"], "Effect": "Allow", "Resource": "Amazon KMS key ARNs (for the Amazon Web Services 区域 of the destination bucket 1). Used to encrypt object replicas created in destination bucket 1.", "Condition": { "StringLike": { "kms:ViaService": "s3.destination-bucket-1-region.amazonaws.com", "kms:EncryptionContext:aws:s3:arn": "arn:aws:s3:::destination-bucket-name-1/key-prefix1/*" } } }, { "Action": ["kms:Encrypt"], "Effect": "Allow", "Resource": "Amazon KMS key ARNs (for the Amazon Web Services 区域 of destination bucket 2). Used to encrypt object replicas created in destination bucket 2.", "Condition": { "StringLike": { "kms:ViaService": "s3.destination-bucket-2-region.amazonaws.com", "kms:EncryptionContext:aws:s3:arn": "arn:aws:s3:::destination-bucket-2-name/key-prefix1*" } } } ] }

例 复制使用具有 Amazon S3 托管加密密钥和 中存储的 CMK 的服务器端加密创建的对象Amazon KMS

以下是一个完整的 IAM 策略,它授予所需的权限以复制未加密的对象,以及使用具有 Amazon S3 托管加密密钥和 中存储的 CMK 的服务器端加密创建的对象Amazon 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 Amazon KMS key ARNs 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":[ "Amazon KMS key ARNs (for the Amazon Web Services 区域 of the destination buckets) to use for encrypting object replicas" ] } ] }

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

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

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

  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon Key Management Service (Amazon KMS) 控制台:https://console.aws.amazon.com/kms

  2. 要更改 Amazon 区域,请使用页面右上角的 Region selector (区域选择器)。

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

  4. 选择 CMK。

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

  6. 选择 Other Amazon Web Services 账户 s (其他 Amazon 账户)

  7. 选择 Add another Amazon Web Services 账户 (添加其他 Amazon 账户)

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

  9. 选择 Save Changes

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

Amazon KMS 事务限制注意事项

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

要请求提高限制,请使用服务配额。有关更多信息,请参阅 Amazon Web Services 限制。如果您所在区域不支持 Service Quotas,请创建一个 Amazon Web Services Support 案例