复制通过 AWS KMS CMK 使用服务器端加密 (SSE) 创建的对象 - Amazon Simple Storage Service

欢迎使用新的 Amazon S3 用户指南! Amazon S3 用户指南结合了以下三个已停用的指南中的信息和说明:Amazon S3 开发人员指南Amazon S3 控制台用户指南Amazon S3 入门指南

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

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

重要

加密数据的复制是完全在 Amazon S3 内部执行的服务器端过程。复制不支持客户端加密。

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

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

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

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

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

<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 CMK。

AWS KMS CMK 必须 有效。PUT 存储桶复制 API 不会检查 AWS 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 AWS KMS key ID for the AWS region 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 使用 AWS KMS 密钥 ID 来加密这些对象副本。

为 IAM 角色授予额外权限

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

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

    注意

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

  • kms:Decryptkms:Encrypt AWS KMS 操作

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

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

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

Amazon S3 存储桶密钥和复制

要将复制与 S3 存储桶密钥结合使用,用于加密对象复制的 CMK 的 AWS KMS 密钥策略必须包含调用委托人的 kms:Decrypt 权限。对 kms:Decrypt 的调用会在使用 S3 存储桶密钥之前验证 S3 存储桶密钥的完整性。有关更多信息,请参阅 用于复制和上传的 kms:Decrypt 权限

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

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

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

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

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

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

如果

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

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

{ "Version": "2012-10-17", "Statement": [{ "Action": ["kms:Decrypt"], "Effect": "Allow", "Resource": "List of AWS 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": "AWS KMS key ARNs (for the AWS Region 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": "AWS KMS key ARNs (for the AWS Region 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 托管加密密钥和存储在 AWS KMS 中的 CMK 使用服务器端加密创建的对象

以下是一个完整的 IAM 策略,它授予所需的权限以复制未加密的对象,以及使用具有 Amazon S3 托管加密密钥和 AWS KMS 中存储的 CMK 的服务器端加密创建的对象。

注意

不会复制使用具有客户提供的加密密钥的服务器端加密 (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 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":[ "AWS KMS key ARNs (for the AWS Region of the destination buckets) to use for encrypting object replicas" ] } ] }

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

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

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

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

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

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

  4. 选择 CMK。

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

  6. 选择 Other AWS Accounts (其他 AWS 账户)

  7. 选择 Add another AWS Account (添加其他 AWS 账户)

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

  9. 选择 Save Changes

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

AWS KMS 事务限制注意事项

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

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