black0405/azure_validator_prowler
GitHub: black0405/azure_validator_prowler
一个 Azure 安全审计验证工具,通过五种独立方法交叉验证 Prowler 扫描结果以识别误报和漏报,并生成附带审计证据的 Excel 报告。
Stars: 0 | Forks: 0
# azure_validator — 交叉验证 Prowler Azure 扫描结果
一个验证工具套件,通过**独立证据**重新检查 Prowler 的 Azure 扫描结果,让您可以区分真实问题与误报。它沿用了 `gcp_validator` 的设计:对于每一项 Prowler 检查,它最多运行五种方法,并列出每个方法的判定结果,同时提供共识结论以及误报 / 漏报标志。
## 五种验证方法
| # | 方法 | 具体作用 |
|---|--------|--------------|
| 1 | **API** | 直接通过 ARM 读取确切属性(通过 Resource Graph / ARM REST)。 |
| 2 | **Prowler replica** | 重新实现 Prowler 确切的通过/失败规则,并关联到 [Prowler Hub](https://hub.prowler.com/) 页面。 |
| 3 | **Logs** | 通过 **Azure Monitor Activity Logs**(针对该资源的近期写操作)提供佐证。 |
| 4 | **Alternate** | 提供*不同*的信号(例如对比 `networkAcls.defaultAction=Deny` 与 `publicNetworkAccess=Disabled`)。 |
| 5 | **Exposure** | 仅用于公网暴露检查:尝试从互联网访问该资源。 |
不适用的方法将返回 **N/A 及其原因**,而不是伪造的判定结果。
共识结论(不包含方法 2)将与 Prowler 的发现进行比对 →
`AGREE` / `LIKELY_FALSE_POSITIVE` / `LIKELY_FALSE_NEGATIVE` / `INCONCLUSIVE`。
## 安装
```
cd azure_validator
python -m venv .venv && . .venv/bin/activate # (Windows: .venv\Scripts\activate)
pip install -r requirements.txt
```
## 身份验证
该工具仅需**读取**权限。凭据按以下顺序解析:
```
# 1. 显式 service principal (flags 或 env vars):
python run_all.py -s SUB --tenant-id T --client-id C --client-secret S --prowler out.json
# ...或者是 certificate 而不是 secret:
python run_all.py -s SUB --tenant-id T --client-id C --cert-path /path/sp.pem
# ...或者是标准 env vars:
export AZURE_TENANT_ID=... AZURE_CLIENT_ID=... AZURE_CLIENT_SECRET=...
# 2. 否则 DefaultAzureCredential (managed identity、az login 等):
az login
export AZURE_SUBSCRIPTION_ID=
```
推荐角色:**Reader** + **Reader and Data Access**,外加 *Monitoring
Reader*(用于方法 3)。Entra 检查还需要主体(principal)具备 **Microsoft Graph** 的读取
权限(例如 `Directory.Read.All`、`Policy.Read.All`)。
## 用法
```
# 所有已实施的检查,与 Prowler OCSF/CSV 导出对比:
python run_all.py --subscription SUB_ID --prowler prowler-output.ocsf.json -o report.xlsx
# 仅 Storage:
python run_all.py -s SUB_ID --service storage --prowler out.ocsf.json
# 启用 method-5 internet 探测(会发起真实的 outbound 连接):
python run_all.py -s SUB_ID --service storage --enable-exposure-probe
# 列出已实现的内容:
python run_all.py --list
# 单独运行一个 control(从 azure_validator 目录中):
python -m checks.storage.storage_account_public_network_access_disabled -s SUB_ID --prowler out.ocsf.json
```
`--prowler` 接受 Prowler 的 **OCSF JSON** 或 **CSV** 格式。如果不指定,该工具将
验证实时的 Azure 状态并报告每种方法的判定结果。
## 输出
生成一个 `.xlsx` 文件,包含一个 **Validation** 工作表(每个资源每项检查占一行)和一个
**Summary** 工作表,其结构与 GCP 工具完全一致。`LIKELY_FALSE_POSITIVE`
对应的行将被高亮显示。
## 审计证据(截图)
添加 `--evidence-dir DIR`(别名 `--screenshots DIR`)即可生成**针对每项发现的 PNG
证据卡**——包括检查项、资源、每种方法的 PASS/FAIL、从
API 读取的实际配置值、UTC 捕获时间戳,以及 Azure Portal
的深度链接。Excel 文件中也会新增一个带有超链接的 **Console Link** 列。
```
python run_all.py -s SUB --prowler out.ocsf.json --evidence-dir ./evidence
# 仅包含值得附加到 findings 的 exceptions:
python run_all.py -s SUB --prowler out.ocsf.json --evidence-dir ./evidence --evidence-findings-only
```
图像通过无头模式(Pillow)从工具已收集的数据中生成,因此
它们包含适合作为审计证据的来源信息(API 源 + 时间戳);
深度链接也允许您在审计人员需要时获取实时的 Portal 截图。
## 覆盖范围
**已实现涵盖 21 种服务的全部 191 项 Azure 检查。**
| Service | n | Service | n | Service | n |
|---|--:|---|--:|---|--:|
| defender | 26 | app | 20 | entra | 19 |
| storage | 19 | monitor | 15 | vm | 12 |
| sqlserver | 12 | network | 11 | postgresql | 10 |
| keyvault | 10 | aks | 8 | cosmosdb | 7 |
| mysql | 6 | databricks | 4 | containerregistry | 3 |
| iam | 3 | recovery | 2 | apim/aisearch/policy/appinsights | 1 each |
发现过程使用 **Azure Resource Graph**(一个返回完整
资源 `properties` 的 KQL endpoint),因此大多数属性检查仅需几行代码;子资源
设置(blob/file service、SQL auditing、App Service 配置、flexible-server
参数)通过 ARM REST 按需获取;Entra 使用 **Microsoft Graph**。
### 报告为 MANUAL / 尽力而为 的检查
一些控制项无法通过单一的只读 ARM/Graph 属性来证明,因此
它们会尽可能运行可行的部分,并将其余部分标记为 **MANUAL 及其原因**,而不是
盲目猜测。这些控制项包括:基于 Defender 评估的检查(endpoint protection、
system updates、container image scan/vulns)、`vm_backup_*` / `vm_jit_access` /
`recovery_vault_*`(Recovery Services data-plane)、运行时版本“是否为最新”的
检查(`app_*_version_is_latest`、`app_function_latest_runtime_version`)、
Function app-settings 检查(App Insights、access keys、identity roles)、NSG
flow-log 检查、`apim_threat_detection_llm_jacking`,以及 Entra
MFA / Conditional-Access / sign-in 检查。每项检查的 docstring 都说明了其
确切的判定逻辑和 Hub 链接——值得对照您的 Prowler 版本进行审查。
## 添加检查项
1. 创建 `checks//.py`。
2. 继承 `azval.resource_check.ResourceCheck`(或服务基类),设置
`check_id`,实现 `discover_resources()` + `evaluate()`(以及适用的任意
五种方法)。
3. `run_all.py` 会自动发现它;`python -m checks..` 可单独运行它。
标签:Azure, Prowler, 自动化验证, 误报剔除, 逆向工具