在攻击者之前发现公开的 S3 存储桶
Source: Dev.to
Introduction
在公共 Amazon S3 存储桶中意外泄露敏感数据仍然是一个重大的安全风险。错误配置的权限很容易出现,攻击者会主动扫描这些漏洞。定期审计您的 S3 存储桶权限对于防止数据泄露、合规违规和声誉受损至关重要。
公共存储桶泄露的数据类型
- 个人身份信息(PII)
- API 密钥和凭证
- 专有代码或数据
- 内部文档
Source: …
查找公共 S3 存储桶的方法
AWS 命令行界面 (CLI)
AWS CLI 可以列出存储桶并检查其权限。
列出所有存储桶
aws s3 ls
检查存储桶策略
aws s3api get-bucket-policy --bucket <bucket-name>
公共存储桶通常包含 "Principal": "*"(或 "Principal": {"AWS": "*"})以及 "Effect": "Allow" 的语句,针对的操作如 s3:GetObject。
检查存储桶 ACL
aws s3api get-bucket-acl --bucket <bucket-name>
查找 Grant 元素,其中 Grantee 类型为 Group(例如 Everyone 或 AnyAuthenticatedUser),且权限为 READ 或 WRITE。
使用 AWS CLI 与 jq 编写脚本
通过解析 JSON 输出并使用 jq,可以自动检测公共存储桶。
#!/usr/bin/env bash
aws s3 ls | awk '{print $3}' | while read bucket; do
policy=$(aws s3api get-bucket-policy --bucket "$bucket" 2>/dev/null)
acl=$(aws s3api get-bucket-acl --bucket "$bucket" 2>/dev/null)
if [[ -n "$policy" ]]; then
if echo "$policy" | jq -e '.Policy | contains({Statement: [{Principal: "*", Effect: "Allow"}]})' > /dev/null; then
echo "Bucket $bucket is PUBLIC (Policy)"
fi
fi
if [[ -n "$acl" ]]; then
if echo "$acl" | jq -e '.Grants | any(.Grantee.Type == "Group" and (.Permission == "READ" or .Permission == "WRITE"))' > /dev/null; then
echo "Bucket $bucket is PUBLIC (ACL)"
fi
fi
done
该脚本遍历所有存储桶,获取其策略和 ACL,并根据宽泛的 “Allow” 语句或公共 ACL 授权标记出可能公开的存储桶。
Boto3(AWS 的 Python SDK)
Boto3 提供了以编程方式执行相同检查的能力。
安装 Boto3
pip install boto3
Python 脚本
import boto3
import json
s3 = boto3.client('s3')
def check_bucket_permissions():
buckets = s3.list_buckets()['Buckets']
for bucket in buckets:
name = bucket['Name']
# 检查存储桶策略
try:
policy_str = s3.get_bucket_policy(Bucket=name)['Policy']
policy = json.loads(policy_str)
for stmt in policy.get('Statement', []):
if stmt.get('Principal') == '*' and stmt.get('Effect') == 'Allow':
print(f"Bucket {name} is PUBLIC (Policy)")
except s3.exceptions.NoSuchBucketPolicy:
pass # 没有附加策略
# 检查存储桶 ACL
try:
acl = s3.get_bucket_acl(Bucket=name)
for grant in acl.get('Grants', []):
grantee = grant.get('Grantee', {})
if grantee.get('Type') == 'Group' and grant.get('Permission') in ('READ', 'WRITE'):
print(f"Bucket {name} is PUBLIC (ACL)")
except s3.exceptions.NoSuchBucket:
pass # 存储桶不可访问
if __name__ == "__main__":
check_bucket_permissions()
该脚本列出所有存储桶,获取其策略和 ACL,并打印出被识别为公开的存储桶。
AWS Trusted Advisor
Trusted Advisor 包含 “Amazon S3 Bucket Permissions” 检查项,可标记出具有开放访问权限的存储桶。虽然它提供的细节不如 CLI/SDK 方法丰富,但能快速给出高层概览。
AWS Config
AWS Config 能够随时间跟踪资源配置。您可以创建自定义 Config 规则来评估存储桶策略和 ACL 是否对公共访问开放,从而实现持续合规监控。
S3 安全最佳实践
- 自动化扫描:在 CI/CD 流水线或定期的 cron 作业中调度 CLI 或 Boto3 脚本。
- 最小权限:避免在 bucket 策略中使用
"*";仅授予所需的权限。 - 定期审计:定期审查 bucket 权限。
- 监控与告警:设置 CloudWatch 警报或 Config 规则,以检测 bucket 访问的更改。
- 优先使用策略而非 ACL:将 bucket 策略作为主要的访问控制机制。
- S3 访问点:对于共享数据集,创建具有范围限制权限的专用访问点。
替代开源工具
nuvu-scan 可以自动发现云资产并检测公开的 S3 存储桶。
pip install nuvu-scan
按照其文档运行该工具,以扫描您的环境中暴露的存储桶。
结论
通过积极搜索并修复公开的 S3 存储桶——使用 AWS CLI、Boto3 脚本、Trusted Advisor、Config 规则或第三方工具——您可以显著降低数据泄露的风险,并维护更安全的云环境。