复制使用服务器端加密(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:Decrypt
和kms:Encrypt
Amazon KMS 操作-
您必须授予对 Amazon KMS key(用于解密源对象)的
kms:Decrypt
权限。 -
您必须授予对
kms:Encrypt
(用于加密对象副本)的 Amazon KMS key 权限。
-
我们建议您通过使用 Amazon KMS 条件键将这些权限仅限于目标桶和对象。对于策略中列出的 KMS 密钥,拥有 IAM 角色的 Amazon 账户必须具有执行这些 Amazon KMS 操作(kms:Encrypt
和 kms: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:::
)。您必须更新 IAM policy 才能将桶 ARN 用于加密上下文:bucket_ARN
"kms:EncryptionContext:aws:s3: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: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-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 控制台)
-
登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon KMS 控制台:https://console.aws.amazon.com/kms
。 -
要更改 Amazon Web Services 区域,请使用页面右上角的区域选择器。
-
要查看您账户中自己所创建和管理的密钥,请在导航窗格中选择 Customer managed keys (客户托管密钥)。
-
请选择 KMS 密钥。
-
在 General configuration (一般配置) 下,请选择 Key policy (密钥策略) 选项卡。
-
向下滚动到 Other Amazon Web Services 账户(其他 Amazon Web Services 账户)。
-
选择 Add other Amazon Web Services 账户(添加其他 Amazon Web Services 账户)。
-
对于 arn:aws:iam::,输入源桶账户 ID。
-
选择保存。
向源存储桶拥有者授予使用 KMS 密钥的权限 (Amazon CLI)
-
有关 Amazon CLI 命令的信息,请参阅《Amazon CLI 命令参考》中的
put-key-policy
。有关基础 API 的信息,请参阅 Amazon Key Management Service API 参考 中的PutKeyPolicy
。
Amazon KMS 事务限额注意事项
在启用跨区域复制(CRR)后添加使用 Amazon KMS 加密的许多新对象时,您可能会遇到节流(HTTP 503 服务不可用错误)。如果每秒 Amazon KMS 事务数超出当前限额,则会发生节流。有关更多信息,请参阅《Amazon Key Management Service 开发人员指南》中的配额
要请求增加限额,您可以使用服务限额。有关更多信息,请参阅 Amazon Web Services 限额。如果您所在区域不支持服务配额,请创建一个 Amazon Web Services Support 案例