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

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

重要

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

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

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

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

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

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

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

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

有关带分步说明的示例,请参阅为加密对象启用复制。有关创建复制配置的信息,请参阅在区域内和跨区域复制对象

注意

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

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

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

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

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

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

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

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

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

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

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

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

有关带分步说明的示例,请参阅为加密对象启用复制。有关创建复制配置的信息,请参阅在区域内和跨区域复制对象

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

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

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

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

<ReplicationConfiguration> <Rule> ... <SourceSelectionCriteria> <SseKmsEncryptedObjects> <Status>Enabled</Status> </SseKmsEncryptedObjects> </SourceSelectionCriteria> <Destination> ... <EncryptionConfiguration> <ReplicaKmsKeyID>Amazon KMS key ARN or Key Alias ARN that's in the same Amazon Web Services 区域 as the destination bucket.</ReplicaKmsKeyID> </EncryptionConfiguration> </Destination> ... </Rule> </ReplicationConfiguration>
重要
  • 必须已在目标存储桶所在的同一 Amazon Web Services 区域中创建 KMS 密钥。

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

以下示例显示了一个包含可选配置元素的复制配置。此复制配置包含一个规则。该规则应用于键前缀为 Tax 的对象。Amazon S3 使用指定的 Amazon 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:::amzn-s3-demo-destination-bucket</Bucket> <EncryptionConfiguration> <ReplicaKmsKeyID>Amazon KMS key ARN or Key Alias ARN that's in the same Amazon Web Services 区域 as the destination bucket.</ReplicaKmsKeyID> </EncryptionConfiguration> </Destination> <SourceSelectionCriteria> <SseKmsEncryptedObjects> <Status>Enabled</Status> </SseKmsEncryptedObjects> </SourceSelectionCriteria> </Rule> </ReplicationConfiguration>

为 IAM 角色授予额外权限

要复制使用 SSE-S3、SSE-KMS 或 DSSE-KMS 静态加密的对象,请向您在复制配置中指定的 Amazon 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 Amazon KMS 操作

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

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

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

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

S3 存储桶密钥和复制

