f-leroy/azure-terraform-avm-secure-stacks

GitHub: f-leroy/azure-terraform-avm-secure-stacks

基于 Azure Verified Modules 的生产级 Terraform 堆栈集合,提供九个经过真实云环境端到端验证的安全合规基础设施模板。

Stars: 0 | Forks: 0

# Azure Terraform AVM 安全堆栈 ![Terraform](https://img.shields.io/badge/Terraform-%3E%3D1.9-844FBA?logo=terraform&logoColor=white) ![Provider](https://img.shields.io/badge/azurerm-~%3E%204.0-0078D4?logo=microsoftazure&logoColor=white) ![AVM Modules](https://img.shields.io/badge/AVM%20modules-21%20unique-0078D4?logo=microsoftazure&logoColor=white) ![Stacks](https://img.shields.io/badge/Stacks-9%20production-success) ![License](https://img.shields.io/badge/License-Apache%202.0-blue) ![Status](https://img.shields.io/badge/Apply--validated-Azure%20MSDN-green) ## 太长不看 九个完全配置好的 Azure Terraform 堆栈 —— Web App 或 Container Apps × PostgreSQL / SQL / Cosmos DB / MongoDB,加上一个共享的平台基线(hub network, Log Analytics, Key Vault, 审计存储, 策略)。所有资源均由微软官方的 **Azure Verified Modules** 组成,并配置了 2026 年的安全默认值:无密码 Entra 身份验证、私有端点、客户管理的审计存储、Defender for SQL、路由到 Log Analytics 的服务器审计、资源锁,以及强制执行 TLS 1.2 / 仅限 HTTPS / 拒绝公共 IP / 标签要求的策略分配。 在发布之前,每个堆栈都在真实的 Azure 订阅上进行了端到端的部署。每个堆栈都记录了确切的部署计数和冒烟测试结果 —— 绝无“应该可用”的空谈。 ## 堆栈目录 | 堆栈 | 计算 | 数据库 | 资源 | AVM 组件 | 部署 MSDN | 冒烟测试 | |---|---|---|---|---|---|---| | [`platform-baseline`](./platform-baseline) | — | — | 79 | 12 | ✅ 79/79 | n/a | | [`app-service-postgresql`](./app-service-postgresql) | App Service (Linux) | PostgreSQL Flexible | 59 | 12 | ✅ 59/59 | n/a | | [`app-service-sql`](./app-service-sql) | App Service (Linux) | Azure SQL Database | 49 | 12 | ✅ 49/49 | 15/16 | | [`app-service-cosmosdb`](./app-service-cosmosdb) | App Service (Linux) | Cosmos DB (SQL API) | 48 | 11 | ✅ 48/48 | 10/10 | | [`app-service-mongodb`](./app-service-mongodb) | App Service (Linux) | Cosmos DB for MongoDB (vCore) | 50 | 14 | ✅ 50/50 | 9/9 | | [`container-apps-postgresql`](./container-apps-postgresql) | Container Apps | PostgreSQL Flexible | 49 | 12 | ✅ 49/49 | n/a | | [`container-apps-sql`](./container-apps-sql) | Container Apps | Azure SQL Database | 40 | 12 | ✅ 40/40 | 16/16 | | [`container-apps-cosmosdb`](./container-apps-cosmosdb) | Container Apps | Cosmos DB (SQL API) | 39 | 11 | ✅ 39/39 | 10/10 | | [`container-apps-mongodb`](./container-apps-mongodb) | Container Apps | Cosmos DB for MongoDB (vCore) | 44 | 14 | ✅ 44/44 | 9/9 | ## 每个堆栈包含的内容 每个堆栈都作为一个独立的 Terraform 根模块交付: ``` / ├── main.tf, networking.tf, identity.tf, keyvault.tf, │ storage.tf, database.tf, app.tf, monitoring.tf, │ backup.tf, governance.tf, db-admins.tf, db-alerts.tf, │ finops.tf, wiring.tf, resource_group.tf, │ variables.tf, outputs.tf ├── envs/ │ └── prod.tfvars # Production values, ready to edit ├── backend.tf.example # Azure Storage remote state template ├── .github/workflows/ │ └── deploy-prod.yml # GitHub Actions deploy via OIDC ├── manifest.yaml # Machine-readable stack metadata (AVM modules, frameworks, costs) ├── README.md # Stack-specific overview + usage ├── INSTALL.md # Step-by-step installation guide ├── SECURITY-POSTURE.md # Security controls enabled, per resource ├── README-GITHUB-OIDC.md # GitHub Actions OIDC setup ├── CHANGELOG.md └── LICENSE # Apache 2.0 ``` 除了 Terraform Azure provider、来自公共 Terraform Registry 的官方 AVM 模块以及 `azuread` / `time` provider 外,没有任何外部依赖。 ## 快速开始 ``` # 1. Clone 仓库 git clone https://github.com/f-leroy/azure-terraform-avm-secure-stacks.git cd azure-terraform-avm-secure-stacks/app-service-postgresql # 2. Authenticate 到 Azure az login az account set --subscription "" # 3. 阅读 stack 特有的 INSTALL.md,编辑 envs/prod.tfvars,然后: terraform init terraform plan -var-file=envs/prod.tfvars terraform apply -var-file=envs/prod.tfvars ``` 每个堆栈的 `INSTALL.md` 详细介绍了每个变量、前置条件(用于 DB 管理员的 Entra 组、用于 GitHub Actions 的 OIDC service principal、区域 SKU 可用性)以及部署后的验证命令。**请在运行 `apply` 之前阅读它。** ## 架构(按堆栈) ``` flowchart TB ENTRA(["Entra ID — passwordless
User-assigned MI · DB admin group"]) subgraph RG["Resource Group · CAF-named · tagged · resource-locked"] subgraph NET["Private network · VNet · NSG · Private DNS · NAT"] APP["App Service / Container App
System + User MI"] DB[("Database
PostgreSQL · SQL · Cosmos · Mongo
public access disabled")] KV["Key Vault
Private Endpoint · RBAC · soft-delete"] APP -->|"Private Endpoint"| DB APP --> KV end subgraph OBS["Observability & audit"] LA["Log Analytics + App Insights"] ST["Audit Storage · WORM 365d"] BK["Backup Vault · geo-redundant · immutable"] end NET -. "diagnostics · auditing" .-> LA DB -. "PITR 35d · LTR P5Y" .-> BK LA -. "export" .-> ST end ENTRA -. "token (no secret)" .-> APP POL["Azure Policy — TLS 1.2 · HTTPS-only · deny public IP · require tags"] -. "enforced on" .-> RG ``` ## 安全默认值(Azure 2026) 应用于每个生产环境堆栈: - 在 PostgreSQL(`auth` 块 + 组管理员)、Azure SQL(`azureADOnlyAuthentication = true`)、Cosmos DB(`local_authentication_disabled = true` + RBAC 数据平面)、MongoDB vCore(独立的 MI + 用户注册)上启用**无密码 Entra ID 身份验证** - 使用**客户管理的身份(UAMI)**进行应用到数据库的身份验证,在组成员资格之前通过 `time_sleep 180s` 处理 Microsoft Graph 传播 - 在 Key Vault、Storage、Database(在 AVM 支持的情况下)上启用**私有端点** - 通过策略分配 + 每个资源的配置强制执行**最低 TLS 1.2** - 针对 SQL Server 的**服务器审计 → Log Analytics**,数据库级别的诊断设置涵盖 8 个日志类别(`SQLSecurityAuditEvents`, `SQLInsights`, `AutomaticTuning`, `QueryStoreRuntimeStatistics`, `QueryStoreWaitStatistics`, `Errors`, `DatabaseWaitStatistics`, `Timeouts`) - 通过订阅级别的 Defender 计划(Standard 层)自动启用 **Defender for SQL** - 通过 `azapi_resource_action` PATCH 变通方法在 SQL Database 上启用**自动调优**(Auto + CreateIndex + DropIndex + ForceLastGoodPlan) - 数据库上的 **PITR 35 天** 保留期 + **LTR P5Y** + **异地冗余备份** - Azure SQL 的 **Ledger 开启**(不可变的审计跟踪) - 在每个数据平面资源上**禁用公共网络访问** - 关键资源上的**资源锁**(CanNotDelete) - **策略分配** 强制执行:最低 TLS 1.2 / 仅限 HTTPS / 拒绝公共 IP / 强制要求标签 - 具有 365 天不可变策略的**审计存储 WORM** - Key Vault 上的**软删除 90 天** 每个堆栈的 `SECURITY-POSTURE.md` 都记录了已启用的控制措施,并映射到 MCSB v1 控制项 ID。 ## 对齐的框架 这些堆栈应用了与以下框架对齐的技术控制。**它们并不证明合规性** —— 认证是部署者的责任,并且取决于 Terraform 代码范围之外的操作、组织和文档因素。 | 框架 | 此代码对齐的内容 | |---|---| | **Microsoft Cloud Security Benchmark (MCSB) v1** | NS, IM, PA, DP, AM, LT, IR, BR, DS 域 | | **Cloud Adoption Framework (CAF)** | 命名约定、标签、资源层次结构 | | **Well-Architected Framework (WAF)** | 可靠性、安全性、成本、卓越运营支柱 | | **EU NIS2 Directive** | 网络分段、日志记录、加密、IAM 控制 | | **EU GDPR / RGPD** | 静态加密 + 传输中加密、审计日志记录、数据驻留、通过审计存储进行数据主体访问 | ## 使用的 Azure Verified Modules (AVM) 9 个堆栈中引用的所有 21 个独特的 AVM 模块均由微软在 [Terraform Registry](https://registry.terraform.io/namespaces/Azure) 上正式发布和维护: | 领域 | AVM 模块 | |---|---| | 计算 / Web | `Azure/avm-res-web-site/azurerm` | | 计算 / 容器 | `Azure/avm-res-app-containerapp/azurerm`, `Azure/avm-res-app-managedenvironment/azurerm` | | 数据 / SQL | `Azure/avm-res-sql-server/azurerm` | | 数据 / PostgreSQL | `Azure/avm-res-dbforpostgresql-flexibleserver/azurerm` | | 数据 / Cosmos | `Azure/avm-res-documentdb-databaseaccount/azurerm`, `Azure/avm-res-documentdb-mongocluster/azurerm` | | 数据 / 缓存 | `Azure/avm-res-cache-redis/azurerm` | | 身份 | `Azure/avm-res-managedidentity-userassignedidentity/azurerm` | | 机密 | `Azure/avm-res-keyvault-vault/azurerm` | | 存储 | `Azure/avm-res-storage-storageaccount/azurerm` | | 监控 | `Azure/avm-res-operationalinsights-workspace/azurerm`, `Azure/avm-res-insights-component/azurerm` | | 备份 | `Azure/avm-res-recoveryservices-vault/azurerm` | | 网络 | `Azure/avm-res-network-virtualnetwork/azurerm`, `Azure/avm-res-network-networksecuritygroup/azurerm`, `Azure/avm-res-network-routetable/azurerm`, `Azure/avm-res-network-natgateway/azurerm`, `Azure/avm-res-network-privatednszone/azurerm`, `Azure/avm-res-network-privateendpoint/azurerm` | | 资源层次结构 | `Azure/avm-res-resources-resourcegroup/azurerm` | 在没有正式发布(GA)的 AVM 模块的情况下,少量资源使用了 `azurerm_*` 原生资源(例如:App Service Plan、SQL 诊断设置、自动调优变通方法)。这些在每个堆栈的 `manifest.yaml` 中都有明确标记。 ## 验证证据 所有堆栈均在 **2026-04-24 至 2026-04-28** 期间在真实的 Azure MSDN Platforms 订阅上进行了端到端部署,总计如下: - 在 `francecentral`(8 个)和 `southeastasia`(platform-baseline 阶段 2)上**部署了 9 个生产堆栈** - **5 个堆栈进行了功能性冒烟测试**,通过 REST API + `az` CLI 验证了无密码身份验证、审计 pipeline、Defender 状态、私有网络可达性以及资源锁 - **验证后的清理** 已验证同步完成:0 个残留资源组,0 个孤立的订阅级诊断设置 每个堆栈的部署计数和冒烟测试结果列在上面的目录表以及每个堆栈的 `CHANGELOG.md` 中。 ## 仓库结构 ``` azure-terraform-avm-secure-stacks/ ├── README.md # This file ├── LICENSE # Apache 2.0 ├── .gitignore ├── platform-baseline/ # Shared hub: VNet, LAW, KV, audit storage, policies ├── app-service-postgresql/ ├── app-service-sql/ ├── app-service-cosmosdb/ ├── app-service-mongodb/ ├── container-apps-postgresql/ ├── container-apps-sql/ ├── container-apps-cosmosdb/ └── container-apps-mongodb/ ``` 每个堆栈都是独立的,可以单独部署。`platform-baseline` 堆栈是可选的 —— 它提供了其他堆栈可以在 `corp`(棕地)模式下调用以替代重新创建自己资源的共享基础设施(集中式 Log Analytics、Key Vault、审计存储)。 ## 环境要求 - **Terraform** `>= 1.9` - **azurerm provider** `~> 4.0` - **Azure CLI**(用于初始的 `az login`) - 一个在目标区域具有充足配额的 Azure 订阅 - 对于无密码 DB 管理员:一个以人类管理员为成员的 Entra ID 组(如果你提供了 `db_admin_members` 则自动创建) - 对于 GitHub Actions 部署:一个具有联合凭证的 service principal(参见任意堆栈中的 `README-GITHUB-OIDC.md`) ## 许可证 Apache License 2.0 —— 参见 [`LICENSE`](./LICENSE)。你可以自由使用、修改和重新分发这些堆栈,包括用于商业产品,只要你保留版权声明和许可文本。 ## 免责声明 本代码按**“原样”**提供,不提供任何形式的担保。在部署到任何生产环境之前,必须由合格的人员(DevOps、云架构师、安全团队)对其进行审查和验证。**作者不对因部署此代码而导致的任何 Azure 成本、安全事件、数据丢失、停机或违规行为负责。** 框架对齐声明(MCSB、CAF、WAF、NIS2、GDPR)仅描述技术控制映射,并非认证。 ## 关于 这些堆栈由一个私有引擎生成,该引擎将[微软官方 AVM 模块](https://aka.ms/avm)组合成具有特定偏好且可用于生产的 Azure 架构。该引擎本身未开源 —— 仅生成的 Terraform 代码在 Apache 2.0 下开源。 由 [@f-leroy](https://github.com/f-leroy) 构建和维护。 ## 关键词 azure terraform · azure verified modules · avm · azure terraform stacks · passwordless entra · entra id terraform · azure security baseline · mcsb terraform · caf terraform · waf terraform · nis2 azure · gdpr azure · rgpd azure · azure private endpoint · azure key vault terraform · azure sql terraform · postgresql flexible terraform · cosmos db terraform · cosmos mongo vcore terraform · azure app service terraform · azure container apps terraform · production terraform azure · azure 2026
标签:Azure, ECS, Terraform, 云架构, 合规配置