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

复制使用服务器端加密(SSE-C、SSE-S3、SSE-KMS)创建的对象

复制加密对象(SSE-C)

使用具有客户提供的密钥的服务器端加密(SSE-C),您可以管理专有密钥。使用 SSE-C,您可以管理密钥,而 Amazon S3 管理加密和解密过程。您必须在请求中提供加密密钥,但无需编写任何代码即可执行对象加密或解密。在上载对象时,Amazon S3 将使用您提供的密钥加密对象。然后,Amazon S3 将该密钥从内存中清除。在检索对象时,必须提供相同的加密密钥作为您请求的一部分。有关更多信息,请参阅使用具有客户提供的密钥的服务器端加密(SSE-C)

S3 复制支持使用 SSE-C 加密的对象。您可以在 Amazon S3 控制台中或使用 Amazon SDK 配置 SSE-C 对象复制,方法与为未加密对象配置复制的方法相同。根据您的 S3 复制配置,如果符合条件,S3 复制会自动复制新上载的 SSE-C 加密对象。要复制桶中的现有对象,请使用 S3 分批复制。除了复制当前所需的权限外,没有其他的 SSE-C 权限。有关复制对象的更多信息,请参阅设置复制使用 S3 分批复制以复制现有对象

复制 SSE-C 对象不会产生额外的费用。有关复制定价的详细信息,请参阅 Amazon S3 定价页面

复制加密的对象(SSE-S3、SSE-KMS)

原定设置情况下,Amazon S3 不会复制使用具有 Amazon KMS 中存储的 Amazon KMS keys 的服务器端加密静态存储的对象。本节介绍您可以添加的其他配置以指示 Amazon S3 复制这些对象。

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

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

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

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

  • 通过添加 SourceSelectionCriteria 元素,显式选择启用对使用 KMS 密钥加密的对象进行复制。

<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 区域 中创建 KMS 密钥。

KMS 密钥必须有效。PUT 桶复制 API 操作不检查 KMS 密钥的有效性。如果使用的 KMS 密钥无效,您将在响应中收到 HTTP 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 this key to encrypt object replicas.)</ReplicaKmsKeyID> </EncryptionConfiguration> </Destination> <SourceSelectionCriteria> <SseKmsEncryptedObjects> <Status>Enabled</Status> </SseKmsEncryptedObjects> </SourceSelectionCriteria> </Rule> </ReplicationConfiguration>

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

为 IAM 角色授予额外权限

要复制使用 Amazon KMS 静态加密的对象,请向您在复制配置中指定的 Amazon Identity and Access Management(IAM)角色授予以下其他权限。通过更新与 IAM 角色关联的权限策略,可授予这些权限。

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

    注意

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

  • 针对 KMS 密钥的 kms:Decryptkms:Encrypt Amazon KMS 操作

    • 您必须授予对 Amazon KMS key(用于解密源对象)的 kms:Decrypt 权限。

    • 您必须授予对 kms:Encrypt(用于加密对象副本)的 Amazon KMS key 权限。

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

Amazon S3 存储桶密钥和复制

要将复制与 S3 桶密钥结合使用,用于加密对象副本的 KMS 密钥的 Amazon KMS key 策略必须包含发出调用的主体的 kms:Decrypt 权限。对 kms:Decrypt 的调用会在使用 S3 存储桶密钥之前验证 S3 存储桶密钥的完整性。有关更多信息,请参阅将 S3 存储桶密钥与复制功能结合使用

当为源桶或目标桶启用 S3 桶密钥时,加密上下文将是桶 Amazon 资源名称(ARN),而不是对象 ARN(例如 arn:aws:s3:::bucket_ARN)。您必须更新 IAM policy 才能将桶 ARN 用于加密上下文:

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

有关更多信息,请参阅 密上下文 (x-amz-server-side-encryption-context)启用 S3 存储桶密钥之前需要注意的更改

示例策略 – 将 SSE-S3 和 SSE-KMS 与复制结合使用

以下 IAM policy 示例显示了将 SSE-S3 和 SSE-KMS 与复制结合使用的语句。

例 :使用 SSE-KMS – 单独的目标桶

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

{ "Action": ["kms:Decrypt"], "Effect": "Allow", "Condition": { "StringLike": { "kms:ViaService": "s3.source-bucket-region.amazonaws.com", "kms:EncryptionContext:arn:aws: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-1-region.amazonaws.com", "kms:EncryptionContext:aws:s3:arn": [ "arn:aws:s3:::destination-bucket-name-1/key-prefix1*", ] } }, "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.", ] }, { "Action": ["kms:Encrypt"], "Effect": "Allow", "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*", ] } }, "Resource": [ "Amazon KMS key ARNs (for the Amazon Web Services 区域 of destination bucket 2). Used to encrypt object replicas created in destination bucket 2.", ] }

例 :复制使用 SSE-S3 和 SSE-KMS 创建的对象

以下是一个完整的 IAM policy,它授予所需的权限以复制未加密的对象、使用 SSE-S3 创建的对象以及使用 SSE-KMS 创建的对象。

{ "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 账户拥有),您可以使用 KMS 密钥加密对象副本。但是,KMS 密钥拥有者必须向源存储桶拥有者授予使用 KMS 密钥的权限。

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

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

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

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

  4. 请选择 KMS 密钥。

  5. General configuration (一般配置) 下,请选择 Key policy (密钥策略) 选项卡。

  6. 向下滚动到 Other Amazon Web Services 账户(其他 Amazon Web Services 账户)。

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

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

  9. 选择保存

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

Amazon KMS 事务限额注意事项

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

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