如何通过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
相关产品推荐
相关产品推荐

