codewithbrandon/azure-security-baseline
GitHub: codewithbrandon/azure-security-baseline
一套基于 Terraform 的 Azure 安全基线环境,集成自动审计与 MITRE 映射,帮助安全架构师快速发现并可视化云环境中的配置风险。
Stars: 0 | Forks: 0
# Azure 安全基线
[](https://github.com/codewithbrandon/azure-security-baseline/actions/workflows/security-audit.yml)
[](https://developer.hashicorp.com/terraform)
[](https://python.org)
[](LICENSE)
一个可复现的 Azure 安全基线,用于配置加固环境并立即对其进行审计,
展示了默认配置与生产就绪态势之间的差距。
专为需要向客户直观展示何为“配置不当”,并在移交修复路线图之前进行说明的安全架构师而构建。
## 功能概述
大多数 Azure 环境都是“部署快、 secured slowly (安全加固慢)”。这两者之间的时间差就是漏洞发生的窗口期。
本项目旨在将这一差距可视化。它配置了一个包含有意设置、文档化错误配置的真实三层 Azure 环境——这些配置与真实入侵调查中反复发现的模式一致——然后运行自动审计,按严重程度对每项发现进行分类,将其映射到 MITRE ATT&CK 技术,并生成一份面向客户的修复报告。
**输出不仅仅是一个合规检查项,而是证明分析师理解该配置不当的含义以及如何修复它的证据。**
## 架构
```
╔══════════════════════════════════════════════════════════════════════════════╗
║ AZURE SUBSCRIPTION ║
║ ║
║ ╔═══════════════════════════════════════════════════════════════════════╗ ║
║ ║ RESOURCE GROUP ║ ║
║ ║ ║ ║
║ ║ ┌─────────────────────────────┐ ┌───────────────────────────┐ ║ ║
║ ║ │ NETWORK (VNet) │ │ LOG ANALYTICS │ ║ ║
║ ║ │ 10.0.0.0/16 │ │ WORKSPACE │ ║ ║
║ ║ │ │ │ │ ║ ║
║ ║ │ INTERNET │ │ ▸ Entra ID Sign-in Logs │ ║ ║
║ ║ │ │ │ │ ▸ Entra ID Audit Logs │ ║ ║
║ ║ │ ┌───▼──────────────────┐ │ │ ▸ Azure Activity Log │ ║ ║
║ ║ │ │ web-nsg │◄──┼───┼─ NSG Flow Logs │ ║ ║
║ ║ │ │ ✔ :443 :80 │ │ │ │ ║ ║
║ ║ │ │ ✘ :3389 open CRIT │ │ │ Storage Account │ ║ ║
║ ║ │ │ ✘ :22 open HIGH │ │ │ ▸ 90-day log archival │ ║ ║
║ ║ │ └───┬──────────────────┘ │ └───────────────────────────┘ ║ ║
║ ║ │ │ │ ║ ║
║ ║ │ ┌───▼──────────────────┐ │ ┌───────────────────────────┐ ║ ║
║ ║ │ │ web-subnet │ │ │ DEFENDER FOR CLOUD │ ║ ║
║ ║ │ │ 10.0.1.0/24 │ │ │ Standard Tier │ ║ ║
║ ║ │ └───┬──────────────────┘ │ │ │ ║ ║
║ ║ │ │ :8080 │ │ ▸ Virtual Machines │ ║ ║
║ ║ │ ┌───▼──────────────────┐ │ │ ▸ SQL Servers │ ║ ║
║ ║ │ │ app-nsg │ │ │ ▸ Storage Accounts │ ║ ║
║ ║ │ │ ✔ :8080 from web │ │ │ ▸ Containers │ ║ ║
║ ║ │ │ ✘ :8443 VNet MED │ │ │ ▸ Key Vaults │ ║ ║
║ ║ │ └───┬──────────────────┘ │ │ ▸ App Services │ ║ ║
║ ║ │ │ │ │ ▸ ARM ▸ DNS │ ║ ║
║ ║ │ ┌───▼──────────────────┐ │ └───────────────────────────┘ ║ ║
║ ║ │ │ app-subnet │ │ ║ ║
║ ║ │ │ 10.0.2.0/24 │ │ ┌───────────────────────────┐ ║ ║
║ ║ │ └───┬──────────────────┘ │ │ POLICY ASSIGNMENTS │ ║ ║
║ ║ │ │ :1433 :5432 │ │ │ ║ ║
║ ║ │ │ :27017 :6379 │ │ ▸ Require HTTPS storage │ ║ ║
║ ║ │ ┌───▼──────────────────┐ │ │ ▸ Block VM public IPs │ ║ ║
║ ║ │ │ data-nsg │ │ │ ▸ Enforce allowed regions │ ║ ║
║ ║ │ │ ✔ DB from app only │ │ └───────────────────────────┘ ║ ║
║ ║ │ │ ✘ DB open 0.0.0.0/0 │ │ ║ ║
║ ║ │ │ CRITICAL FINDING │ │ ║ ║
║ ║ │ └───┬──────────────────┘ │ ║ ║
║ ║ │ │ │ ║ ║
║ ║ │ ┌───▼──────────────────┐ │ ║ ║
║ ║ │ │ data-subnet │ │ ║ ║
║ ║ │ │ 10.0.3.0/24 │ │ ║ ║
║ ║ │ └──────────────────────┘ │ ║ ║
║ ║ └─────────────────────────────┘ ║ ║
║ ╚═══════════════════════════════════════════════════════════════════════╝ ║
╚══════════════════════════════════════════════════════════════════════════════╝
AUDIT WORKFLOW
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ nsg_analyzer │────►│ findings.json │────►│ generate_report │
│ .py │ │ risk score │ │ .py │
│ │ │ MITRE mapping │ │ │
│ Azure SDK │ │ remediation │ │ AUDIT-DATE.md │
│ DefaultCred │ │ steps │ │ client-ready │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ az login / OIDC / Managed Identity
▼
Azure Resource Manager API
```
## 有意设置的错误配置
默认 Terraform 配置配置了以下供审计脚本捕获的发现。
这些配置匹配真实入侵调查中的模式,而非合成示例。
| 发现 | 严重程度 | MITRE | 为何重要 |
|---------|----------|-------|----------------|
| RDP (3389) 开放给 0.0.0.0/0 | CRITICAL | T1021.001 | Azure 上暴力破解最多的端口;若沦陷将导致交互式桌面访问 |
| Database 端口开放给 0.0.0.0/0 | CRITICAL | T1190 | 直接数据窃取;MongoDB 和 Redis 默认无认证 |
| SSH (22) 开放给 0.0.0.0/0 | HIGH | T1021.004 | 自动化撞库;持续的 OpenSSH 漏洞暴露面 |
| Management 端口开放给 VirtualNetwork | MEDIUM | T1021 | 范围超出预期;包含所有对等 VNet |
| 缺少显式拒绝所有规则 | MEDIUM | T1190 | Azure 的隐式拒绝无法通过合规框架审计 |
要配置已解决发现问题的**加固**配置,请设置以下变量:
```
# terraform/terraform.tfvars
allowed_ssh_cidrs = ["10.0.10.5/32"] # Bastion or admin workstation IP
allowed_rdp_cidrs = [] # Use Azure Bastion instead of direct RDP
```
## 快速开始
### 前置条件
- [Terraform](https://developer.hashicorp.com/terraform/downloads) >= 1.5
- [Azure CLI](https://learn.microsoft.com/en-us/cli/azure/install-azure-cli) 且具有有效订阅
- Python 3.12+
### 1. 认证
```
az login
az account set --subscription
```
### 2. 配置环境
```
make init
make plan # Review what will be created
make apply # Creates the resource group, VNet, NSGs, logging, and Defender
```
### 3. 运行审计
```
make audit RG=azsec-lab-rg
```
输出:
```
======================================================================
AZURE NSG SECURITY AUDIT
Resource Group : azsec-lab-rg
Timestamp : 2026-03-10 14:22 UTC
======================================================================
Risk Score : 47/100
Total : 7
CRITICAL : 3
HIGH : 1
MEDIUM : 3
LOW : 0
======================================================================
FINDINGS:
[ !! ] CRITICAL pri= 200 azsec-lab-data-nsg
Rule: AllowDB-ANY
Type: OPEN_HIGH_RISK_PORT
[ !! ] CRITICAL pri= 300 azsec-lab-web-nsg
Rule: AllowRDP-ANY
Type: OPEN_HIGH_RISK_PORT
...
STATUS: FAIL — Critical findings require immediate remediation before deployment.
======================================================================
```
### 4. 生成报告
```
make report
# 写入: reports/AUDIT-20260310.md
```
报告包含带有风险评分的执行摘要、映射了 MITRE 技术和修复步骤的每项发现详情、完整的 ATT&CK 覆盖表,以及可直接粘贴到工单中的修复检查清单。
## 项目结构
```
azure-security-baseline/
├── terraform/
│ ├── main.tf # Root module — resource group and module calls
│ ├── variables.tf # Input variables with validation
│ ├── outputs.tf # Outputs including the audit command
│ ├── providers.tf # AzureRM, AzureAD, and Random providers
│ ├── example.tfvars # Reference variable file safe to commit
│ └── modules/
│ ├── networking/ # VNet, subnets, and NSGs with intentional findings
│ ├── logging/ # Log Analytics, Entra ID audit logs, and storage
│ └── security/ # Defender for Cloud and policy assignments
│
├── scripts/
│ ├── nsg_analyzer.py # Audit engine — connects to Azure and runs all checks
│ ├── generate_report.py # Converts JSON findings into a Markdown report
│ └── requirements.txt
│
├── reports/
│ └── findings_template.md # Hand-editable report with annotated example findings
│
├── .github/workflows/
│ └── security-audit.yml # CI pipeline — lint, validate, live audit, artifact upload
│
└── Makefile # Targets: init, plan, apply, audit, report, lint, destroy
```
## CI 流水线
每次推送到 `main` 和每个 Pull Request 都会按顺序触发以下作业:
1. **Ruff** 对所有 Python 脚本进行 Lint 和格式检查
2. **Terraform fmt** 强制执行配置样式
3. **Terraform validate** 确认语法和 Provider 兼容性
4. **tfsec** 在计划阶段扫描 IaC 的安全问题,在配置任何资源之前
5. **Gitleaks** 扫描完整的 git 历史记录,查找意外提交的机密
6. **Live NSG Audit** 通过 OIDC 认证到 Azure,运行 Python 审计脚本,并将发现作为 90 天工件上传
如果检测到任何 `HIGH` 或 `CRITICAL` 发现,流水线将失败,从而将安全态势作为一道关卡而非事后补救措施。
认证使用 Azure OIDC 联合身份。未在任何地方存储 `AZURE_CLIENT_SECRET`。
## 审计发现参考
### 发现类型
| 类型 | 严重程度 | 描述 |
|------|----------|-------------|
| `OPEN_HIGH_RISK_PORT` | MEDIUM 至 CRITICAL | 可从互联网访问的已知危险端口 |
| `ALLOW_ALL_INBOUND` | CRITICAL | 规则允许来自任何源的所有流量,实际上禁用了 NSG |
| `BROAD_SOURCE_MANAGEMENT_PORT` | MEDIUM | 可从 VirtualNetwork 范围而非特定 CIDR 访问的管理端口 |
| `UNRESTRICTED_OUTBOUND` | LOW | 允许所有端口出站,导致数据窃取 |
| `MISSING_EXPLICIT_DENY_ALL` | MEDIUM | 依赖 Azure 的隐式拒绝,这无法通过合规框架审计 |
### 风险评分公式
```
Risk Score = (CRITICAL × 10) + (HIGH × 5) + (MEDIUM × 2) + (LOW × 1)
```
| 分数 | 等级 |
|-------|--------|
| 30+ | CRITICAL 风险 — 需立即采取行动 |
| 15 至 29 | HIGH 风险 — 72 小时内修复 |
| 5 至 14 | MEDIUM 风险 — 在下一个 Sprint 中解决 |
| 1 至 4 | LOW 风险 — 计划维护窗口 |
| 0 | PASS |
## 扩展审计
要向 `nsg_analyzer.py` 添加新检查,请定义一个函数并从 `analyze_nsg()` 调用它:
```
def check_your_condition(nsg, rule, findings: list) -> None:
"""Describe what this detects and why it matters operationally."""
if :
findings.append(make_finding(
nsg_name=nsg.name,
resource_id=nsg.id,
rule_name=rule.name,
severity="HIGH",
finding_type="YOUR_FINDING_TYPE",
description="What is misconfigured and what an attacker can do with it.",
mitre_technique="T1XXX — Technique Name",
remediation="Concrete steps to resolve the finding.",
))
```
## 相关项目
- [cloud-threat-detection](https://github.com/codewithbrandon/cloud-threat-detection) — Kubernetes 原生威胁检测平台,包含 Falco、Prometheus 和 Loki
- [secure-cloud-platform](https://github.com/codewithbrandon/secure-cloud-platform) — 策略强制执行的 DevSecOps 流水线,包含 OPA/Conftest 和 19 阶段 Jenkins CI 工作流
## 作者
**Brandon** — 独立安全架构师
前绝密级调查员 | CompTIA Security+ | RHCSA | Azure 云工程师(进修中)
可承接安全架构咨询。[在 LinkedIn 上联系](https://linkedin.com/in/your-handle)
*MIT 许可证*
标签:ATT&CK映射, Azure, Azure安全, DevSecOps, EC2, ECS, Entra ID, IaC, Microsoft Defender for Cloud, NSG分析, PE 加载器, Python, Terraform, 上游代理, 人工智能安全, 合规性, 图计算, 安全基线, 安全态势管理, 对称加密, 教学环境, 无后门, 网络安全, 网络安全审计, 自动化审计, 逆向工具, 速率限制处理, 配置错误检测, 防御加固, 隐私保护