如何配置IAM策略使AWS CLI仅列出用户被授权访问的S3存储桶
核心原因
s3:ListAllMyBuckets 动作本身不支持资源级权限限制,也无法通过IAM条件过滤返回的存储桶列表,只要你在策略中允许了这个动作,执行aws s3 ls(本质是调用ListAllMyBuckets API)就会返回当前AWS账号下所有存储桶的名称,这是AWS S3的原生设计。
可行的调整方案
方案1:移除ListAllMyBuckets权限(官方推荐最小权限方案)
直接删掉策略中允许s3:ListAllMyBuckets的语句,调整后的策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::A" }, { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:PutObjectAcl", "s3:GetObject", "s3:GetObjectAcl", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::A/*" } ] }
调整后效果:
- 执行
aws s3 ls会直接返回AccessDenied错误,用户无法看到任何存储桶列表,自然也看不到B、C桶 - 完全不影响用户直接访问授权的A桶,执行
aws s3 ls s3://A仍然可以正常返回桶内内容 - 适合用户已经知晓授权桶名称的场景,是生产环境的主流配置
方案2:保留列表能力的替代实现
如果一定要让用户执行列表操作时仅能看到A桶,只能通过间接方式实现:
- 为用户提供封装后的CLI脚本,脚本内部直接调用
aws s3 ls s3://A,屏蔽全局列表的入口 - 如果是控制台访问,可以为用户生成直接跳转至A桶的专属链接,同时通过IAM权限禁止用户访问S3控制台的全局存储桶列表页
补充说明
目前没有任何IAM配置可以修改ListAllMyBuckets API的返回结果,所有声称可以过滤列表的方案本质都是拦截或替换了API调用入口,而非修改S3原生的API返回逻辑。
内容的提问来源于stack exchange,提问作者Veck Hsiao
相关产品推荐
相关产品推荐

