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

如何通过IAM策略限制仅允许访问AWS S3中的单个指定文件

问题排查

你当前的策略存在两个核心错误:

  • 动作与资源类型不匹配
    S3的API动作分为两类,你把两类动作放在同一条Statement中,会导致桶级动作无法匹配到合法资源:
    桶级动作:比如s3:ListBucket、s3:GetBucketLocation、s3:GetBucketTagging等,这类动作的资源必须是存储桶本身,ARN格式为arn:aws:s3:::prod-bucket,不能带任何对象路径后缀,你当前配置的资源都是对象级路径,导致所有桶级动作都没有正常生效。
    对象级动作:比如s3:GetObject、s3:GetObjectAcl等,这类动作的资源才是带路径的对象ARN,你配置的单个文件ARN本身格式是正确的。
  • 无路径访问权限(控制台访问场景必现)
    如果你是通过AWS控制台访问该文件,控制台会先调用s3:ListBucket接口逐级遍历路径,你当前没有给桶级的List权限,也没有限制List的范围到对应路径,自然看不到也访问不到该文件。就算是直接调用API访问,如果你的请求依赖桶级元数据查询,也会触发权限报错。

修正方案

方案1:仅允许直接API/SDK读取单个特定文件(无需遍历路径)

把桶级动作和对象级动作拆成两条Statement:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowBucketLevelActions",
            "Effect": "Allow",
            "Action": [
                "s3:GetLifecycleConfiguration",
                "s3:GetBucketTagging",
                "s3:GetInventoryConfiguration",
                "s3:ListBucketVersions",
                "s3:GetBucketLogging",
                "s3:GetAccelerateConfiguration",
                "s3:GetBucketPolicy",
                "s3:GetEncryptionConfiguration",
                "s3:GetBucketObjectLockConfiguration",
                "s3:GetIntelligentTieringConfiguration",
                "s3:GetBucketRequestPayment",
                "s3:GetMetricsConfiguration",
                "s3:GetBucketOwnershipControls",
                "s3:GetBucketPublicAccessBlock",
                "s3:GetBucketPolicyStatus",
                "s3:ListBucketMultipartUploads",
                "s3:GetBucketWebsite",
                "s3:GetBucketVersioning",
                "s3:GetBucketAcl",
                "s3:GetBucketNotification",
                "s3:GetReplicationConfiguration",
                "s3:GetBucketCORS",
                "s3:GetAnalyticsConfiguration",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::prod-bucket"
        },
        {
            "Sid": "AllowSpecificObjectAccess",
            "Effect": "Allow",
            "Action": [
                "s3:GetObjectVersionTagging",
                "s3:GetObjectVersionTorrent",
                "s3:GetObjectAcl",
                "s3:GetObjectVersionAcl",
                "s3:GetObjectTagging",
                "s3:GetObjectRetention",
                "s3:GetObjectLegalHold",
                "s3:ListMultipartUploadParts",
                "s3:GetObject",
                "s3:GetObjectTorrent",
                "s3:GetObjectVersionForReplication",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::prod-bucket/folder1/folder2/*",
                "arn:aws:s3:::prod-bucket/folder3/folder4/my_file.csv"
            ]
        }
    ]
}

方案2:允许控制台访问,可遍历路径看到目标文件

在方案1基础上给s3:ListBucket添加路径限制的Condition,避免用户看到桶内其他无关路径,只需修改AllowBucketLevelActions的Statement即可:

{
    "Sid": "AllowBucketLevelActions",
    "Effect": "Allow",
    "Action": [
        "s3:ListBucket",
        // 保留方案1中原有所有桶级动作即可
    ],
    "Resource": "arn:aws:s3:::prod-bucket",
    "Condition": {
        "StringLike": {
            "s3:prefix": [
                "folder1/folder2/*",
                "folder3/folder4/my_file.csv",
                "folder3/",
                "folder3/folder4/"
            ]
        }
    }
}

这里的prefix配置是为了让控制台可以逐级展开到folder4目录看到目标文件,不需要给其他路径的List权限。

额外校验点

如果配置后还是无法访问,优先检查两个配置:

  • 存储桶本身有没有配置桶策略,拒绝了该IAM身份的访问,桶策略优先级高于IAM策略
  • 目标文件my_file.csv的ACL有没有设置私有,且IAM身份有读取对象ACL的权限
  • 确认ARN路径没有拼写错误,S3路径大小写敏感,注意文件名和文件夹名的大小写匹配

内容的提问来源于stack exchange,提问作者Akki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:36:06