codewithbrandon/azure-security-baseline

GitHub: codewithbrandon/azure-security-baseline

一套基于 Terraform 的 Azure 安全基线环境,集成自动审计与 MITRE 映射,帮助安全架构师快速发现并可视化云环境中的配置风险。

Stars: 0 | Forks: 0

# Azure 安全基线 [![安全审计](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/3794fe0755090609.svg)](https://github.com/codewithbrandon/azure-security-baseline/actions/workflows/security-audit.yml) [![Terraform](https://img.shields.io/badge/Terraform-≥1.5-7B42BC?logo=terraform)](https://developer.hashicorp.com/terraform) [![Python](https://img.shields.io/badge/Python-3.12-3776AB?logo=python)](https://python.org) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](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, 上游代理, 人工智能安全, 合规性, 图计算, 安全基线, 安全态势管理, 对称加密, 教学环境, 无后门, 网络安全, 网络安全审计, 自动化审计, 逆向工具, 速率限制处理, 配置错误检测, 防御加固, 隐私保护