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, 关系图谱, 基线检查, 逆向工具, 配置核查