neelkotnis/azure-security-auditor

GitHub: neelkotnis/azure-security-auditor

一款轻量级 Azure 安全态势审计 CLI 工具,通过自动化检查发现云环境中的常见错误配置与安全风险。

Stars: 0 | Forks: 0

# Azure 安全态势审计工具 一款轻量级、生产级别的 CLI 工具,用于审计 Azure 安全配置并发现常见的错误配置——类似于 Microsoft Defender for Cloud 在内部执行的检查。 ## 检查项目 | ID | 类别 | 检查项 | 严重程度 | |---|---|---|---| | AZ-001 | RBAC | 在订阅范围分配了 Owner / Contributor 角色 | CRITICAL | | AZ-002 | RBAC | 在资源组范围分配了 Owner / Contributor 角色 | HIGH | | AZ-003 | Network | NSG 包含 0.0.0.0/0 入站允许规则 | HIGH | | AZ-004 | Storage | Storage account 启用了公共 blob 访问 | HIGH | | AZ-005 | Identity | Entra ID 用户未注册 MFA | HIGH | | AZ-006 | Identity | Service principal 具有 Owner / Contributor 权限 | HIGH | | AZ-007 | Encryption | Managed disk 没有显式的加密配置 | MEDIUM | | AZ-008 | Encryption | Key Vault 暴露给公共网络且没有防火墙限制 | HIGH | | AZ-009 | Monitoring | 活动日志保留期少于 90 天 | MEDIUM | | AZ-010 | Monitoring | 关键资源类型未启用 Microsoft Defender for Cloud | HIGH | | AZ-011 | Monitoring | Key Vault 未启用诊断日志 | MEDIUM | | AZ-012 | Compute | Virtual Machine 直接附加了公共 IP | MEDIUM | | AZ-013 | Compute | Virtual Machine 没有 endpoint protection 扩展 | MEDIUM | | AZ-014 | Compute | Virtual Machine 的 OS 磁盘未使用 Azure Disk Encryption (ADE) | MEDIUM | | AZ-015 | Network | 通过 NSG 向互联网暴露了 RDP 端口 3389 | CRITICAL | | AZ-016 | Network | 通过 NSG 向互联网暴露了 SSH 端口 22 | CRITICAL | | AZ-017 | Storage | Storage account 允许非 HTTPS 流量 | HIGH | | AZ-018 | Storage | Storage account 允许旧版 TLS 版本(低于 1.2) | MEDIUM | | AZ-019 | Identity | Entra ID 租户中存在访客用户账户 | LOW | | AZ-020 | Encryption | Key Vault 缺少软删除或清除保护 | MEDIUM | ## 要求 - Python 3.10+ - 已配置 Azure 凭据 — 满足以下其一: - `az login` (Azure CLI) - 环境变量:`AZURE_CLIENT_ID`、`AZURE_CLIENT_SECRET`、`AZURE_TENANT_ID` - Managed Identity(在 Azure 上运行时) - 所需的 Azure RBAC 权限:订阅级别的 `Reader` - 所需的 Microsoft Graph 权限(用于 AZ-005、AZ-006、AZ-019): - `UserAuthenticationMethod.Read.All` - `Application.Read.All` ## 安装 ``` pip install -e . ``` ## 用法 ``` # 完整审计 — 所有检查,所有严重级别 azure-auditor # 指定特定订阅 azure-auditor --subscription # 仅显示 HIGH 和 CRITICAL 发现 azure-auditor --severity HIGH # 将 JSON 报告保存到特定目录 azure-auditor --output-dir ./reports # 仅输出终端 azure-auditor --no-json # 详细日志记录 azure-auditor --verbose ``` 或者在不安装的情况下运行: ``` PYTHONPATH=src python -m azure_security_auditor.cli --subscription ``` ## 输出 **终端** — Rich 格式的表格,按严重程度排序(CRITICAL 优先): ``` ╭──────────────────────────────────────────────────────────────────╮ │ Azure Security Posture Audit │ │ Subscription: My Production Subscription │ │ ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx │ │ Run at: 2026-07-12T10:00:00Z │ │ Findings: 12 total (2 CRITICAL 6 HIGH 4 MEDIUM 0 LOW) │ ╰──────────────────────────────────────────────────────────────────╯ Severity Check ID Check Resource Detail ✖ CRITICAL AZ-015 RDP Port 3389 Exposed to Internet... /subscriptions/. ... ✖ CRITICAL AZ-001 Owner Role Assigned at Subscription... ... ■ HIGH AZ-010 Defender for Cloud Not Enabled — VMs /subscriptions/. ... ... ``` **JSON** — 写入到 `reports/azure_audit__.json`。 ## 项目结构 ``` src/ azure_security_auditor/ cli.py # argparse entrypoint engine.py # ThreadPoolExecutor orchestrator models.py # Finding, AuditResult, Severity checks/ rbac.py # AZ-001, AZ-002 network.py # AZ-003, AZ-015, AZ-016 storage.py # AZ-004, AZ-017, AZ-018 identity.py # AZ-005, AZ-019 service_principals.py # AZ-006 encryption.py # AZ-007, AZ-008, AZ-020 monitoring.py # AZ-009, AZ-010, AZ-011 compute.py # AZ-012, AZ-013, AZ-014 reporters/ terminal.py # Rich table output json_reporter.py # JSON file output ``` ## 身份验证 使用 `DefaultAzureCredential` — 按以下顺序尝试: 1. 环境变量(`AZURE_CLIENT_ID`、`AZURE_CLIENT_SECRET`、`AZURE_TENANT_ID`) 2. Azure CLI(`az login`) 3. Managed Identity ### CI/CD (Service Principal) ``` export AZURE_CLIENT_ID="" export AZURE_CLIENT_SECRET="" export AZURE_TENANT_ID="" azure-auditor --subscription ```
标签:Azure, LNA, 关系图谱, 基线检查, 逆向工具, 配置核查