AWS S3桶策略如何实现跨账号用户仅允许桶内复制/移动?
问题场景与需求
来自另一个AWS账号(Account-B)的部分用户,需要拥有Account-A下Bucket-A的文件上传、删除及桶内复制/移动权限,但不允许读取Bucket-A内文件内容,防止敏感数据泄露(数据进入Bucket-A后仅可删除,不可流出)。
Put和Delete权限配置较为简单,但无法找到s3:GetObject权限与条件的组合,来实现仅允许在Bucket-A内执行s3:CopyObject操作。当前Bucket-A的策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "${account_b_id}" }, "Action": [ "s3:ListBucket", "s3:ListMultipartUploadParts", "s3:GetBucketVersioning", "s3:ListBucketVersions", "s3:DeleteObject", "s3:PutObject", "s3:PutObjectAcl", "s3:GetBucketOwnershipControls", "s3:GetObject" <--- Required for CopyObject, but would allow file exfiltration to Account-B ], "Resource": [ "${bucket_a_name}/*", "${bucket_a_name}" ], "Condition": { "StringEquals": { "aws:PrincipalOrgID": "${organization_id}" } } } ] }
原本期望有类似s3:x-amz-copy-source的目标端条件,但似乎没有相关选项。请问仅通过桶权限策略能否实现该需求?
解决方案
可以仅通过桶权限策略实现该需求,核心思路是拆分权限,限制s3:GetObject仅用于桶内复制场景,同时确保s3:CopyObject的目标只能是Bucket-A。具体配置如下:
- 移除全局
s3:GetObject权限:不要直接允许s3:GetObject,而是通过条件限制该权限仅在执行s3:CopyObject时生效,且源对象和目标对象都属于Bucket-A。 - 明确配置
s3:CopyObject权限并限制目标桶:用ArnLike匹配目标对象的ARN为Bucket-A下的资源,确保复制操作无法指向外部桶。 - 用
Condition关联s3:GetObject与复制操作:通过StringEquals匹配aws:CalledVia为s3:CopyObject,确保s3:GetObject只能被复制操作触发,而不能直接读取。
修改后的Bucket-A策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccountBOperationsExceptRead", "Effect": "Allow", "Principal": { "AWS": "${account_b_id}" }, "Action": [ "s3:ListBucket", "s3:ListMultipartUploadParts", "s3:GetBucketVersioning", "s3:ListBucketVersions", "s3:DeleteObject", "s3:PutObject", "s3:PutObjectAcl", "s3:GetBucketOwnershipControls", "s3:CopyObject" ], "Resource": [ "${bucket_a_name}", "${bucket_a_name}/*" ], "Condition": { "StringEquals": { "aws:PrincipalOrgID": "${organization_id}" } } }, { "Sid": "AllowGetObjectOnlyForCopyWithinBucket", "Effect": "Allow", "Principal": { "AWS": "${account_b_id}" }, "Action": "s3:GetObject", "Resource": "${bucket_a_name}/*", "Condition": { "StringEquals": { "aws:CalledVia": "s3:CopyObject", "aws:PrincipalOrgID": "${organization_id}" }, "ArnLike": { "s3:DestinationBucketArn": "${bucket_a_arn}" } } } ] }
关键说明:
aws:CalledVia条件:确保s3:GetObject只能由s3:CopyObject操作调用,用户无法直接执行s3:GetObject读取文件内容。s3:DestinationBucketArn条件:限制复制操作的目标桶必须是Bucket-A,彻底杜绝将对象复制到外部桶的可能。
这样配置后,Account-B的用户可以:
- 上传、删除Bucket-A内的对象
- 在Bucket-A内部复制/移动对象(复制操作会触发受限制的
s3:GetObject) - 无法直接读取Bucket-A内的对象内容,也不能将对象复制到外部桶,完全满足防数据泄露的需求
内容的提问来源于stack exchange,提问作者Adam Westbrook
相关产品推荐
相关产品推荐

