S3存储桶Access Denied问题:为开发者配置CRUD权限仍遇403错误
排查S3 403 Forbidden错误的关键点
咱们一步步拆解你的问题,找出导致权限拒绝的核心原因:
1. 桶策略的Resource范围不完整
你当前的桶策略里,Resource只指定了存储桶本身的ARN:arn:aws:s3:::myapp-dev1-bucket,但这个范围仅覆盖存储桶级别的操作(比如ListBucket),而你需要的PutObject、GetObject、DeleteObject这类对象级操作,必须包含桶内所有对象的路径。
修正后的桶策略需要同时覆盖桶和对象:
{ "Id": "Policy123456789", "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt123456789", "Action": "s3:*", "Effect": "Allow", "Resource": [ "arn:aws:s3:::myapp-dev1-bucket", "arn:aws:s3:::myapp-dev1-bucket/*" ], "Principal": { "AWS": [ "arn:aws:iam::1234567890:user/myapp-dev1" ] } } ] }
2. 确认IAM用户的权限策略是否配置正确
你提到给myapp-dev1分配了自定义策略,但要确保该策略的Resource同样覆盖桶和对象,且权限与操作匹配。比如正确的IAM策略应该类似:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::myapp-dev1-bucket", "arn:aws:s3:::myapp-dev1-bucket/*" ] } ] }
另外,如果你的操作需要先列出账户下的所有存储桶(比如用AWS CLI执行s3 ls),还得添加s3:ListAllMyBuckets权限,对应的Resource设为*。
3. 检查S3存储桶的「块公共访问」设置
这是很容易被忽略的坑:如果你的存储桶开启了阻止公共访问(无论是账户级别还是桶级别),哪怕桶策略和IAM策略都允许访问,也会被强制拒绝。
你可以进入S3存储桶的「权限」标签,找到「块公共访问」设置,确认是否勾选了阻止存储桶和对象公共访问等选项。如果开启了,临时关闭后再测试。
4. 验证请求操作与权限的匹配性
不同操作对应不同的权限和Resource范围:
- 上传/下载对象(比如
s3 cp):需要PutObject/GetObject,对应Resource为arn:aws:s3:::myapp-dev1-bucket/* - 列出桶内对象(比如
s3 ls s3://myapp-dev1-bucket):需要ListBucket,对应Resource为arn:aws:s3:::myapp-dev1-bucket
如果操作对应的权限或Resource不匹配,也会触发403错误。
快速测试建议
你可以用AWS CLI的模拟命令验证权限是否生效,比如:
aws iam simulate-custom-policy --policy-input-list file://your-iam-policy.json --action-names s3:PutObject --resource-arns arn:aws:s3:::myapp-dev1-bucket/test.jpg --principal-arn arn:aws:iam::1234567890:user/myapp-dev1
这个命令能帮你快速确认权限配置是否正确。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

