svre/azure-governance-landing-zone
GitHub: svre/azure-governance-landing-zone
一个合规优先的 Azure Landing Zone 参考实现,整合 Hub-Spoke 网络隔离、集中式出口、Policy-as-Code 护栏和 CI 安全门禁。
Stars: 0 | Forks: 0
# 治理架构师 — Azure Landing Zone(Hub–Spoke + Policy-as-Code + DevSecOps)
本仓库演示了一个**合规优先的 Azure Landing Zone** 实现,包含:
- **Hub–Spoke 网络隔离**
- 由 **Azure Firewall + UDR** 强制执行的**集中式出口**
- **代码化护栏** (Azure Policy-as-Code)
- 通过 GitHub Actions 实现的 **PR 门禁** (terraform 检查 + Checkov)
## 架构(最终版)

**核心理念**
- Hub 托管共享安全和出口控制 (Azure Firewall)。
- Spoke (Prod / NonProd) 运行的**工作负载没有直接的 Internet 路径**。
- 使用 **UDR 默认路由**强制 Spoke 子网的出口流量经过 Hub Firewall。
- 治理护栏防止不合规的部署(位置/标签/公共 IP)。
- CI 确保每个 PR 都经过格式化、验证、规划 (plan) 和安全扫描。
## 我构建的内容(按天记录)
### 第 1 天 — 项目初始化与 IaC 基线
**目标**
- 创建项目仓库结构。
- 建立 Terraform 基础设施即代码基线。
- 准备用于存放架构图、证据和决策的文档文件夹。
**证据**
- 已创建仓库文件夹:`.github/`、`docs/` 和 `infra/terraform/`
- Terraform 文件已组织在 `infra/terraform` 下
- 已创建用于 README、证据索引和决策日志的文档文件
- GitHub 仓库已初始化,作为 Landing Zone 项目的唯一事实来源
### 第 2 天 — Hub–Spoke 基础(Peering + IaC 基线)
**目标**
- 部署初始的 Hub-Spoke 网络基础。
- 在 Hub 和 Spoke 网络之间建立 VNet peering。
- 验证 Terraform 部署并确认没有意外的基础设施漂移。
- 为未来的应用和数据工作负载创建基线网络结构。
**证据**
- Hub peering 已连接:`docs/architecture/day02-portal-hub-peering-connected.png`
- RG 概览:`docs/architecture/day02-portal-rg-core-overview-ok.png`
- Terraform apply 成功:`docs/architecture/day02-tf-dev-apply-ok.png`
- Terraform plan 无更改:`docs/architecture/day02-tf-dev-plan-nochanges.png`
### 第 3 天 — 通过 Azure Firewall + UDR 实现集中式出口(SNAT + 审计)
**目标**
- 强制 Spoke 子网将 `0.0.0.0/0` 路由到防火墙的私有 IP (VirtualAppliance)。
- 证明出口 SNAT:VM 出口 IP 等于防火墙的公共 IP。
- 在 Log Analytics 中捕获防火墙日志以供审计。
**证据**
- 防火墙输出(IP):`docs/architecture/day03-dev-tf-firewall-rg-core-output-ips-ok.png`
- 子网关联证明(UDR 绑定到子网):
- `docs/architecture/day03-dev-portal-udr-spoke-nonprod-assoc-snet-app-ok.png`
- `docs/architecture/day03-dev-portal-udr-spoke-nonprod-assoc-snet-data-ok.png`
- `docs/architecture/day03-dev-portal-udr-spoke-prod-assoc-snet-app-ok.png`
- `docs/architecture/day03-dev-portal-udr-spoke-prod-assoc-snet-data-ok.png`
- 最强证明(UDR 默认路由 → 防火墙):
- `docs/architecture/day03-dev-portal-udr-spoke-nonprod-default-to-fw-ok.png`
- `docs/architecture/day03-dev-portal-udr-spoke-prod-default-to-fw-ok.png`
- SNAT 出口证明(运行命令):
- `docs/architecture/day03-dev-cli-vm-spoke-nonprod-runcommand-egress-ip-ok.png`
- 审计证明(Log Analytics 中的 AZFW 日志):
- `docs/architecture/day03-dev-logs-azfw-rg-core-query-ok.png`
- 资源清单证明:
- `docs/architecture/day03-dev-portal-rg-rg-core-resource-list-ok.png`
### 第 4 天 — Policy-as-Code(拒绝证明)
**强制执行的护栏**
- 允许的位置:仅限 `eastasia`(实验环境)
- 必需标签:`CostCenter`、`Owner`
- 拒绝创建公共 IP(限定范围),但 Azure Firewall 的公共 IP 例外
**证据**
- 可见的策略分配(Portal):`docs/architecture/day04-portal-subscription-policy-assign-ok.png`
- 拒绝不允许的位置 (eastus):`docs/architecture/day04-cli-deny-location-eastus.png`
- 拒绝缺少必需标签:`docs/architecture/day04-cli-deny-tags-missing.png`
- 拒绝创建公共 IP:`docs/architecture/day04-cli-deny-publicip-rg-core.png`
### 第 5 天 — CI/CD PR 门禁(Terraform + Checkov)
**PR 检查**
- `terraform fmt -check`
- `terraform validate`
- `terraform plan`
- Checkov 扫描 + 故意失败的证据
**证据**
- CI 通过:`docs/architecture/day05-actions-ci-terraform-checkov-ok.png`
- PR 被 CI 阻止(故意失败):`docs/architecture/day05-actions-ci-pr-blocked-failed.png`
- Checkov 失败详情:`docs/architecture/day05-actions-ci-terraform-checkov-failed.png`
### 第 6 天 — 作品集打包(架构 + 叙述)
**产出物**
- 最终架构 PNG:`docs/architecture/day06-dev-drawio-landingzone-architecture-diagram-final.png`
- 源图表:`docs/architecture/day06-dev-drawio-landingzone-architecture-source.drawio`
- 证据索引:`docs/evidence.md`
- 决策日志:`docs/decision-log.md`
## 仓库结构
```
docs/
architecture/ # diagrams + screenshots
evidence.md # evidence index
decision-log.md # decision log / trade-offs
infra/terraform/
envs/dev/ # dev environment
modules/ # reusable modules (hub/spoke/firewall/udr/policy)
.github/workflows/
ci.yml # PR gate workflow
```
## 如何运行(复现)
```
cd infra/terraform/envs/dev
terraform init
terraform fmt -recursive
terraform validate
terraform plan
terraform apply
# 清理
terraform destroy
```
## 注意事项(规范)
- 切勿提交:`terraform.tfstate`、`.terraform/` 以及 plan 输出文件。
- 标签(`CostCenter`、`Owner`)支持责任追究和成本跟踪。
- 由于订阅限制,实验区域使用 `eastasia`。
标签:Azure, DevSecOps, ECS, Terraform, 上游代理, 合规治理, 网络安全, 隐私保护