要将复制与 S3 存储桶密钥结合使用,用于加密对象副本的 KMS 密钥的 Amazon 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:::amzn-s3-demo-source-bucket/key-prefix1*" ] } }, "Resource": [ "List of Amazon 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:::amzn-s3-demo-destination-bucket1/key-prefix1*" ] } }, "Resource": [ "Amazon KMS key ARNs (in the same Amazon Web Services 区域 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:::amzn-s3-demo-destination-bucket2/key-prefix1*" ] } }, "Resource": [ "Amazon KMS key ARNs (in the same Amazon Web Services 区域 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:::amzn-s3-demo-source-bucket" ] }, { "Effect":"Allow", "Action":[ "s3:GetObjectVersionForReplication", "s3:GetObjectVersionAcl" ], "Resource":[ "arn:aws:s3:::amzn-s3-demo-source-bucket/key-prefix1*" ] }, { "Effect":"Allow", "Action":[ "s3:ReplicateObject", "s3:ReplicateDelete" ], "Resource":"arn:aws:s3:::amzn-s3-demo-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:::amzn-s3-demo-source-bucket/key-prefix1*" ] } }, "Resource":[ "List of the Amazon 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:::amzn-s3-demo-destination-bucket/prefix1*" ] } }, "Resource":[ "Amazon KMS key ARNs (in the same Amazon Web Services 区域 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:::amzn-s3-demo-source-bucket" ] }, { "Effect":"Allow", "Action":[ "s3:GetObjectVersionForReplication", "s3:GetObjectVersionAcl" ], "Resource":[ "arn:aws:s3:::amzn-s3-demo-source-bucket/key-prefix1*" ] }, { "Effect":"Allow", "Action":[ "s3:ReplicateObject", "s3:ReplicateDelete" ], "Resource":"arn:aws:s3:::amzn-s3-demo-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:::amzn-s3-demo-source-bucket" ] } }, "Resource":[ "List of the Amazon 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:::amzn-s3-demo-destination-bucket" ] } }, "Resource":[ "Amazon KMS key ARNs (in the same Amazon Web Services 区域 as the destination bucket) to use for encrypting object replicas" ] } ] }

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

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

注意

如果您需要跨账户复制 SSE-KMS 数据,则复制规则必须指定来自目标账户 Amazon KMS 的客户托管式密钥Amazon 托管式密钥不支持跨账户使用,因此不能用于执行跨账户复制。

向源存储桶拥有者授予使用 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. 一般配置部分下,选择密钥策略选项卡。

  6. 向下滚动到其他 Amazon Web Services 账户

  7. 选择添加其他 Amazon Web Services 账户

    将显示其它 Amazon Web Services 账户对话框。

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

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

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

Amazon KMS 事务限额注意事项

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

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

为加密对象启用复制

默认情况下,Amazon S3 不会复制使用具有 Amazon Key Management Service(Amazon KMS)密钥的服务器端加密(SSE-KMS)或具有 Amazon KMS 密钥的双层服务器端加密(DSSE-KMS)加密的对象。要复制用 SSE-KMS 或 DSS-KMS 加密的对象,必须修改存储桶复制配置,以指示 Amazon S3 复制这些对象。此示例介绍如何使用 Amazon S3 控制台和 Amazon Command Line Interface(Amazon CLI)更改存储桶复制配置以允许复制加密对象。

注意

当为源或目标存储桶启用 S3 存储桶密钥时,加密上下文将是存储桶的 Amazon 资源名称 (ARN),而不是对象的 ARN。您必须更新 IAM 策略才能将存储桶 ARN 用于加密上下文。有关更多信息,请参阅 S3 存储桶密钥和复制

注意

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

如需分步指导,请参阅 针对同一账户中的存储桶配置复制。本主题提供了在源存储桶和目标存储桶由相同和不同的 Amazon Web Services 账户拥有时设置复制配置的说明。

要使用 Amazon CLI 复制加密的对象,请执行以下操作:

  • 创建源存储桶和目标存储桶,并对这些存储桶启用版本控制。

  • 创建向 Amazon S3 授予复制对象的权限的 Amazon Identity and Access Management(IAM)服务角色。IAM 角色的权限包含复制这些加密对象所需的权限。

  • 将复制配置添加到源存储桶。复制配置提供与复制使用 KMS 密钥加密的对象相关的信息。

  • 将加密的对象添加到源存储桶。

  • 测试设置,以确认加密的对象正在复制到目标存储桶。

以下过程指导您完成此过程。

复制服务器端加密对象 (Amazon CLI)

要在此过程中使用这些示例,请将 user input placeholders 替换为您自己的信息。

  1. 在此示例中,您在同一个 Amazon Web Services 账户中创建源存储桶 (amzn-s3-demo-source-bucket) 和目标存储桶 (amzn-s3-demo-destination-bucket)。还可以为 Amazon CLI 设置凭证配置文件。此示例使用配置文件名称 acctA

    有关设置凭证配置文件和使用命名配置文件的信息,请参阅《Amazon Command Line Interface 用户指南》中的 Configuration and credential file settings

  2. 使用以下命令创建 amzn-s3-demo-source-bucket 存储桶并对该存储桶启用版本控制。以下示例命令在美国东部(弗吉尼亚州北部)(us-east-1)区域中创建 amzn-s3-demo-source-bucket 存储桶。

    aws s3api create-bucket \ --bucket amzn-s3-demo-source-bucket \ --region us-east-1 \ --profile acctA
    aws s3api put-bucket-versioning \ --bucket amzn-s3-demo-source-bucket \ --versioning-configuration Status=Enabled \ --profile acctA
  3. 使用以下命令创建 amzn-s3-demo-destination-bucket 存储桶并对该存储桶启用版本控制。以下示例命令在美国西部(俄勒冈州)(us-west-2)区域中创建 amzn-s3-demo-destination-bucket 存储桶。

    注意

    要在 amzn-s3-demo-source-bucket 存储桶和 amzn-s3-demo-destination-bucket 存储桶均位于同一 Amazon Web Services 账户中时设置复制配置,请使用同一配置文件。此示例使用 acctA。要在两个存储桶由不同 Amazon Web Services 账户拥有时配置复制,您需要为每个存储桶指定不同的配置文件。

    aws s3api create-bucket \ --bucket amzn-s3-demo-destination-bucket \ --region us-west-2 \ --create-bucket-configuration LocationConstraint=us-west-2 \ --profile acctA
    aws s3api put-bucket-versioning \ --bucket amzn-s3-demo-destination-bucket \ --versioning-configuration Status=Enabled \ --profile acctA
  4. 接下来,创建 IAM 服务角色。您将在稍后添加到 amzn-s3-demo-source-bucket 存储桶的复制配置中指定此角色。Amazon S3 担任此角色以代表您复制对象。分两个步骤创建 IAM 角色:

    • 创建服务角色。

    • 将权限策略附加到角色。

    1. 要创建 IAM 服务角色,请执行以下操作:

      1. 复制以下信任策略,并将其保存到本地计算机上当前目录中一个名为 s3-role-trust-policy-kmsobj.json 的文件。此策略授予 Amazon S3 服务主体担任该角色的权限,以便 Amazon S3 可代表您执行任务。

        { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":"s3.amazonaws.com" }, "Action":"sts:AssumeRole" } ] }
      2. 使用以下命令创建角色:

        $ aws iam create-role \ --role-name replicationRolekmsobj \ --assume-role-policy-document file://s3-role-trust-policy-kmsobj.json \ --profile acctA
    2. 接下来,将权限策略附加到角色。此策略授予对各种 Amazon S3 存储桶和对象操作的权限。

      1. 复制以下权限策略,并将其保存到本地计算机上当前目录中一个名为 s3-role-permissions-policykmsobj.json 的文件。您将创建一个 IAM 角色,稍后将策略附加到该角色。

        重要

        在权限策略中,您可以指定将用于加密 amzn-s3-demo-source-bucketamzn-s3-demo-destination-bucket 存储桶的 Amazon KMS 密钥 ID。您必须为 amzn-s3-demo-source-bucketamzn-s3-demo-destination-bucket 存储桶创建两个单独的 KMS 密钥。Amazon KMS keys不会在创建它们的 Amazon Web Services 区域之外共享。

        { "Version":"2012-10-17", "Statement":[ { "Action":[ "s3:ListBucket", "s3:GetReplicationConfiguration", "s3:GetObjectVersionForReplication", "s3:GetObjectVersionAcl", "s3:GetObjectVersionTagging" ], "Effect":"Allow", "Resource":[ "arn:aws:s3:::amzn-s3-demo-source-bucket", "arn:aws:s3:::amzn-s3-demo-source-bucket/*" ] }, { "Action":[ "s3:ReplicateObject", "s3:ReplicateDelete", "s3:ReplicateTags" ], "Effect":"Allow", "Condition":{ "StringLikeIfExists":{ "s3:x-amz-server-side-encryption":[ "aws:kms", "AES256", "aws:kms:dsse" ], "s3:x-amz-server-side-encryption-aws-kms-key-id":[ "Amazon KMS key IDs(in ARN format) to use for encrypting object replicas" ] } }, "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/*" }, { "Action":[ "kms:Decrypt" ], "Effect":"Allow", "Condition":{ "StringLike":{ "kms:ViaService":"s3.us-east-1.amazonaws.com", "kms:EncryptionContext:aws:s3:arn":[ "arn:aws:s3:::amzn-s3-demo-source-bucket/*" ] } }, "Resource":[ "Amazon KMS key IDs(in ARN format) used to encrypt source objects." ] }, { "Action":[ "kms:Encrypt" ], "Effect":"Allow", "Condition":{ "StringLike":{ "kms:ViaService":"s3.us-west-2.amazonaws.com", "kms:EncryptionContext:aws:s3:arn":[ "arn:aws:s3:::amzn-s3-demo-destination-bucket/*" ] } }, "Resource":[ "Amazon KMS key IDs (in ARN format) to use for encrypting object replicas" ] } ] }
      2. 创建一个策略并将其附加到角色。

        $ aws iam put-role-policy \ --role-name replicationRolekmsobj \ --policy-document file://s3-role-permissions-policykmsobj.json \ --policy-name replicationRolechangeownerPolicy \ --profile acctA
  5. 接下来,将以下复制配置添加到 amzn-s3-demo-source-bucket 存储桶。它指示 Amazon S3 将前缀为 Tax/ 的对象复制到 amzn-s3-demo-destination-bucket 存储桶。

    重要

    在复制配置中,指定 Amazon S3 可代入的 IAM 角色。仅当您具有 iam:PassRole 权限时,才能执行此操作。您在 CLI 命令中指定的配置文件必须具有此权限。有关更多信息,请参阅《IAM 用户指南》中的向用户授予将角色传递给 Amazon Web Services 服务的权限

    <ReplicationConfiguration> <Role>IAM-Role-ARN</Role> <Rule> <Priority>1</Priority> <DeleteMarkerReplication> <Status>Disabled</Status> </DeleteMarkerReplication> <Filter> <Prefix>Tax</Prefix> </Filter> <Status>Enabled</Status> <SourceSelectionCriteria> <SseKmsEncryptedObjects> <Status>Enabled</Status> </SseKmsEncryptedObjects> </SourceSelectionCriteria> <Destination> <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket> <EncryptionConfiguration> <ReplicaKmsKeyID>Amazon KMS key IDs to use for encrypting object replicas</ReplicaKmsKeyID> </EncryptionConfiguration> </Destination> </Rule> </ReplicationConfiguration>

    要将复制配置添加到 amzn-s3-demo-source-bucket 存储桶,请执行以下操作:

    1. Amazon CLI 要求以 JSON 形式指定复制配置。将以下 JSON 保存到本地计算机上当前目录中的一个文件 (replication.json)。

      { "Role":"IAM-Role-ARN", "Rules":[ { "Status":"Enabled", "Priority":1, "DeleteMarkerReplication":{ "Status":"Disabled" }, "Filter":{ "Prefix":"Tax" }, "Destination":{ "Bucket":"arn:aws:s3:::amzn-s3-demo-destination-bucket", "EncryptionConfiguration":{ "ReplicaKmsKeyID":"Amazon KMS key IDs (in ARN format) to use for encrypting object replicas" } }, "SourceSelectionCriteria":{ "SseKmsEncryptedObjects":{ "Status":"Enabled" } } } ] }
    2. 编辑 JSON 以提供 amzn-s3-demo-destination-bucket 存储桶、Amazon KMS key IDs (in ARN format)IAM-role-ARN 的值。保存更改。

    3. 使用以下命令以将复制配置添加到 amzn-s3-demo-source-bucket 存储桶中。请务必提供 amzn-s3-demo-source-bucket 存储桶名称。

      $ aws s3api put-bucket-replication \ --replication-configuration file://replication.json \ --bucket amzn-s3-demo-source-bucket \ --profile acctA
  6. 测试该配置以确认已经复制了加密对象。在 Amazon S3 控制台中,执行以下操作:

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

    2. amzn-s3-demo-source-bucket 存储桶中,创建一个名为 Tax 的文件夹。

    3. 将示例对象添加到文件夹。请务必选择加密选项并指定用于加密对象的 KMS 密钥。

    4. 确认 amzn-s3-demo-destination-bucket 存储桶包含对象副本,并且它们已使用在配置中指定的 KMS 密钥进行了加密。有关更多信息,请参阅 获取复制状态信息

有关显示如何添加复制配置的代码示例,请参阅使用 Amazon SDK。您必须适当地修改复制配置。