jaradat13/cloudsec-scanner
GitHub: jaradat13/cloudsec-scanner
一款用于扫描 AWS 和 Azure 常见安全错误配置的 Python 工具,生成防篡改签名报告并借助 Claude 提供修复指南。
Stars: 0 | Forks: 0
# cloudsec-scanner
一款用于扫描 AWS 和 Azure 常见安全错误配置的 Python 工具,可生成**防篡改的签名 JSON 报告**,并利用 Claude (Anthropic) 以通俗易懂的语言解释每项发现,提供分步修复指南。
## 扫描内容
| 提供商 | 资源 | 检查项 |
|---|---|---|
| AWS | S3 Buckets | 公开 ACL、公开访问块已禁用、无加密、未开启版本控制、未开启日志记录 |
| AWS | IAM | Root MFA 已禁用、Root 访问密钥、用户缺少 MFA、过期的访问密钥 (>90天)、通配符管理员策略 |
| AWS | Security Groups | 所有流量开放 (0.0.0.0/0)、危险端口开放 (SSH/22, RDP/3389, MySQL/3306, Postgres/5432, MongoDB/27017, Redis/6379) |
| Azure | NSGs | 全端口通配符规则、对互联网开放的危险端口 |
## 快速开始
### 1. 安装
```
git clone
cd cloudsec-scanner
pip install -r requirements.txt
```
### 2. 生成签名密钥对 (仅需一次)
```
python main.py --generate-keys
# 创建:private.pem(保密)、public.pem(可共享)
```
### 3. 运行扫描
```
# 仅限 AWS,签署报告,使用 LLM 解释
export ANTHROPIC_API_KEY=sk-ant-...
python main.py --providers aws --explain --sign --key private.pem --output report.json
# AWS + Azure
python main.py \
--providers aws azure \
--subscription-id \
--explain \
--sign --key private.pem \
--output report.json
# 仅筛选 CRITICAL 和 HIGH
python main.py --providers aws --severity CRITICAL HIGH --explain
# 不使用 LLM(仅结果 + 签署的报告)
python main.py --providers aws --sign --key private.pem
```
### 4. 验证报告是否被篡改
```
python main.py --verify report.json --public-key public.pem
# ✅ 报告验证成功
```
## 报告格式
输出为**防篡改的 JSON 封包**:
```
{
"payload": {
"schema_version": "1.0",
"generated_at": "2025-01-15T10:30:00+00:00",
"scanner": "cloudsec-scanner",
"summary": {
"total_findings": 12,
"severity_counts": { "CRITICAL": 2, "HIGH": 5, "MEDIUM": 3, "LOW": 2 },
"resource_types": ["IAMAccount", "S3Bucket", "SecurityGroup"]
},
"findings": [
{
"resource_type": "SecurityGroup",
"resource_id": "sg-0abc123",
"check": "OpenPort22",
"severity": "HIGH",
"detail": "SG 'web-sg' allows SSH (port 22) from 0.0.0.0/0.",
"llm_analysis": {
"explanation": "This security group allows anyone on the internet to attempt SSH connections to your instances.",
"risk": "Attackers can run automated brute-force attacks against SSH. A weak or default password would grant full server access.",
"remediation": {
"summary": "Restrict SSH to specific trusted IP ranges only.",
"steps": [
"Go to EC2 → Security Groups → Select the group",
"Edit inbound rules → Remove the 0.0.0.0/0 SSH rule",
"Add a new rule: Type=SSH, Source=Your IP or VPN CIDR"
],
"example_code": "aws ec2 revoke-security-group-ingress --group-id sg-0abc123 --protocol tcp --port 22 --cidr 0.0.0.0/0"
},
"fix_effort": "Low"
}
}
]
},
"integrity": {
"algorithm": "RSA-SHA256-PKCS1v15",
"sha256": "a3f9b2...",
"signature": "base64-encoded-RSA-signature...",
"public_key_fingerprint": "sha256-of-public-key..."
}
}
```
### 防篡改原理
1. `payload` 被序列化为**规范化 JSON**(排序键,无空格)—— 这是确定性的。
2. 计算该规范化 JSON 的 **SHA-256 摘要**。
3. 使用您的私钥(PKCS#1 v1.5 + SHA-256)对该摘要进行 **RSA 签名**。
4. 任何拥有 `public.pem` 的人都可以重新规范化 payload、重新计算摘要并验证签名 —— 对任何字段的任何修改都会导致验证失败。
HMAC-SHA256 签名也作为更轻量级的替代方案受到支持(无需 PKI)。
## 身份验证
### AWS
使用 [boto3 凭证链](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html):
- 环境变量(`AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY`)
- `~/.aws/credentials` 文件(`--profile my-profile`)
- IAM 实例角色 / ECS 任务角色 / Lambda 执行角色(自动)
所需的最低 IAM 权限(只读):
```
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets", "s3:GetBucketAcl", "s3:GetBucketPublicAccessBlock",
"s3:GetBucketEncryption", "s3:GetBucketVersioning", "s3:GetBucketLogging",
"iam:GetAccountSummary", "iam:ListUsers", "iam:ListMFADevices",
"iam:GetLoginProfile", "iam:ListAccessKeys", "iam:ListPolicies", "iam:GetPolicyVersion",
"ec2:DescribeSecurityGroups"
],
"Resource": "*"
}
```
### Azure
使用 [DefaultAzureCredential](https://docs.microsoft.com/en-us/python/api/azure-identity/azure.identity.defaultazurecredential):
- `az login`(本地开发)
- 托管标识(Azure 虚拟机、容器实例)
- 环境变量(`AZURE_CLIENT_ID`、`AZURE_CLIENT_SECRET`、`AZURE_TENANT_ID`)
最低角色:**网络参与者**(读取)或具有 `Microsoft.Network/networkSecurityGroups/read` 权限的自定义角色。
## 部署
### Docker
```
# 构建
docker build -t cloudsec-scanner .
# 运行
docker run --rm \
-e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \
-e AWS_DEFAULT_REGION=us-east-1 \
-e ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY \
-v $(pwd)/keys:/app/keys:ro \
-v $(pwd)/reports:/app/reports \
cloudsec-scanner \
--providers aws --explain --sign --key /app/keys/private.pem
```
### AWS Lambda(定时执行,每日)
```
cd deploy/
# 首先构建 dependency layer
mkdir -p layer/python
pip install -r ../requirements.txt -t layer/python
cd layer && zip -r ../layer.zip python && cd ..
# 部署
terraform init
terraform apply \
-var="report_bucket=my-security-reports" \
-var="signing_secret=$(openssl rand -hex 32)" \
-var="anthropic_api_key=$ANTHROPIC_API_KEY" \
-var="alert_email=security@mycompany.com"
```
Lambda 函数按计划运行(默认:每日),将签名报告存储到 S3,并在检测到 CRITICAL 或 HIGH 级别的发现时发送 SNS 电子邮件警报。
## CLI 参考
```
--providers aws azure Cloud providers to scan (default: aws)
--region us-east-1 AWS region
--profile PROFILE AWS named profile
--subscription-id ID Azure subscription ID
--severity CRITICAL HIGH Filter by severity
--explain Enrich findings with LLM explanations
--model MODEL Anthropic model (default: claude-sonnet-4-20250514)
--max-explain N Max findings to send to LLM (default: 20)
--sign Sign report with RSA key
--key private.pem RSA private key for signing
--hmac-secret SECRET HMAC secret (alternative to --key)
--output report.json Output file path
--verify report.json Verify an existing report
--public-key public.pem RSA public key for verification
--generate-keys Generate RSA key pair
--quiet Suppress terminal output
```
## 退出码
| 代码 | 含义 |
|------|---------|
| 0 | 扫描完成,未发现 CRITICAL 级别的问题 |
| 1 | 扫描完成,发现 CRITICAL 级别的问题 |
| 2 | 验证失败(报告已被篡改) |
这使得该扫描器能够在 CI/CD 流水线中使用:
```
python main.py --providers aws --severity CRITICAL || echo "CRITICAL findings — blocking deploy"
```
## 诚实的局限性
- **只读**:该扫描器永远不会修改您的基础设施。它仅调用 `Describe*`、`List*` 和 `Get*` API。
- **不支持跨账户**:仅扫描您的凭证有权访问的账户/订阅。对于多账户组织,请为每个账户运行一次,或使用 AWS Organizations + CloudFormation StackSets。
- **LLM 分析需要付费**:发送给 LLM 的每项发现都会消耗 API token。`--max-explain` 标志对此进行了限制(默认:每次运行 20 项发现)。
- **不能替代 AWS Security Hub / Defender for Cloud**:这些服务拥有更深入的集成和持续的监控功能。此工具最适合用于时间点检查和 CI/CD 门禁。
- **Azure 支持仅限 NSG**:Azure 还有许多其他安全面(Storage、Key Vault、RBAC)。欢迎提交 PR。
标签:AI修复建议, AWS, Azure, CISA项目, DPI, Python, 基线扫描, 指令遵循, 无后门, 请求拦截, 足迹分析, 逆向工具