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

为何无权限情况下我仍可删除或列出S3 Bucket内的对象?

S3存储桶配置公共访问拦截后仍可列举、删除对象的原因

你遇到的情况核心是公共访问拦截仅限制匿名/公共授权的请求,不会拦截经过AWS身份认证且持有有效权限的请求,常见触发原因如下:

  • 你的代码未显式指定身份凭证,AWS .NET SDK会自动按优先级加载环境中的凭证:依次读取环境变量AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY、本地~/.aws/credentials配置文件、EC2实例角色/ECS任务角色/Lambda执行角色等。如果加载到的凭证对应的IAM身份本身就是存储桶所有者,或者该身份被授予了对应存储桶的s3:ListBucket、s3:DeleteObject权限,请求会被正常放行。
  • S3的权限判断优先级高于ACL:IAM身份策略、存储桶策略、组织SCP的权限优先级都高于存储桶ACL,只要上述任一规则给你的访问身份授予了对应操作权限,哪怕ACL仅配置所有者可访问,请求也会被允许。
  • 你对公共访问拦截的作用存在误解:该配置仅用于阻断所有公共未授权访问,也就是匿名请求、使用公共读写ACL的请求,不会对经过AWS IAM认证的合法身份请求产生拦截效果。

排查方法

  1. 首先确认你当前代码使用的访问身份,在代码中添加如下逻辑打印身份信息:
var identity = await s3Client.GetCallerIdentityAsync(new Amazon.GetCallerIdentityRequest());
Console.WriteLine(identity.Arn);
  1. 检查打印出的IAM身份(用户/角色)的关联策略,确认是否存在允许对应存储桶s3:ListBucket、s3:DeleteObject操作的规则
  2. 检查存储桶的存储桶策略,确认是否存在给上述身份授予对应操作权限的规则
  3. 若使用的是跨账号身份,还要检查存储桶ACL是否给该跨账号ID授予了对应权限

你贴出的代码本身没有语法错误,问题出在权限配置和对S3权限体系的理解偏差上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:36:03