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, 自动化验证, 误报剔除, 逆向工具