You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。具体配置如下:

  1. 移除全局s3:GetObject权限:不要直接允许s3:GetObject,而是通过条件限制该权限仅在执行s3:CopyObject时生效,且源对象和目标对象都属于Bucket-A。
  2. 明确配置s3:CopyObject权限并限制目标桶:用ArnLike匹配目标对象的ARN为Bucket-A下的资源,确保复制操作无法指向外部桶。
  3. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 01:14:54