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

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

重要

Amazon S3 现在将具有 Amazon S3 托管密钥的服务器端加密(SSE-S3)作为 Amazon S3 中每个存储桶的基本加密级别。从 2023 年 1 月 5 日起,上传到 Amazon S3 的所有新对象都将自动加密,不会产生额外费用,也不会影响性能。S3 存储桶默认加密配置和上传的新对象的自动加密状态可在 AWS CloudTrail 日志、S3 清单、S3 Storage Lens 存储统计管理工具、Amazon S3 控制台中获得,并可用作 AWS Command Line Interface 和 AWS SDK 中的附加 Amazon S3 API 响应标头。有关更多信息,请参阅默认加密常见问题解答

在复制已使用服务器端加密进行加密的对象时,有一些特殊注意事项。Amazon S3 支持以下服务器端加密类型:

  • 具有 Amazon S3 托管密钥的服务器端加密(SSE-S3)

  • 具有 AWS Key Management Service(AWS KMS)密钥的服务器端加密(SSE-KMS)

  • 具有 AWS KMS 密钥的双层服务器端加密(DSSE-KMS)

  • 具有客户提供密钥的服务器端加密(SSE-C)

有关服务器端加密的更多信息,请参阅 使用服务器端加密保护数据

本主题介绍指示 Amazon S3 复制已使用服务器端加密进行加密的对象所需的权限。本主题还提供了您可以添加的其他配置元素以及授予复制加密对象所需权限的示例 AWS Identity and Access Management(IAM)策略。

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

注意

您可以在 Amazon S3 中使用多区域 AWS KMS keys。但是,Amazon S3 目前将多区域密钥视为单区域密钥,且不使用密钥的多区域特征。有关更多信息,请参阅 AWS Key Management Service 开发人员指南中的使用多区域密钥

默认存储桶加密如何影响复制

在为复制目标存储桶启用默认加密后,将应用以下加密行为:

  • 如果未对源存储桶中的对象进行加密,则将使用目标存储桶的默认加密设置对目标存储桶中的副本对象进行加密。因此,源对象的实体标签(ETag)与副本对象的 ETag 不同。如果您有使用 ETag 的应用程序,则必须更新这些应用程序以弥补这种差异。

  • 如果使用具有 Amazon S3 托管密钥的服务器端加密(SSE-S3)、具有 AWS Key Management Service(AWS KMS)密钥的服务器端加密(SSE-KMS)或具有 AWS KMS 密钥的双层服务器端加密(DSSE-KMS)来加密源存储桶中的对象,则目标存储桶中的副本对象使用与源对象相同类型的加密。不会使用目标存储桶的默认加密设置。

复制使用 SSE-C 加密的对象

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

S3 复制支持使用 SSE-C 加密的对象。您可以在 Amazon S3 控制台中或使用 AWS SDK 配置 SSE-C 对象复制,方法与为未加密对象配置复制的方法相同。除了复制当前所需的权限外,没有其他的 SSE-C 权限。

根据在 S3 复制配置中指定的内容,如果符合条件,S3 复制会自动复制新上传的 SSE-C 加密对象。要复制存储桶中的现有对象,请使用 S3 批量复制。有关复制对象的更多信息,请参阅设置复制使用 S3 分批复制以复制现有对象

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

复制使用 SSE-S3、SSE-KMS 或 DSSE-KMS 加密的对象

默认情况下,Amazon S3 不会复制使用 SSE-KMS 或 DSSE-KMS 加密的对象。本节介绍您可以添加的其他配置元素以指示 Amazon S3 复制这些对象。

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

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

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

  • 在复制配置的 Destination 元素中,添加您希望 Amazon S3 用来加密对象副本的对称 AWS KMS 客户托管密钥的 ID,如下面的复制配置示例所示。

  • 明确选择支持复制使用 KMS 密钥(SSE-KMS 或 DSSE-KMS)加密的对象。要选择加入,请添加 SourceSelectionCriteria 元素,如以下复制配置示例所示。

<ReplicationConfiguration> <Rule> ... <SourceSelectionCriteria> <SseKmsEncryptedObjects> <Status>Enabled</Status> </SseKmsEncryptedObjects> </SourceSelectionCriteria> <Destination> ... <EncryptionConfiguration> <ReplicaKmsKeyID>AWS KMS key ARN or Key Alias ARN that's in the same AWS 区域 as the destination bucket.</ReplicaKmsKeyID> </EncryptionConfiguration> </Destination> ... </Rule> </ReplicationConfiguration>
重要

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

KMS 密钥必须有效。PutBucketReplication API 操作不检查 KMS 密钥的有效性。如果使用的 KMS 密钥无效,您将在响应中收到 HTTP 200 OK 状态代码,但复制将失败。

以下示例显示了一个包含可选配置元素的复制配置。此复制配置包含一个规则。该规则应用于键前缀为 Tax 的对象。Amazon S3 使用指定的 AWS KMS key ID 来加密这些对象副本。

