跨账户从SSE-KMS加密S3桶复制至默认SSE-S3加密桶的配置问题
跨账户复制SSE-KMS加密S3对象到SSE-S3加密桶的解决方案
核心问题根源
AWS控制台在启用「复制KMS加密对象」选项后,存在UI层面的强制限制——必须指定目标KMS密钥,但实际上AWS API/CLI支持配置目标对象使用默认SSE-S3加密,无需指定自定义KMS密钥,这就是你在控制台遇到矛盾的原因。
可行解决方案
放弃AWS控制台配置,改用AWS CLI或CloudFormation配置跨账户复制(CRR)规则,具体步骤如下:
确认源账户的CRR角色权限
确保该角色具备以下权限:- 源桶的
s3:GetObject、s3:GetObjectVersion权限(需包含允许使用源KMS密钥解密的条件) - 目标桶的
s3:PutObject权限 - 源KMS密钥的
kms:Decrypt权限(需在KMS密钥的权限策略中添加该角色的访问许可)
示例角色权限策略片段:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::source-bucket/*", "Condition": { "StringEquals": { "s3:x-amz-server-side-encryption": "aws:kms" } } }, { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::destination-bucket/*" }, { "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws:kms:source-region:source-account-id:key/source-kms-key-id" } ] }- 源桶的
配置目标桶的权限策略
允许源账户的CRR角色向目标桶写入对象:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::source-account-id:role/crr-replication-role" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::destination-bucket/*" } ] }使用CLI配置CRR规则
运行以下CLI命令,替换占位符为实际值:aws s3api put-bucket-replication \ --bucket source-bucket \ --replication-configuration '{ "Role": "arn:aws:iam::source-account-id:role/crr-replication-role", "Rules": [ { "ID": "ReplicateSSEKMStoSSES3", "Status": "Enabled", "Priority": 1, "SourceSelectionCriteria": { "SseKmsEncryptedObjects": { "Status": "Enabled" } }, "Destination": { "Bucket": "arn:aws:s3:::destination-bucket", "Account": "destination-account-id" } } ] }'关键细节:
Destination中未指定EncryptionConfiguration,此时复制的对象会自动使用目标桶的默认SSE-S3加密,无需额外KMS密钥。
补充说明
- 按上述配置完成后,复制的对象会继承目标桶的SSE-S3加密,数据使用者无需额外KMS权限即可读取,完全符合你的初始需求。
- 反向操作(SSE-S3到SSE-KMS)可行的原因是:源对象无KMS加密,无需启用「复制KMS加密对象」选项,因此控制台无需强制指定目标KMS密钥(或指定后可通过KMS权限配置完成授权)。
内容的提问来源于stack exchange,提问作者Andrei
相关产品推荐
相关产品推荐

