如何通过AWS STS AssumeRole会话策略隐藏指定文件夹?
我创建了带有仅列出特定文件夹策略的STS AssumeRole会话令牌,但如何隐藏无访问权限的其余文件夹?
示例:
假设我有AWS S3对象路径s3://<bucketName>/folder1/{files…}和s3://<bucketName>/folder2/{files…}
我生成的STS令牌包含Action(即S3:List*)和Condition过滤策略(即"StringEquals" : "folder1/*")
在我的应用中使用上述生成的STS会话令牌调用AWS SDK(Javascript),当尝试列出根路径(s3://<bucketName>/)下的对象时,响应同时返回folder1/和folder2/。
如何基于当前STS会话策略隐藏folder2/?(注意:尽管已限制进入folder2/的列表权限,我仍不希望SDK在前端显示folder2/。)
问题出在STS策略的配置逻辑上,当前的条件过滤没有对桶根目录的列表操作做精准限制,导致S3返回了所有根前缀。要让无权限的文件夹直接从服务端响应中消失,需要调整策略的资源和条件规则:
正确的STS AssumeRole策略配置
替换原有策略为以下配置,让S3服务端直接过滤掉无权限的前缀:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::<bucketName>", "Condition": { "StringLike": { "s3:prefix": [ "", "folder1/", "folder1/*" ] } } }, { "Effect": "Allow", "Action": [ "s3:List*", "s3:Get*" ], "Resource": "arn:aws:s3:::<bucketName>/folder1/*" } ] }
策略逻辑说明
- 第一条声明针对桶级列表操作(
s3:ListBucket):- 通过
s3:prefix条件限制,允许根目录列表但仅返回匹配folder1/的前缀 - 同时授权对
folder1/及其子路径的列表权限
- 通过
- 第二条声明授权对
folder1/*路径下对象的具体列表、读取操作
原有策略无效的原因
你之前的策略只限制了folder1/*路径的操作权限,但未对桶根目录的ListBucket操作添加前缀过滤。S3默认会返回根目录下所有前缀(包括folder2/),仅在尝试访问无权限路径时才会拒绝请求。通过给ListBucket添加s3:prefix条件,S3服务端会直接在响应中过滤不符合条件的前缀,不会让folder2/出现在SDK的返回结果里。
验证效果
使用修改后的STS令牌调用AWS SDK的listObjectsV2方法(推荐使用V2版本),指定目标桶后,返回的CommonPrefixes或Contents集合中只会包含folder1/相关内容,folder2/会被服务端直接过滤。
内容的提问来源于stack exchange,提问作者ǨÅVËĔŊ RĀǞĴĄŅ