<?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:::DOC-EXAMPLE-DESTINATION-BUCKET</Bucket> <EncryptionConfiguration> <ReplicaKmsKeyID>AWS KMS key ARN or Key Alias ARN that's in the same AWS 区域 as the destination bucket. (S3 uses this key to encrypt object replicas.)</ReplicaKmsKeyID> </EncryptionConfiguration> </Destination> <SourceSelectionCriteria> <SseKmsEncryptedObjects> <Status>Enabled</Status> </SseKmsEncryptedObjects> </SourceSelectionCriteria> </Rule> </ReplicationConfiguration>

为 IAM 角色授予额外权限

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

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

    注意

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

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

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

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

  • 用于复制明文对象的 kms:GenerateDataKey 操作 – 如果将明文对象复制到默认情况下启用 SSE-KMS 或 DSSE-KMS 加密的存储桶中,则必须在 IAM 策略中包含目标加密上下文的 kms:GenerateDataKey 权限和 KMS 密钥。

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

S3 存储桶密钥和复制

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

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

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

有关更多信息,请参阅加密上下文(x-amz-server-side-encryption-context)(在“使用 REST API”一节中)和启用 S3 存储桶密钥之前需要注意的更改

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

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

例 – 将 SSE-KMS 用于单独的目标存储桶

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

{ "Version":"2012-10-17", "Statement":[ { "Action": ["kms:Decrypt"], "Effect": "Allow", "Condition": { "StringLike": { "kms:ViaService": "s3.source-bucket-region.amazonaws.com", "kms:EncryptionContext:aws:s3:arn": [ "arn:aws:s3:::DOC-EXAMPLE-SOURCE-BUCKET/key-prefix1*" ] } }, "Resource": [ "List of AWS KMS key ARNs that are 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:::DOC-EXAMPLE-DESTINATION-BUCKET1/key-prefix1*" ] } }, "Resource": [ "AWS KMS key ARNs (in the same AWS 区域 as 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:::DOC-EXAMPLE-DESTINATION-BUCKET2/key-prefix1*" ] } }, "Resource": [ "AWS KMS key ARNs (in the same AWS 区域 as destination bucket 2). Used to encrypt object replicas created in destination bucket 2." ] } ] }
例 – 复制使用 SSE-S3 和 SSE-KMS 创建的对象

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

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetReplicationConfiguration", "s3:ListBucket" ], "Resource":[ "arn:aws:s3:::DOC-EXAMPLE-SOURCE-BUCKET" ] }, { "Effect":"Allow", "Action":[ "s3:GetObjectVersionForReplication", "s3:GetObjectVersionAcl" ], "Resource":[ "arn:aws:s3:::DOC-EXAMPLE-SOURCE-BUCKET/key-prefix1*" ] }, { "Effect":"Allow", "Action":[ "s3:ReplicateObject", "s3:ReplicateDelete" ], "Resource":"arn:aws:s3:::DOC-EXAMPLE-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:::DOC-EXAMPLE-SOURCE-BUCKET/key-prefix1*" ] } }, "Resource":[ "List of the AWS KMS key ARNs that are 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:::DOC-EXAMPLE-DESTINATION-BUCKET/prefix1*" ] } }, "Resource":[ "AWS KMS key ARNs (in the same AWS 区域 as the destination bucket) to use for encrypting object replicas" ] } ] }
例 – 使用 S3 存储桶密钥复制对象

以下是一个完整的 IAM 策略,它授予复制具有 S3 存储桶密钥的对象所必需的权限。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetReplicationConfiguration", "s3:ListBucket" ], "Resource":[ "arn:aws:s3:::DOC-EXAMPLE-SOURCE-BUCKET" ] }, { "Effect":"Allow", "Action":[ "s3:GetObjectVersionForReplication", "s3:GetObjectVersionAcl" ], "Resource":[ "arn:aws:s3:::DOC-EXAMPLE-SOURCE-BUCKET/key-prefix1*" ] }, { "Effect":"Allow", "Action":[ "s3:ReplicateObject", "s3:ReplicateDelete" ], "Resource":"arn:aws:s3:::DOC-EXAMPLE-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:::DOC-EXAMPLE-SOURCE-BUCKET" ] } }, "Resource":[ "List of the AWS KMS key ARNs that are 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:::DOC-EXAMPLE-DESTINATION-BUCKET" ] } }, "Resource":[ "AWS KMS key ARNs (in the same AWS 区域 as the destination bucket) to use for encrypting object replicas" ] } ] }

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

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

注意

通过 AWS 托管式密钥 加密的对象无法跨账户共享,因为您无法修改密钥策略。如果您需要跨账户复制 SSE-KMS 数据,则必须使用来自 AWS KMS 的客户托管密钥

向源存储桶拥有者授予使用 KMS 密钥的权限(AWS KMS 控制台)
  1. 登录到 AWS Management Console,然后通过以下网址打开 AWS KMS 控制台:https://console.aws.amazon.com/kms

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

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

  4. 请选择 KMS 密钥。

  5. 一般配置部分下,选择密钥策略选项卡。

  6. 向下滚动到其他 AWS 账户

  7. 选择添加其他 AWS 账户

    将显示其他 AWS 账户对话框。

  8. 在此对话框中,选择添加其他 AWS 账户。对于 arn:aws:iam::,输入源存储桶账户 ID。

  9. 选择 Save changes(保存更改)

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

AWS KMS 事务限额注意事项

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

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