如何在AWS中列出被允许写入S3存储桶的所有资源?
获取AWS环境中所有具备S3写入权限的资源清单的实现方法
有几种实用的方法可以搞定这个需求,下面逐一说明:
1. 用AWS IAM Access Analyzer快速识别
IAM Access Analyzer是AWS官方工具,能自动扫描并识别出本账号或跨账号中拥有S3写入权限的资源,步骤很简单:
- 登录IAM控制台,找到左侧菜单的Access Analyzer
- 创建或选择已有的analyzer,进入Findings页面
- 筛选权限包含
s3:PutObject、s3:PutObjectAcl、s3:PostObject这类写入相关动作的结果,就能看到被授权的IAM用户、角色、外部账号等资源清单
2. AWS CLI结合自定义脚本遍历
适合需要自定义输出格式或批量处理的场景,核心思路是遍历所有S3桶和IAM实体,检查它们的权限策略:
- 示例bash脚本片段(需要提前安装jq):
# 遍历所有S3桶,检查桶策略中的写入权限 for bucket in $(aws s3api list-buckets --query "Buckets[].Name" --output text); do echo "=== 检查桶: $bucket ===" aws s3api get-bucket-policy --bucket $bucket --query Policy --output text 2>/dev/null | jq '.Statement[] | select(.Effect == "Allow") | select(.Action[] | test("s3:(Put|Post|Delete)"))' done # 遍历IAM角色,检查角色关联的权限策略 for role in $(aws iam list-roles --query "Roles[].RoleName" --output text); do echo "=== 检查角色: $role ===" # 先查inline policy aws iam list-role-policies --role-name $role --query PolicyNames --output text | xargs -I {} aws iam get-role-policy --role-name $role --policy-name {} --query PolicyDocument.Statement[] | jq 'select(.Effect == "Allow") | select(.Action[] | test("s3:(Put|Post|Delete)"))' # 再查managed policy aws iam list-attached-role-policies --role-name $role --query AttachedPolicies[].PolicyArn --output text | xargs -I {} aws iam get-policy-version --policy-arn {} --version-id v1 --query PolicyDocument.Statement[] | jq 'select(.Effect == "Allow") | select(.Action[] | test("s3:(Put|Post|Delete)"))' done - 注意:脚本需要处理分页、权限边界的限制,以及IAM用户、组的权限检查,可根据实际需求扩展。
3. AWS Config规则自动化评估
通过AWS Config创建自定义规则,持续监控并生成权限清单:
- 创建一个基于Lambda的Config规则,逻辑是:遍历S3桶和IAM实体,检查它们的权限策略中是否包含允许S3写入的语句
- 规则会定期评估资源,结果在AWS Config的合规性页面展示,还能导出CSV格式的清单
4. 不要忽略权限细节
最后要注意几个容易遗漏的点:
- IAM权限边界(Permission Boundaries)会限制实体的实际权限,需要结合检查
- 临时凭证(比如STS生成的角色凭证)的权限,这类需要结合CloudTrail日志追踪使用记录
- 服务关联角色(Service-Linked Roles)的默认权限,部分服务角色可能自带S3写入权限
内容的提问来源于stack exchange,提问作者psowa001
相关产品推荐
相关产品推荐

