一款全面且具备生产级就绪状态的 AWS S3 bucket 安全扫描器,提供针对 CIS、AWS FSBP、PCI-DSS、HIPAA、SOC 2、ISO 框架以及 GDPR 的合规性映射。具有多线程扫描、对象级别的安全分析以及详细的修复指南等功能。
## 核心功能
### **全面的安全分析**
- **公开访问检测**:通过 ACL、策略和公开访问设置进行多层检测
- **加密评估**:分析服务端加密配置
- **访问控制**:评估版本控制、MFA 删除和对象锁定
- **复制数据泄露检测**:将跨账户复制目标(一种隐蔽的数据泄露后门)标记为 CRITICAL,并提供用于合法 DR 账户的 `--trusted-account` 允许列表
- **对象级安全**:基于抽样的扫描,检测公开对象和敏感数据模式
- **CORS 分析**:检测过于宽松的跨域配置
- **DNS 接管防御**:分析 Route53 和手动配置的域名,排查子域名接管风险
- **CNAME 信息泄露**:检测 DNS 记录中的敏感信息
### **合规框架**
- **CIS AWS Foundations Benchmark v3.0.0**:6 项针对 S3 的控制措施(100% 覆盖率)
- **AWS Foundational Security Best Practices (FSBP)**:11 项针对 S3 的控制措施(100% 覆盖率)
- **PCI DSS v4.0**:10 项用于 PCI DSS 合规的 AWS Config 规则(100% 覆盖率)
- **HIPAA Security Rule**:7 项用于医疗数据保护的 AWS Config 规则(100% 覆盖率)
- **SOC 2 Type II**:12 项支持信任服务标准(Trust Service Criteria)的控制措施(合规性百分比取决于所选标准)
- **ISO 27001:2022**:7 项信息安全控制措施(访问控制、云安全、密码学、备份、日志记录、信息传输)
- **ISO 27017:2015**:7 项云安全控制措施(访问限制、共同责任、数据位置、监控、日志记录、数据删除、数据隔离)
- **ISO 27018:2019**:4 项 PII 保护控制措施(目的限制、数据最小化、保留/删除、问责制)
- **GDPR (EU) 2016/679**:21 项可实施的控制措施,涵盖第 17、25、30、32、33、44-49 条(数据保护、安全、国际传输)
- **实时合规评分**:自动计算合规百分比
**注意:** PCI DSS 控制措施是使用 AWS 推荐的 Config 规则实现的,因为 PCI DSS v4.0 本身并未定义具体的 S3 要求。
### **性能与易用性**
- **多线程扫描**:并行分析 bucket 以更快获取结果
- **富文本控制台输出**:进度条、彩色输出和格式化表格
- **多种报告格式**:JSON、CSV、HTML 以及特定合规性报告
- **精美的 HTML 报告**:带有图表和可视化的交互式仪表板
- **灵活的目标定位**:扫描所有 bucket 或特定子集
### **生产就绪**
- **模块化架构**:清晰的关注点分离,配备专门的安全检查模块
- **现代 Python 打包**:使用 pyproject.toml 并遵循最佳实践
- **全面的 CLI**:提供丰富选项的命令行界面
- **错误处理**:强大的错误恢复和部分扫描结果支持
- **详细的日志记录**:支持可配置级别的文件和控制台日志记录
## 快速开始
### 安装
```
# 从 PyPI 安装
pip install s3-security-scanner
# 或从源码安装
git clone https://github.com/TocConsulting/s3-security-scanner.git
cd s3-security-scanner
pip install .
```
### Docker 安装
```
# 从 Docker Hub 拉取
docker pull tarekcheikh/s3-security-scanner:latest
```
### 基础用法
该扫描器有三个主要命令:`security`、`discover` 和 `dns`。
```
# 扫描所有 S3 buckets 的安全问题
s3-security-scanner security
# 使用特定的 AWS profile 进行扫描
s3-security-scanner security --profile production
# 仅扫描特定的 buckets
s3-security-scanner security --bucket my-bucket-1 --bucket my-bucket-2
# 发现目标组织的 S3 buckets(无需 AWS credentials)
s3-security-scanner discover --target "company-name"
# 检查域名的 DNS takeover 漏洞
s3-security-scanner dns --domain example.com
```
## 命令
### Security 命令
扫描您的 S3 bucket 以查找安全漏洞和合规性问题。
```
s3-security-scanner security [OPTIONS]
Options:
--bucket TEXT Specific bucket(s) to scan (can be used multiple times)
--exclude-bucket TEXT Bucket(s) to exclude from scanning
--compliance-only Generate compliance report only
--no-object-scan Skip object analysis for faster results
--trusted-account TEXT AWS account ID(s) allowed as replication
destinations; suppresses the external-replication
finding for these accounts (repeatable)
-d, --debug Enable debug logging
-q, --quiet Suppress console output except errors
-w, --max-workers INTEGER Worker threads (default: 5)
-f, --output-format Report format: json, csv, html, all (default: all)
-o, --output-dir TEXT Output directory (default: ./output)
-p, --profile TEXT AWS profile name
-r, --region TEXT AWS region (default: us-east-1)
```
**示例:**
```
# 使用默认设置扫描所有 buckets
s3-security-scanner security
# 扫描除特定 buckets 之外的所有 buckets
s3-security-scanner security --exclude-bucket temp-bucket --exclude-bucket dev-sandbox
# 仅合规性快速扫描
s3-security-scanner security --compliance-only --no-object-scan -p production
# 检测跨账户复制后门,将已知的 DR 账户加入 allow-listing
s3-security-scanner security --trusted-account 111122223333
# 仅生成 HTML 报告
s3-security-scanner security -f html -o ./reports
```
### Discover 命令
查找目标组织的未知 S3 bucket(基础发现无需 AWS 凭据)。
```
s3-security-scanner discover [OPTIONS]
Options:
--target TEXT Target organization name (REQUIRED)
--level TEXT Permutation level: basic, medium, advanced (default: basic)
--methods TEXT Discovery methods: dns, http, permutations (default: dns,permutations)
--only Only discover buckets, don't scan them for security issues
--wordlist TEXT Custom wordlist file for additional bucket names
--stealth/--no-stealth Enable stealth mode (default: enabled)
-w, --max-workers Worker threads (default: 5)
-f, --output-format Report format: json, csv, html, all (default: all)
-o, --output-dir TEXT Output directory (default: ./output)
-p, --profile TEXT AWS profile name
-r, --region TEXT AWS region (default: us-east-1)
-d, --debug Enable debug logging
-q, --quiet Suppress console output except errors
```
**示例:**
```
# 发现公司的 buckets(基础级别,约 200 个候选,约 5 秒)
s3-security-scanner discover --target "acme-corp"
# 中级发现(约 1,000 个候选,约 40 秒)
s3-security-scanner discover --target "company" --level medium
# 高级发现(约 9,000 个候选,约 9 分钟)
s3-security-scanner discover --target "company" --level advanced
# 仅发现 - 即使有 AWS credentials 也不执行安全扫描
s3-security-scanner discover --target "company" --only
```
**注意:** 如果未检测到 AWS 凭据,将自动启用仅发现模式。
### DNS 命令
检查域名的 DNS 子域名接管漏洞。
```
s3-security-scanner dns [OPTIONS]
Options:
--domain TEXT Domain(s) to scan (REQUIRED, can be used multiple times)
--skip-subdomain-enum Skip subdomain enumeration
-p, --profile TEXT AWS profile for Route53 scanning
-r, --region TEXT AWS region (default: us-east-1)
-f, --output-format Report format: json, csv, html, all (default: all)
-o, --output-dir TEXT Output directory (default: ./output)
-w, --max-workers INTEGER Worker threads (default: 5)
-d, --debug Enable debug logging
-q, --quiet Suppress console output except errors
```
**示例:**
```
# 扫描域名以发现 takeover 漏洞
s3-security-scanner dns --domain example.com --domain test.com
# 使用 AWS profile 进行 Route53 扫描
s3-security-scanner dns --domain example.com --profile production
```
## Docker 用法
使用 Docker 运行扫描器,无需在本地安装 Python 依赖。
### 拉取 Docker 镜像
```
# 拉取最新版本
docker pull tarekcheikh/s3-security-scanner:latest
# 或固定特定版本(将 X.Y.Z 替换为您想要的 release)
docker pull tarekcheikh/s3-security-scanner:X.Y.Z
```
### 基础 Docker 命令
```
# 显示帮助
docker run --rm tarekcheikh/s3-security-scanner --help
# 显示特定命令的帮助
docker run --rm tarekcheikh/s3-security-scanner security --help
```
### 使用 Docker 进行安全扫描
**AWS 凭据:** 以下示例挂载了 `~/.aws` 以提供凭据。默认情况下,扫描器使用 `default` 配置文件。使用 `--profile
` 指定其他配置文件。
```
# 使用默认的 AWS profile 扫描所有 buckets
docker run --rm \
-v ~/.aws:/root/.aws:ro \
-v $(pwd)/output:/app/output \
tarekcheikh/s3-security-scanner security
# 使用特定的 AWS profile 进行扫描
docker run --rm \
-v ~/.aws:/root/.aws:ro \
-v $(pwd)/output:/app/output \
tarekcheikh/s3-security-scanner security --profile production
# 仅扫描特定的 buckets
docker run --rm \
-v ~/.aws:/root/.aws:ro \
-v $(pwd)/output:/app/output \
tarekcheikh/s3-security-scanner security --bucket my-bucket-1 --bucket my-bucket-2
# 仅合规性快速扫描
docker run --rm \
-v ~/.aws:/root/.aws:ro \
-v $(pwd)/output:/app/output \
tarekcheikh/s3-security-scanner security --compliance-only --no-object-scan
```
### 使用 Docker 进行 Bucket 发现
```
# 发现目标的 buckets(无需 AWS credentials)
docker run --rm \
-v $(pwd)/output:/app/output \
tarekcheikh/s3-security-scanner discover --target "company-name" --only
# 带有更多排列组合的高级发现
docker run --rm \
-v $(pwd)/output:/app/output \
tarekcheikh/s3-security-scanner discover --target "company-name" --level advanced --only
```
### 使用 Docker 进行 DNS 扫描
```
# 检查域名的 takeover 漏洞
docker run --rm \
-v $(pwd)/output:/app/output \
tarekcheikh/s3-security-scanner dns --domain example.com
# 使用 Route53 扫描(需要 AWS credentials)
docker run --rm \
-v ~/.aws:/root/.aws:ro \
-v $(pwd)/output:/app/output \
tarekcheikh/s3-security-scanner dns --domain example.com --profile production
```
### 使用环境变量提供 AWS 凭据
您可以不挂载 `~/.aws`,而是通过环境变量传递凭据:
```
# 通过环境变量传递 AWS credentials
docker run --rm \
-e AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY \
-e AWS_DEFAULT_REGION=us-east-1 \
-v $(pwd)/output:/app/output \
tarekcheikh/s3-security-scanner security
# 使用 session token(用于临时 credentials/assumed roles)
docker run --rm \
-e AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY \
-e AWS_SESSION_TOKEN \
-e AWS_DEFAULT_REGION=us-east-1 \
-v $(pwd)/output:/app/output \
tarekcheikh/s3-security-scanner security
```
### Docker 卷挂载说明
| 挂载 | 用途 |
|-------|---------|
| `-v ~/.aws:/root/.aws:ro` | 挂载 AWS 凭据目录(只读)。除非指定了 `--profile`,否则使用 `default` 配置文件 |
| `-v $(pwd)/output:/app/output` | 将报告保存到您本地的 `./output` 目录 |
| `-v /path/to/wordlist.txt:/app/wordlist.txt` | 使用自定义字典进行发现 |
**重要提示:** 如果不挂载输出卷(`-v $(pwd)/output:/app/output`),容器退出后将无法访问报告文件。
## 前置条件
### Python 要求
- Python 3.8 或更高版本
- 所需的包(自动安装):
- `boto3>=1.26.0`
- `rich>=13.0.0`
- `click>=8.1.0`
- `jinja2>=3.1.0`
- `dnspython>=2.4.0`
### AWS 要求
- 已配置 AWS 凭据(通过 AWS CLI、环境变量或 IAM 角色)
- 所需权限:
```
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:GetBucketLocation",
"s3:GetBucketAcl",
"s3:GetBucketPolicy",
"s3:GetBucketPublicAccessBlock",
"s3:GetBucketEncryption",
"s3:GetBucketVersioning",
"s3:GetBucketLogging",
"s3:GetBucketLifecycleConfiguration",
"s3:GetBucketNotificationConfiguration",
"s3:GetBucketReplication",
"s3:GetBucketCors",
"s3:GetObjectLockConfiguration",
"s3:ListBucket",
"s3:GetObjectAcl",
"sts:GetCallerIdentity",
"route53:ListHostedZones",
"route53:ListResourceRecordSets",
"cloudtrail:ListTrails",
"cloudtrail:GetEventSelectors"
],
"Resource": "*"
}
]
}
```
## 安全检查
### 核心安全分析
| 检查项 | 描述 | 严重程度 |
|-------|-------------|----------|
| **Public Access Block** | 验证所有四个公开访问阻止设置 | HIGH |
| **Bucket Policy** | 分析策略中的公开访问和 SSL 强制执行情况 | HIGH/MEDIUM |
| **Wildcard Principal** | 检测 bucket 策略中的通配符 (*) 主体 | HIGH |
| **Bucket ACL** | 检查是否向 AllUsers/AuthenticatedUsers 授予了公开权限 | HIGH |
| **Default Encryption** | 验证服务端加密配置 | MEDIUM |
| **Versioning** | 检查版本控制和 MFA 删除状态 | LOW/MEDIUM |
| **Access Logging** | 验证服务端访问日志配置 | LOW |
| **Object Lock** | 评估对象锁定和保留策略 | INFO |
| **CORS Configuration** | 识别过于宽松的 CORS 规则 | MEDIUM |
| **Lifecycle Rules** | 评估生命周期管理策略 | INFO |
| **Event Notifications** | 检查 SNS/SQS/Lambda 通知配置 | LOW |
| **Cross-Region Replication** | 验证用于灾难恢复的复制配置 | MEDIUM |
| **External-Account Replication** | 标记复制到不同 AWS 账户的操作(数据泄露后门);使用 `--trusted-account` 设置允许列表 | CRITICAL |
| **External-Account Notification** | 标记指向不同 AWS 账户的事件通知(SQS/SNS/Lambda)(数据泄露/持久化后门);使用 `--trusted-account` 设置允许列表 | CRITICAL |
| **SSE-C Deny Guardrail** | 标记策略中未拒绝 SSE-C 上传的 bucket(防范 Codefinger 勒索软件 TTP) | MEDIUM |
| **Access-Point Delegation** | 标记授权给账户内任何接入点(`s3:DataAccessPointAccount`)且无组织/账户或特定 AP 约束的 bucket 策略;需验证的 CreateAccessPoint 绕过行为 | MEDIUM |
| **Transfer Acceleration** | 检查 S3 Transfer Acceleration 配置 | LOW |
| **Cross-Account Access** | 识别 bucket 策略中的跨账户主体 | MEDIUM |
| **MFA Requirements** | 验证 bucket 策略中的 MFA 条件 | HIGH |
| **Data Classification** | 分析 bucket 和对象标签以进行数据治理 | MEDIUM |
| **KMS Key Management** | 评估 KMS 密钥策略和轮换状态 | HIGH |
| **CloudWatch Monitoring** | 验证 S3 指标和告警配置 | MEDIUM |
| **Storage Lens** | 检查 Storage Lens 治理配置 | LOW |
| **DNS Takeover Prevention** | 扫描 Route53 和手动配置的域名以排查接管风险 | CRITICAL |
### 对象级别安全(基于抽样)
- **公开对象检测**:识别具有公开 ACL 的对象
- **敏感数据模式**:扫描可能敏感的文件名:
- SSN 模式:`\d{3}-\d{2}-\d{4}`
- 信用卡模式:`\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}`
- AWS 访问密钥:`AKIA[0-9A-Z]{16}`
- 私钥:`*.pem`, `*.key`, `*.pfx`
- 密码文件:`*password*`, `*secret*`, `*credential*`
- 数据库备份:`*.sql`, `*.dump`, `*.bak`
### 详细安全分析
有关所有安全检查、攻击向量和利用场景的全面文档,请参阅我们详细的[安全检查文档](security-checks.md)。该文档提供:
- **详细的检查说明**以及技术实现细节
- **逐步的攻击场景**,展示真实世界中的利用方法
- 针对于 CIS、PCI-DSS、HIPAA 和 SOC 2 的**合规框架映射**
- 安全漏洞及其预防措施的**真实案例**
- 用于全面保障 S3 安全的**纵深防御策略**
### 安全修复指南
有关修复扫描器检测到的所有安全漏洞的逐步说明,请参阅我们详尽的[修复指南](remediation-guide.md)。该指南提供:
- 包含逐步操作流程的 **AWS Console 指南**
- 用于自动化和编写脚本的 **AWS CLI 命令**
- 用于程序化修复的 **Python boto3 代码**
- 用于强化多个 bucket 的**批量修复脚本**
- 针对于 GDPR、SOC 2 及其他框架的**特定合规配置**
- 针对安全事件的**应急响应程序**
## 模块化架构
S3 Security Scanner 采用清晰、模块化的架构构建,将安全检查划分为专门的模块:
### 核心结构
```
s3_security_scanner/
├── scanner.py # Main scanner orchestration
├── cli.py # Command-line interface
├── compliance.py # Compliance framework mapping
├── html_reporter.py # HTML report generation
├── utils.py # Shared utilities
├── bucket_utils.py # Bucket utility functions
├── checks/ # Security check modules
│ ├── base.py # Base check class
│ ├── access_control.py # Public access & ACL checks
│ ├── encryption.py # Encryption configuration
│ ├── logging_monitoring.py # Logging & monitoring
│ ├── versioning_lifecycle.py # Versioning & lifecycle
│ ├── object_security.py # Object-level security
│ ├── dns_security.py # DNS takeover detection
│ ├── soc2_monitoring.py # SOC 2 monitoring & governance
│ ├── cloudtrail_logging.py # CloudTrail data events
│ ├── gdpr_compliance.py # GDPR-specific checks
│ └── iso_compliance.py # ISO compliance checks
├── discovery/ # Bucket discovery modules
│ ├── bucket_discovery.py # Discovery engine
│ ├── permutation_generator.py # Bucket name permutations
│ ├── dns_validator.py # DNS validation
│ ├── http_validator.py # HTTP validation
│ ├── wordlist_manager.py # Wordlist management
│ ├── s3_bucket_wordlist.txt # Bucket discovery wordlist
│ └── subdomain_wordlist.txt # Subdomain wordlist
├── analyzers/ # Data analysis modules
│ ├── pattern_analyzer.py # Pattern extraction
│ └── dns_analyzer.py # DNS/CNAME analysis
└── templates/ # Report templates
└── report.html # HTML report template
```
### 核心优势
- **可维护性**:每个安全域都有自己专门的模块
- **可测试性**:隔离的组件可实现全面的单元测试
- **可扩展性**:轻松添加新的安全检查而不影响现有代码
- **单一职责**:每个模块专注于一个特定的安全领域
- **可重用性**:分析器和检查器可以独立使用
## 安全评分
### 单个 Bucket 评分
每个 bucket 都会获得一个安全评分(0-100),初始为 **100 分**,出现安全问题则扣分:
| **安全问题** | **扣分** | **严重程度** | **描述** |
|-------------------|-------------------|-------------|----------------|
| **公开访问阻止已禁用** | **-20** | CRITICAL | 缺失公开访问阻止设置 |
| **公开的 Bucket 策略** | **-20** | CRITICAL | Bucket 策略允许公开访问 |
| **公开的 ACL 访问** | **-20** | CRITICAL | ACL 授予了公开权限 |
| **无 SSL/TLS 强制执行** | **-15** | HIGH | 缺失 SSL/TLS 强制执行 |
| **无加密** | **-20** | HIGH | 未启用默认加密 |
| **发现公开对象** | **-15** | HIGH | 检测到带有公开 ACL 的对象 |
| **无版本控制** | **-10** | MEDIUM | 版本控制已禁用 |
| **发现敏感对象** | **-10** | MEDIUM | 检测到可能敏感的文件 |
| **无 SSE-C 拒绝防护** | **-10** | MEDIUM | Bucket 策略未拒绝 SSE-C 上传 (Codefinger TTP) |
| **接入点授权** | **-10** | M | Bucket 策略授权给任何账户接入点且无进一步约束(需验证的 `s3:DataAccessPointAccount` 绕过行为) |
| **无 MFA 删除** | **-5** | LOW | 未启用 MFA 删除 |
| **无日志记录** | **-5** | LOW | 服务端访问日志已禁用 |
| **危险的 CORS** | **-5** | LOW | 过于宽松的 CORS 配置 |
| **无对象锁定** | **-3** | INFO | 未配置对象锁定 |
| **无生命周期规则** | **-2** | INFO | 未配置生命周期管理 |
**计算公式**:`单个评分 = max(0, 100 - 总扣分)`
### 平均安全评分计算
报告中显示的 **“平均安全评分”** 计算方式如下:
```
# 步骤 1:过滤掉扫描失败的 buckets
valid_results = [bucket for bucket in results if not bucket.get("scan_error", False)]
# 步骤 2:计算所有有效 bucket 分数的平均值
if valid_results:
avg_security_score = sum(bucket.get("security_score", 0) for bucket in valid_results) / len(valid_results)
else:
avg_security_score = 0
# 步骤 3:四舍五入到适当的精度
average_security_score = round(avg_security_score, 2) # Stored with 2 decimals
display_score = "%.1f" % avg_security_score # Displayed with 1 decimal
```
### 示例计算
对于一个拥有 **3 个 bucket** 的账户:
- **Bucket A**:85/100(安全性良好,存在轻微的日志问题)
- **Bucket B**:45/100(存在多个公开访问漏洞)
- **Bucket C**:92/100(极佳的安全态势)
**平均安全评分 = (85 + 45 + 92) ÷ 3 = 74.0**
### 评分解读
| **分数范围** | **安全等级** | **建议** |
|-----------------|-------------------|-------------------|
| **90-100** | **优秀** | 保持当前的安全态势 |
| **70-89** | **良好** | 解决轻微的安全漏洞 |
| **50-69** | **需要改进** | 修复中危漏洞 |
| **0-49** | **差** | 需立即采取行动 - 存在严重问题 |
### 核心特性
- **容错性**:扫描失败的 bucket 不参与计算
- **公平加权**:每个有效的 bucket 无论大小,贡献均等
- **基于优先级**:严重的安全问题(公开访问)比便利功能受到更重的惩罚
- **可操作性**:评分与安全风险水平直接相关
## 合规框架
### CIS AWS Foundations Benchmark v3.0.0
| 控制措施 | 描述 | 检查内容 |
|---------|-------------|-------|
| **S3.1** | S3 bucket 应启用阻止公开访问设置 | 公开访问阻止配置 |
| **S3.5** | S3 bucket 应要求请求使用 SSL | Bucket 策略中的 SSL 强制执行 |
| **S3.8** | S3 bucket 应阻止公开访问 | 整体公开访问评估 |
| **S3.9** | S3 bucket 应启用服务端访问日志 | 访问日志配置 |
| **S3.17** | S3 bucket 应进行静态加密 | 默认加密设置 |
| **S3.20** | S3 bucket 应启用 MFA 删除 | MFA 删除配置 |
| **S3.22** | S3 bucket 应记录对象级别的写入事件 | CloudTrail 数据事件 |
| **S3.23** | S3 bucket 应记录对象级别的读取事件 | CloudTrail 数据事件 |
### PCI DSS v4.0 (AWS Config 规则)
| 控制措施 ID | AWS Config 规则 | 重点领域 |
|------------|-----------------|------------|
| **S3.1** | s3-bucket-public-access-prohibited | 防止公开访问 |
| **S3.5** | s3-bucket-ssl-requests-only | SSL/TLS 强制执行 |
| **S3.8** | s3-bucket-public-read-prohibited | 防止公开读取访问 |
| **S3.9** | s3-bucket-logging-enabled | 访问日志 |
| **S3.15** | s3-bucket-default-lock-enabled | 审计追踪保护 |
| **S3.17** | s3-bucket-server-side-encryption-enabled | 静态加密 |
| **S3.19** | s3-bucket-public-write-prohibited | 防止公开写入访问 |
| **S3.22** | s3-bucket-level-public-access-prohibited | 阻止 Bucket 级别的公开访问 |
| **S3.23** | s3-bucket-versioning-enabled | 数据完整性和恢复 |
| **S3.24** | s3-bucket-replication-enabled | 备份和灾难恢复 |
### HIPAA Security Rule (AWS Config 规则)
| AWS Config 规则 | HIPAA 章节 | 描述 |
|-----------------|---------------|-------------|
| **s3-bucket-server-side-encryption-enabled** | §164.312(a)(2)(iv) | PHI 的服务端加密 |
| **s3-bucket-ssl-requests-only** | §164.312(e)(1) | SSL/TLS 传输安全 |
| **s3-bucket-logging-enabled** | §164.312(b) | 访问日志和审计控制 |
| **s3-bucket-public-read-prohibited** | §164.312(a)(1) | 禁止公开读取访问 |
| **s3-bucket-public-write-prohibited** | §164.312(a)(1) | 禁止公开写入访问 |
| **s3-bucket-versioning-enabled** | §164.308(a)(7)(ii)(A) | 数据备份和恢复 |
| **s3-bucket-default-lock-enabled** | §164.308(a)(1)(ii)(D) | 用于分配安全责任的对象锁定 |
### SOC 2 Type II - 支持信任服务标准的 AWS S3 控制措施
| 控制措施 | 描述 | 信任服务标准 |
|---------|-------------|------------------------|
| **SOC2-CC-ENCRYPTION-REST** | 启用服务端加密 | 通用标准 - 安全 (CC6.6) |
| **SOC2-CC-ENCRYPTION-TRANSIT** | 对传输中的数据强制执行 SSL/TLS | 通用标准 - 安全 (CC6.6) |
| **SOC2-CC-ACCESS-CONTROL** | 适当的访问控制和阻止公开访问 | 通用标准 - 安全 (CC6.1) |
| **SOC2-CC-MFA-REQUIREMENTS** | 敏感操作的 MFA 要求 | 通用标准 - 安全 (CC6.2) |
| **SOC2-CC-AUDIT-LOGGING** | 用于安全监控的访问日志 | 通用标准 - 安全 (CC7.2) |
| **SOC2-CC-KEY-MANAGEMENT** | 加密密钥管理实践 | 通用标准 - 安全 (CC6.8) |
| **SOC2-A-BACKUP-RECOVERY** | 用于数据恢复的版本控制 | 可用性 (A1.2) |
| **SOC2-A-REPLICATION** | 用于灾难恢复的跨区域复制 | 可用性 (A1.2) |
| **SOC2-A-MONITORING** | CloudWatch 监控配置 | 可用性 (A1.3) |
| **SOC2-C-DATA-PROTECTION** | 机密数据访问保护 | 机密性 (CC6.7) |
| **SOC2-PI-DATA-INTEGRITY** | 用于保护数据完整性的对象锁定 | 处理完整性 (CC8.1) |
| **SOC2-P-DATA-GOVERNANCE** | 用于数据治理的 Storage Lens | 隐私 (P2.1) |
**注意:** SOC 2 是一个灵活的框架,组织可以选择要实施的信任服务标准。安全 (CC) 是必选项,而可用性 (A)、机密性 (C)、处理完整性 (PI) 和隐私 (P) 是可选的,视业务需求而定。
## 输出示例
### 控制台摘要
```
S3 Security Scan Summary - us-east-1
┌─────────────────────────────┬─────────────────┐
│ Metric │ Value │
├─────────────────────────────┼─────────────────┤
│ Account ID │ 123456789012 │
│ Total Buckets │ 25 │
│ Average Security Score │ 78.5/100 │
│ Public Buckets │ 3 │
│ High Severity Issues │ 3 │
│ Medium Severity Issues │ 8 │
│ Public Objects Found │ 12 │
│ Sensitive Objects Found │ 5 │
└─────────────────────────────┴─────────────────┘
```
### 合规性摘要
```
Compliance Framework Summary
┌───────────┬──────────────────┬──────────────┬──────────────┬─────────────────┐
│ Framework │ Compliant Buckets│ Total Buckets│ Compliance % │ Status │
├───────────┼──────────────────┼──────────────┼──────────────┼─────────────────┤
│ CIS │ 18 │ 25 │ 72.0% │ Good │
│ PCI-DSS │ 15 │ 25 │ 60.0% │ Needs Work │
│ HIPAA │ 25 │ 25 │ 100.0% │ Excellent │
│ SOC 2 │ 22 │ 25 │ 88.0% │ Excellent │
│ ISO 27001 │ 17 │ 25 │ 68.0% │ Good │
│ ISO 27017 │ 19 │ 25 │ 76.0% │ Good │
│ ISO 27018 │ 12 │ 25 │ 48.0% │ Needs Work │
└───────────┴──────────────────┴──────────────┴──────────────┴─────────────────┘
```
## 高级用法
### 高性能扫描
```
# 增加 worker threads 以加快扫描速度
s3-security-scanner security -w 20
# 不进行 object-level analysis 的快速扫描
s3-security-scanner security --no-object-scan
# 仅合规性模式(最快)
s3-security-scanner security --compliance-only --no-object-scan
```
### 与其他工具集成
```
# 导出结果以便使用 jq 进行进一步分析
s3-security-scanner security -q -f json && \
cat output/s3_scan_*.json | jq '.results[] | select(.is_public == true)'
# 查找所有 public buckets 并修复它们
s3-security-scanner security -q -f json && \
cat output/s3_scan_*.json | jq -r '.results[] | select(.is_public == true) | .bucket_name' | \
xargs -I {} aws s3api put-public-access-block --bucket {} \
--public-access-block-configuration "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"
```
## 输出文件
扫描器会在指定的输出目录中生成多种报告格式:
### JSON 报告 (`s3_scan_region_timestamp.json`)
```
{
"summary": {
"scan_time": "2025-01-15T10:30:45.123456",
"region": "us-east-1",
"account_id": "123456789012",
"total_buckets": 25,
"public_buckets": 3,
"high_severity_buckets": 3,
"average_security_score": 78.5
},
"results": [...]
}
```
### CSV 报告 (`s3_scan_region_timestamp.csv`)
适合电子表格的格式,包含所有关键指标和合规状态。
### HTML 报告 (`s3_scan_region_timestamp.html`)
美观且具有交互性的仪表板,包含:
- **执行摘要**:关键指标和风险指标
- **交互式图表**:安全评分分布、合规状态、按严重程度划分的问题
- **详细表格**:可排序和可筛选的 bucket 分析
- **合规性矩阵**:特定于框架的合规状态
- **响应式设计**:适用于桌面和移动设备
### 合规性报告 (`s3_compliance_region_timestamp.json`)
详细的合规性分析,包含特定于框架的结果和修复指南。
### 日志文件 (`s3_scan_timestamp.log`)
包含调试信息和错误详情的全面执行日志。
## 开发
### 设置开发环境
```
# Clone 仓库
git clone https://github.com/TocConsulting/s3-security-scanner.git
cd s3-security-scanner
# 创建虚拟环境
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# 以开发模式安装
pip install -e ".[dev]"
# 安装 pre-commit hooks
pre-commit install
```
## 安全修复指南
有关 S3 Security Scanner 检测到的所有安全漏洞的全面逐步修复说明,请参阅我们详细的**[修复指南](remediation-guide.md)**。
修复指南提供:
- 包含逐步操作流程的 **AWS Console 指南**
- 用于自动化和编写脚本的 **AWS CLI 命令**
- 用于程序化修复的 **Python boto3 代码**
- 用于强化多个 bucket 的**批量修复脚本**
- 针对于 GDPR、SOC 2 及其他框架的**特定合规配置**
- 针对安全事件的**应急响应程序**
## 测试
### 运行测试
该项目包含使用 Python 的 unittest 框架和 moto(用于模拟 AWS 服务)的全面单元测试。
```
# 安装开发依赖,包括 moto[s3]
pip install -e ".[dev]"
# 或手动安装测试依赖
pip install pytest pytest-cov "moto[s3]"
# 运行所有测试
python -m pytest tests/ -v
# 运行特定的测试文件
python -m pytest tests/test_compliance.py -v
# 运行以检测覆盖率
python -m pytest tests/ --cov=s3_security_scanner --cov-report=html
```
### 测试结构
```
tests/
├── __init__.py
├── test_cli.py # CLI option tests
├── test_compliance.py # Compliance framework tests
├── test_scanner.py # Scanner functionality tests
├── test_cloudtrail_logging.py # CloudTrail logging tests
├── test_gdpr_compliance.py # GDPR compliance tests
└── test_soc2_monitoring.py # SOC 2 monitoring tests
```
测试专门使用 `moto[s3]` 来模拟 AWS S3 服务,允许进行全面测试,而无需实际的 AWS 资源或产生费用。
## 支持与贡献
### 获取帮助
- **文档**:查看此 README 和内联帮助 (`--help`)
- **问题**:通过 [GitHub Issues](https://github.com/TocConsulting/s3-security-scanner/issues) 报告 Bug
- **讨论**:在 [GitHub Discussions](https://github.com/TocConsulting/s3-security-scanner/discussions) 中加入讨论
### 贡献
我们欢迎您的贡献!请参阅我们的[贡献指南](CONTRIBUTING.md)了解有关以下内容的详细信息:
- 代码风格和标准
- 测试要求
- Pull Request 流程
- 开发环境设置
### 路线图
- [ ] 与 AWS Security Hub 集成
- [ ] 支持自定义合规框架
- [ ] 自动修复功能
- [ ] REST API 接口
- [ ] Docker 容器化
- [ ] CI/CD 流水线集成
## 许可证
该项目基于 MIT 许可证授权 - 有关详细信息,请参阅 [LICENSE](LICENSE) 文件。
## 鸣谢
- **AWS 安全最佳实践**:基于官方 AWS 安全建议
- **CIS Benchmarks**:实施 CIS AWS Foundations Benchmark 控制措施
- **安全社区**:受开源安全工具生态系统启发
**安全声明**:此工具仅出于防御性安全目的而设计。在扫描 AWS 资源之前,请务必确保您拥有适当的授权。该工具需要只读权限,未经用户明确确认,不会修改任何 AWS 资源。
**性能提示**:对象级扫描是基于抽样的(默认:每个 bucket 100 个对象),以在安全覆盖范围和扫描性能之间取得平衡。如需进行详尽的对象分析,请考虑运行专门的对象级安全工具。
**版本兼容性**:此工具支持 Python 3.8+,并针对最新的 boto3 SDK 版本进行了测试。对于旧版 Python,请使用早期版本或升级您的 Python 环境。