在攻击者之前发现公开的 S3 存储桶

发布: (2026年2月8日 GMT+8 04:06)
5 分钟阅读
原文: Dev.to

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(例如 EveryoneAnyAuthenticatedUser),且权限为 READWRITE

使用 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 规则或第三方工具——您可以显著降低数据泄露的风险,并维护更安全的云环境。

0 浏览
Back to Blog

相关文章

阅读更多 »

UX/UI 排版

Typography 是指什么?- 使用哪种字体 - 在什么位置多大 - 多粗 - 行间距 - …