hiagokinlevi/cloud-posture-watch
GitHub: hiagokinlevi/cloud-posture-watch
多云安全态势评估 CLI 工具,通过只读方式发现暴露、日志缺口与配置漂移并输出标准化报告。
Stars: 2 | Forks: 0
# cloud-posture-watch
**AWS、Azure 和 GCP 的云安全态势评估 — 暴露分析、日志缺口和配置漂移检测。**
`cloud-posture-watch` 是一个多云 CLI 工具,用于审计云环境的安全态势。它通过只读 API 收集 AWS、Azure 和 GCP 的配置状态,将其与有原则的安全基线进行比较,并生成涵盖公共暴露、日志覆盖率、加密态势、VPC 网络遥测和配置漂移的结构化报告。
## 功能
- **多云支持** — 在单一工具中支持 AWS、Azure 和 GCP
- **暴露分析** — 识别公开可访问的存储、计算和网络资源
- **日志缺口检测** — 检查审计跟踪、访问日志和流量日志是否启用
- **VPC 流量日志覆盖率** — 标记缺少流量日志、缺少交付目标、缺少拒绝流量捕获或聚合窗口过粗的 AWS VPC
- **离线 AWS CloudTrail 审查** — 扫描导出的跟踪配置,查找禁用的日志记录、缺少验证、缺少全局事件、缺少 CloudWatch 转发和管理事件缺口
- **离线 AWS IAM 审查** — 扫描导出的 IAM 证据,查找根账户 MFA 缺口、陈旧的活动用户密钥和宽松的策略
- **离线 AWS RDS 审查** — 扫描导出的 RDS 实例和集群证据,查找缺少存储加密和公开数据库暴露
- **离线 AWS 密钥关联** — 将 Secrets Manager 或 Parameter Store 的库存与已批准硬编码凭据发现进行对比,以识别未管理的字面量和明文凭据参数
- **离线 Azure SQL 审查** — 扫描导出的逻辑服务器和数据库证据,查找禁用的 TDE、公开网络访问和宽泛的防火墙规则
- **离线 Azure RBAC 审查** — 扫描角色分配导出,查找广泛的 Owner/Contributor 访问、来宾特权分配、服务主体 Owner 授予和通配符自定义角色
- **离线 GCP Cloud SQL 审查** — 扫描导出的 Cloud SQL 实例证据,查找公开 IPv4 暴露、弱授权网络和缺少 SSL/TLS 强制
- **离线 Azure NSG 审查** — 扫描导出的 `az network nsg list` JSON,查找公开的管理员、数据库和宽泛的入站规则
- **离线 GCP 防火墙审查** — 扫描导出的 `gcloud compute firewall-rules list` JSON,查找公开的管理员、数据库、Web 和宽泛的入站规则
- **加密态势** — 验证存储和数据库服务的静态和传输中加密
- **配置漂移检测** — 将实时状态与 YAML 基线进行比较并突出显示偏差
- **风险评分** — 在 CLI 摘要、Markdown、JSON 和 HTML 报告中应用共享的 0-100 严重性模型
- **稳定的 JSON 契约** — 发布 v1 态势报告模式,供下游仪表板和 CI 工具使用
- **SARIF 导出** — 将保存的态势 JSON 转换为 GitHub Code Scanning 兼容的发现
- **Markdown 报告** — 包含发现、评分和修复建议的可读输出
- **监控模式** — 比较最新的 JSON 报告与先前的快照,仅提示新引入的发现
- **GitHub Action 支持** — 符合 Marketplace 的组合操作,验证 CLI 输入、安装工具并暴露生成的报告路径作为工作流输出
- **Slack 和 Teams Webhook** — 向传入 Webhook 发送态势报告摘要或打印用于批准的干运行负载
- **云 SOAR 路由** — 将标准化 AWS、Azure 和 GCP 发现映射到防御响应剧本、基于严重性的审批期望和保留证据的安全准备步骤
- **可扩展基线** — 最小/标准/严格配置文件,全部可自定义
## 快速开始
### 先决条件
- Python 3.11+
- 要评估的云账户的只读凭证
- `pip install cloud-posture-watch`(或从源代码安装,见下文)
### 从源代码安装
```
git clone https://github.com/hiagokinlevi/cloud-posture-watch.git
cd cloud-posture-watch
python -m venv --system-site-packages .venv
./.venv/bin/python -m pip install -e . --no-deps --no-build-isolation
```
### 配置
```
cp .env.example .env
# 编辑 .env 并设置 PROVIDER 以及目标云端的凭证
```
### 运行评估
```
# AWS — 使用当前的 AWS 配置文件
k1n-posture assess --provider aws --profile standard
# Azure
k1n-posture assess --provider azure --profile standard
# GCP
k1n-posture assess --provider gcp --profile strict
# 检查与基线的偏差
k1n-posture drift --provider aws --baseline baselines/aws/standard.yaml
# 将保存的 JSON 报告转换为 HTML 或 SARIF 以用于 CI 系统
k1n-posture posture-report --input ./output/last_run.json --format html --output-dir ./output
k1n-posture posture-report --input ./output/last_run.json --format sarif --output-dir ./output
# 离线下 Azure NSG 暴露审查
az network nsg list -o json > nsgs.json
k1n-posture scan-azure-nsgs --input nsgs.json --fail-on high
# 离线下 AWS IAM 姿态审查
k1n-posture scan-aws-iam --input aws-iam-posture.json --fail-on high
# 离线下 AWS CloudTrail 日志加固审查
aws cloudtrail describe-trails --include-shadow-trails false --output json > cloudtrail-trails.json
# 有选择地将按轨迹名称键控的 get-trail-status 证据合并到:
# {"trailList": [...], "status_map": {"org-trail": {"IsLogging": true}}}
k1n-posture scan-aws-cloudtrail --input cloudtrail-trails.json --fail-on high
# 离线下 AWS RDS 加密与公开暴露审查
aws rds describe-db-instances --output json > aws-rds-instances.json
k1n-posture scan-aws-rds --input aws-rds-instances.json --fail-on high
# 离线下 AWS 托管密钥相关性审查
# 将已批准的 Secrets Manager / SSM 清单与硬编码凭证证据结合
k1n-posture scan-aws-secrets --input aws-secrets-posture.json --fail-on high
# 离线下 Azure RBAC 姿态审查
az role assignment list --all -o json > azure-rbac.json
k1n-posture scan-azure-rbac --input azure-rbac.json --trusted-domain example.com --fail-on high
# 离线下 Azure SQL 加密与防火墙审查
az sql server list -o json > azure-sql-servers.json
az sql db list --server prod-sql --resource-group rg-prod -o json > azure-sql-databases.json
# 将已批准的导出合并为一个文件,格式为 {"servers": [...], "databases": [...]}
k1n-posture scan-azure-sql --input azure-sql-export.json --fail-on high
# 离线下 GCP Cloud SQL 公共 IP 与 TLS 审查
gcloud sql instances list --format=json > cloud-sql-instances.json
k1n-posture scan-gcp-cloud-sql --input cloud-sql-instances.json --fail-on high
# 离线下 GCP IAM 姿态审查
k1n-posture scan-gcp-iam --input gcp-iam-policies.json --org-domain example.com --fail-on high
# 跨云离线下 IAM 比较
k1n-posture scan-iam-comparison \
--aws-input aws-iam-posture.json \
--azure-input azure-rbac.json \
--gcp-input gcp-iam-policies.json \
--trusted-domain example.com \
--org-domain example.com \
--fail-on high
# 离线下 GCP 防火墙暴露审查
gcloud compute firewall-rules list --format=json > firewalls.json
k1n-posture scan-gcp-firewalls --input firewalls.json --fail-on high
# 将报告摘要发送至 Slack 或 Teams
k1n-posture notify-webhook \
--input ./output/posture_aws_latest.json \
--target slack \
--webhook-url "$POSTURE_WEBHOOK_URL"
# 在不发送的情况下审查有效载荷
k1n-posture notify-webhook \
--input ./output/posture_aws_latest.json \
--target teams \
--dry-run
# 打印稳定的后态报告 JSON 架构
k1n-posture json-schema
# 将最新报告与上一个快照比较并干运行 Slack 告警
k1n-posture watch-report \
--input ./output/posture_aws_latest.json \
--state-file ./output/aws-watch-state.json \
--alert-on high \
--target slack \
--dry-run
# 将标准化云事件路由至 SOAR 剧本
k1n-posture resolve-soar \
--input ./samples/events/aws_public_bucket_event.json \
--format json
```
## 架构
```
cloud-posture-watch/
├── providers/ # Cloud-specific data collectors (read-only API calls)
│ ├── aws/
│ ├── azure/
│ └── gcp/
├── analyzers/ # Cross-cloud analysis logic (exposure, logging, drift)
├── baselines/ # YAML baseline profiles per provider
├── soar/ # Cloud SOAR rules, approval policy, and playbooks
├── schemas/ # Pydantic models for all data structures
├── reports/ # Report generation
├── cli/ # Click CLI entry point
└── docs/ # Extended documentation
```
每个 **提供者** 模块收集原始配置状态并返回类型化的数据类。**分析器** 消费提供者的输出并应用策略逻辑。**报告** 模块将发现序列化为可读输出。
**SOAR** 层在态势分析或离线证据审查后消费标准化发现。它将 `PUBLIC_BUCKET`、`SERVICE_PRINCIPAL_OWNER` 或 `STALE_ACTIVE_KEY` 等事件标志映射到提供者特定的响应剧本、基于严重性的审批期望以及在执行任何实时更改前保留证据的安全准备步骤。
## 支持的服务
| 提供者 | 服务 | 检查 |
|--------|------|------|
| AWS | S3 | 公共访问块、加密、日志记录、版本控制 |
| AWS | CloudTrail | 已启用、多区域、全局事件、日志验证、CloudWatch 转发、管理事件 |
| AWS | 安全组 | 全局开放的 SSH/RDP、公共管理员/数据库暴露 |
| AWS | VPC 流量日志 | 缺少遥测、缺少交付目标、缺少拒绝流量捕获、聚合窗口过粗 |
| AWS | IAM | 离线导出审查根账户 MFA、陈旧的活动用户访问密钥和宽松策略 |
| AWS | RDS | 离线导出审查存储加密、公开可访问性和公共数据库子网组风险 |
| AWS | Secrets / SSM | 离线库存关联以实现托管密钥采纳、未托管硬编码凭据和明文凭据参数 |
| Azure | SQL 数据库 | 离线导出审查禁用 TDE、公开网络访问和 Azure 服务防火墙访问 |
| Azure | RBAC | 离线导出审查广泛的 Owner/Contributor 范围、来宾特权分配、服务主体 Owner 授予和通配符自定义角色 |
| Azure | 存储账户 | 仅 HTTPS、公开 Blob 访问、加密 |
| Azure | NSGs | 离线导出审查世界开放的管理员、数据库、Web 和宽泛的入站规则 |
| GCP | Cloud SQL | 离线导出审查公开 IPv4 暴露、SSL/TLS 强制和宽泛的授权网络 |
| GCP | Cloud Storage | 统一存储桶级访问、公开 ACL |
| GCP | IAM | 离线导出审查原始角色、公开 IAM 成员、外部敏感角色用户、默认服务账户和服务账户密钥年龄 |
| GCP | 防火墙规则 | 离线导出审查世界开放的管理员、数据库、Web 和宽泛的入站规则 |
| GCP | Cloud Logging | 审计日志配置 |
## 所需权限
所有收集器均使用**只读**权限。不执行写入操作。
### AWS(最低 IAM 策略)
```
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:GetBucketAcl",
"s3:GetBucketEncryption",
"s3:GetBucketLogging",
"s3:GetBucketVersioning",
"s3:GetBucketPublicAccessBlock",
"cloudtrail:DescribeTrails",
"cloudtrail:GetTrailStatus",
"ec2:DescribeSecurityGroups",
"ec2:DescribeFlowLogs",
"ec2:DescribeVpcs",
"iam:GetAccountSummary",
"iam:GenerateCredentialReport",
"iam:GetCredentialReport",
"iam:ListPolicies",
"iam:GetPolicyVersion"
],
"Resource": "*"
}
```
离线 AWS CloudTrail 审查可以使用 `aws cloudtrail describe-trails --include-shadow-trails false --output json` 的批准 JSON 导出代替实时凭证。当 `get-trail-status` 输出可用时,按跟踪名称添加可选的 `status_map` 证据键,以便扫描器可以标记禁用的日志记录以及验证、全局事件、KMS、CloudWatch 和管理事件缺口。
离线 AWS IAM 审查可以使用批准 JSON 证据包代替实时凭证。包含 `account_summary.SummaryMap.AccountMFAEnabled`、带有 `access_key_*_active` 和 `access_key_*_age_days` 的凭证报告用户行,以及 `policies[].document` 下的策略文档。
离线 AWS RDS 审查可以使用 `aws rds describe-db-instances --output json` 的批准 JSON 导出,以及在 Aurora 集群在范围内时的可选 `aws rds describe-db-clusters --output json` 内容。分析器接受常见的包装响应形状,并标记缺少 `StorageEncrypted`、`PubliclyAccessible` 和包含公共子网的 DB 子网组。
离线 AWS 密钥关联可以使用包含 `secrets`、`parameters` 和可选 `hardcoded_credentials` 数组的批准 JSON 包。密钥可以来自 `aws secretsmanager list-secrets --output json`,参数可以来自 `aws ssm describe-parameters --output json`,硬编码凭据证据可以来自单独的批准代码或配置审查。分析器关联类似 `DB_PASSWORD` 或 `API_TOKEN` 的凭据标识符与托管密钥名称,标记与 AWS 托管密钥重复的硬编码字面量,标记仍缺少托管密钥对应项的硬编码凭据,并报告以明文 `String` 值存储的 SSM 参数中的凭据。
### Azure
需要目标订阅内置的 **Reader** 角色。
离线 Azure RBAC 审查可以使用批准 JSON 导出代替实时凭证。使用 `az role assignment list --all -o json` 导出角色分配;审查通配符自定义角色时,将导出包装为 `{"assignments": [... "role_definitions": [...]}` 并包含来自 `az role definition list --custom-role-only true -o json` 的角色定义。
离线 Azure SQL 审查可以使用批准 JSON 证据代替实时凭证。提供一个包含 `servers` 和 `databases` 数组的 JSON 文件,例如通过组合 `az sql server list -o json`、每个服务器的防火墙规则导出和 `az sql db list --server --resource-group -o json` 结果到一个批准的包中。分析器在存在时检查 `publicNetworkAccess`、防火墙规则范围和透明数据加密状态。
### GCP
需要在目标项目上拥有 **roles/viewer** IAM 角色。
离线 GCP Cloud SQL 审查可以使用 `gcloud sql instances list --format=json` 的批准 JSON 导出代替实时凭证。分析器检查 `settings.ipConfiguration.ipv4Enabled`、公开 `ipAddresses`、`authorizedNetworks` 以及 `requireSsl` 或 `sslMode` 等 SSL/TLS 控制。
离线 GCP IAM 审查可以使用批准 JSON 证据代替实时凭证。使用包含 `bindings` 记录的 IAM 策略导出,并在需要密钥年龄审查时包含带有 `service_account`、`key_id` 和 `created_at_days_ago` 的可选 `service_account_keys` 元数据。
实时防火墙收集使用只读 Compute API 访问,例如 `compute.firewalls.list`;离线审查仅需可列出防火墙规则的账户的 JSON 导出。
## 基线配置文件
| 配置文件 | 描述 |
|----------|------|
| `minimal` | 仅捕获关键错误配置(例如公共存储桶) |
| `standard` | 推荐用于大多数生产环境 |
| `strict` | 高保证环境;也会在警告时失败 |
基线是 `baselines//` 中的 YAML 文件。自由派生并自定义它们。
## 输出
报告写入 `./output/`(可通过 `OUTPUT_DIR` 配置)。每次运行生成:
- `posture__.md` — Markdown 叙事报告
- `posture__.json` — 机器可读的发现(用于 CI 集成)
- `posture__.sarif` — GitHub Code Scanning 兼容的发现导出
共享风险模型将发现加权为 CRITICAL=10、HIGH=5、MEDIUM=2、LOW=1、INFO=0,并将总分上限设为 100。JSON 导出同时包含 `risk_score` 和 `risk_level`,以便下游仪表板和 CI 门控保持与人类可读报告相同的后视解释。
JSON 态势导出包含 `$schema` 和 `schema_version` 字段。`k1n-posture json-schema` 打印 v1 契约,供下游验证器和仪表板使用,包括必需的报告元数据、发现计数、发现记录、漂移记录以及风险模型字段。
Webhook 通知使用保存的 JSON 态势报告作为输入。`k1n-posture notify-webhook --target slack|teams` 构建提供者摘要、严重性计数和顶级发现,然后发布到 HTTPS 入站 Webhook。使用 `--dry-run` 进行变更审查以打印有效负载而不发送数据或在命令输出中暴露 Webhook 密钥。
监控模式设计用于已定期刷新态势 JSON 制品的调度运行器。`k1n-posture watch-report --input latest.json --state-file .watch/aws.json --alert-on high --target slack|teams` 将最新报告与先前的快照进行比较,总结新的、已解决的以及持续存在的发现,更新状态文件,并且仅在引入符合所配置严重性阈值的新发现时才发出警报。默认情况下,第一次运行会播种状态而不发出警报,以避免产生嘈杂的启动通知;如需初始警报,请添加 `--alert-on-first-run`。
该仓库现在包含一个组合 GitHub Action,位于 [`action.yml`](action.yml)。它安装 `cloud-posture-watch`、在不调用 Shell 的情况下验证请求的 `k1n-posture` 子命令、在工作流工作区中运行、脱敏暴露的命令输出中的敏感 CLI 值,并将最新的 Markdown、JSON、HTML 和 SARIF 报告路径作为步骤输出发布,供后续上传或通知步骤使用。
要发布 SARIF 到 GitHub Code Scanning,请先运行产生 JSON 的命令,然后使用 `posture-report` 将该 JSON 工件转换为 SARIF。
## 在 CI 中运行
```
name: posture
on:
workflow_dispatch:
push:
branches: [main]
jobs:
assess:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v4
- name: Run AWS posture assessment
id: posture
uses: hiagokinlevi/cloud-posture-watch@main
with:
command: assess
provider: aws
args: --profile standard --fail-on high
output-dir: ./output
env:
AWS_ACCESS_KEY_ID: ${{ secrets.POSTURE_AWS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.POSTURE_AWS_SECRET }}
AWS_REGION: us-east-1
- name: Upload Markdown report
if: ${{ steps.posture.outputs.report-markdown != '' }}
uses: actions/upload-artifact@v4
with:
name: posture-report
path: ${{ steps.posture.outputs.report-markdown }}
```
当你的工作流已经拥有来自先前 JSON 产生步骤的 JSON 态势工件时,将以下步骤追加到将其转换为 SARIF 并上传到 GitHub Code Scanning:
```
- name: Convert posture JSON to SARIF
id: posture-sarif
uses: hiagokinlevi/cloud-posture-watch@main
with:
command: posture-report
args: --input ${{ steps.posture-json.outputs.report-json }} --format sarif
output-dir: ./output
- name: Upload SARIF to GitHub Code Scanning
if: ${{ steps.posture-sarif.outputs.report-sarif != '' }}
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: ${{ steps.posture-sarif.outputs.report-sarif }}
```
当你想使用监控模式进行计划增量提醒而不是全新实时评估时,请使用 `command: watch-report` 并设置 `args: --input ./output/posture_aws_latest.json --state-file .watch/aws-watch-state.json --alert-on high --target slack --webhook-url ${{ secrets.POSTURE_SLACK_WEBHOOK }}`。保持 `--provider` 和 `--output-dir` 在专用操作输入中,以便操作可以验证并一致地发布解析后的路径。
## 安全
有关负责任披露策略,请参阅 [SECURITY.md](SECURITY.md)。
## 许可证
CC BY 4.0 — 请参阅 [LICENSE](LICENSE)。
标签:AWS, Azure, Azure SQL, Cloud Security Posture Management, CloudTrail, CSPM, DPI, GCP, GCP CloudSQL, IAM审计, RDS安全, Secrets管理, TinkerPop, VPC流日志, 公网暴露, 关系图谱, 加密检查, 反取证, 合规扫描, 图探索, 基线检查, 安全评估, 密钥泄露检测, 日志缺口, 暴露分析, 漏洞利用检测, 离线审计, 网络流量分析, 逆向工具, 配置漂移