一款轻量级、生产级风格的 CLI 工具,用于审计 Azure 安全配置并暴露常见错误配置 — 复现 Microsoft Defender for Cloud 在内部执行的检查。
| ID | 类别 | 检查项 | 严重程度 |
|---|---|---|---|
| AZ-001 | RBAC | 在订阅范围内分配了 Owner / Contributor 角色 | CRITICAL |
| AZ-002 | RBAC | 在资源组范围内分配了 Owner / Contributor 角色 | HIGH |
| AZ-003 | 网络 | 包含 0.0.0.0/0 入站允许规则的 NSG | HIGH |
| AZ-004 | 存储 | 启用公共 Blob 访问的存储帐户 | HIGH |
| AZ-005 | 身份 | 未注册 MFA 的 Entra ID 用户 | HIGH |
| AZ-006 | 身份 | 具有 Owner / Contributor 权限的服务主体 | HIGH |
| AZ-007 | 加密 | 缺少显式加密配置的托管磁盘 | MEDIUM |
| AZ-008 | 加密 | 无防火墙限制、暴露于公共网络的 Key Vault | HIGH |
| AZ-009 | 监控 | 活动日志保留时间低于 90 天 | MEDIUM |
| AZ-010 | 监控 | Microsoft Defender for Cloud 未在关键资源类型上启用 | HIGH |
| AZ-011 | 监控 | 未启用诊断日志记录的 Key Vault | MEDIUM |
| AZ-012 | 计算 | 直接附加了公共 IP 的虚拟机 | MEDIUM |
| AZ-013 | 计算 | 未安装终结点保护扩展的虚拟机 | MEDIUM |
| AZ-014 | 计算 | 未启用 Azure 磁盘加密(ADE)的虚拟机 OS 磁盘 | MEDIUM |
| AZ-015 | 网络 | RDP 端口 3389 通过 NSG 暴露到互联网 | CRITICAL |
| AZ-016 | 网络 | SSH 端口 22 通过 NSG 暴露到互联网 | CRITICAL |
| AZ-017 | 存储 | 允许非 HTTPS 流量的存储帐户 | HIGH |
| AZ-018 | 存储 | 允许旧版 TLS 版本(低于 1.2)的存储帐户 | MEDIUM |
| AZ-019 | 身份 | Entra ID 租户中存在来宾用户帐户 | LOW |
| AZ-020 | 加密 | 缺少软删除或清除保护的 Key Vault | MEDIUM |
az login(Azure CLI)AZURE_CLIENT_ID、AZURE_CLIENT_SECRET、AZURE_TENANT_IDReader 角色UserAuthenticationMethod.Read.AllApplication.Read.All如果 Graph API 权限不可用,身份检查(AZ-005、AZ-019)会被优雅跳过 — 审计其余部分不受影响地继续运行。
pip install -e .
# Full audit — all checks, all severities
azure-auditor
# Target a specific subscription
azure-auditor --subscription <subscription-id>
# Show only HIGH and CRITICAL findings
azure-auditor --severity HIGH
# Save JSON report to a specific directory
azure-auditor --output-dir ./reports
# Terminal output only
azure-auditor --no-json
# Verbose logging
azure-auditor --verbose
或者无需安装:
PYTHONPATH=src python -m azure_security_auditor.cli --subscription <id>
终端 — 使用 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... <principal-id> ...
■ HIGH AZ-010 Defender for Cloud Not Enabled — VMs /subscriptions/. ...
...
JSON — 写入到 reports/azure_audit_<subscription>_<timestamp>.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 — 按以下顺序尝试:
AZURE_CLIENT_ID、AZURE_CLIENT_SECRET、AZURE_TENANT_ID)az login)export AZURE_CLIENT_ID="<app-id>"
export AZURE_CLIENT_SECRET="<secret>"
export AZURE_TENANT_ID="<tenant-id>"
azure-auditor --subscription <subscription-id>