已配置s3:DeleteObject策略仍无法删除S3存储桶对象
问题背景
我有一个名为test-bucket的私有S3存储桶,已开启阻止所有公共访问,通过CloudFront分发内容。Web应用使用的IAM用户已附加AmazonS3FullAccess托管策略,同时存储桶策略配置如下:
{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity ••••••••••••••" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::test-bucket/*" }, { "Sid": "2", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::••••••••••••:user/••••••••••••" }, "Action": "s3:DeleteObject", "Resource": "arn:aws:s3:::test-bucket/*" } ] }
尝试删除桶内对象时,收到错误:
botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the DeleteObject operation: Access Denied
已排查常规方案但无效,IAM用户和存储桶均配置了s3:DeleteObject权限。
排查与修复步骤
1. 升级存储桶策略版本
当前桶策略使用的是2008-10-17旧版本,该版本在IAM权限评估逻辑上存在局限性,建议替换为2012-10-17版本:
{ "Version": "2012-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity ••••••••••••••" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::test-bucket/*" }, { "Sid": "2", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::••••••••••••:user/••••••••••••" }, "Action": "s3:DeleteObject", "Resource": "arn:aws:s3:::test-bucket/*" } ] }
新版本的策略与IAM权限模型兼容性更强,能避免旧版本带来的权限评估冲突。
2. 检查IAM用户的权限边界
如果该IAM用户设置了权限边界(Permission Boundary),即使附加了AmazonS3FullAccess托管策略,权限边界也会限制实际可用权限。需确认权限边界是否包含s3:DeleteObject操作,或者移除不必要的权限边界限制。
3. 验证存储桶策略中的ARN准确性
确保桶策略中第2条Statement的IAM用户ARN完全正确:
- 检查AWS账号ID是否准确(替换打码的
••••••••••••部分) - 确认用户名拼写无误
ARN错误会导致桶策略的Allow规则无法匹配到目标用户,直接触发权限拒绝。
4. 排查对象级ACL权限
部分对象可能设置了独立的ACL规则,拒绝了该IAM用户的删除权限。可以通过AWS CLI查看目标对象的ACL:
aws s3api get-object-acl --bucket test-bucket --key your-object-key
如果存在拒绝该用户的条目,需修改对象ACL或通过桶策略覆盖(需确保桶策略优先级生效)。
5. 检查S3版本控制状态
如果存储桶开启了版本控制,s3:DeleteObject仅能删除对象的当前版本指针(生成删除标记),若需彻底删除对象版本,还需权限s3:DeleteObjectVersion。虽然AmazonS3FullAccess包含该权限,但可通过IAM模拟验证:
aws iam simulate-principal-policy --policy-source-arn arn:aws:iam::your-account-id:user/your-username --action-names s3:DeleteObject s3:DeleteObjectVersion --resource-arns arn:aws:s3:::test-bucket/*
若模拟结果显示s3:DeleteObject被拒绝,需进一步定位权限阻塞点。
6. 使用IAM Access Analyzer诊断
通过AWS控制台的IAM Access Analyzer对该用户进行权限分析,它会自动识别导致权限拒绝的原因(如桶策略冲突、权限边界限制、组织SCP规则等),快速定位问题根源。
内容的提问来源于stack exchange,提问作者Gero

