Diegoservadio/azure-hub-spoke-lab

GitHub: Diegoservadio/azure-hub-spoke-lab

使用 Terraform 部署生产级 Azure Hub-Spoke 网络拓扑,演示企业级三层安全微隔离架构的最佳实践。

Stars: 0 | Forks: 0

# Azure Hub-Spoke 网络实验室 生产级 Hub-Spoke 网络拓扑,构建于 Microsoft Azure 之上,完全通过 Terraform 进行配置部署。 演示企业级标准网络模式和三层安全微隔离。 ![架构图](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/0d9e393bda163854.svg) ## 为什么做这个项目 Hub-Spoke 是企业 Azure 部署的参考网络拓扑 —— 几乎被所有意大利和欧盟云提供商(Aruba、Fastweb、Equinix、Claranet、NTT DATA)使用。本实验室端到端地实现了带有安全控制的这种模式,并全部编写为可复用的 Terraform 模块。 目标是:构建一个能够展示真实云基础设施技能的作品集项目 —— 而不是一个复制粘贴的教程。 ## 架构概述 | 组件 | 地址空间 | 用途 | |-----------|---------------|---------| | **Hub VNet** | `10.0.0.0/16` | 集中式共享服务及未来的混合连接 | | **Spoke VNet** | `10.1.0.0/16` | 带有 3 层子网布局的隔离工作负载网络 | | **VNet Peering** | 双向 | 启用了网关传输的 Hub <-> Spoke 路由 | | **NSGs** | 每层 | 微隔离:web -> app -> db | ### Hub VNet 子网 - `AzureBastionSubnet` (`10.0.1.0/26`) — 为 Azure Bastion 服务保留的名称 - `GatewaySubnet` (`10.0.2.0/27`) — 为 VPN/ExpressRoute 网关保留的名称(主动为未来的混合连接分配) - `snet-shared-services` (`10.0.10.0/24`) — DNS、监控、跳板机 ### Spoke VNet 子网(3 层模式) - `snet-web-workload` (`10.1.1.0/24`) — NSG 允许来自 Internet 的 HTTPS,以及仅来自 Bastion 的 SSH - `snet-app-workload` (`10.1.2.0/24`) — NSG 仅允许来自 Web 层的应用端口 (8080);显式拒绝来自 Internet 的访问 - `snet-db-workload` (`10.1.3.0/24`) — NSG 仅允许来自应用层的数据库端口 (5432);显式拒绝来自 Internet 和 Web 层的访问(纵深防御) ## 技术栈 - **Terraform** `>= 1.14` - **azurerm provider** `~> 4.0` - **Azure CLI** 用于身份验证 - 兼容 Azure **免费套餐** ## 项目结构 azure-hub-spoke-lab/ ├── terraform/ │ ├── modules/ │ │ ├── hub/ # 可复用的 hub VNet 模块 │ │ └── spoke/ # 可复用的 spoke VNet + NSGs 模块 │ └── environments/ │ └── dev/ # 开发环境组合 ├── diagrams/ │ └── architecture.svg # 架构图 └── docs/ # 架构决策记录 ## 快速开始 ### 前置条件 - Azure 订阅(免费套餐即可) - 已完成身份验证的 Azure CLI(`az login`) - Terraform 1.14+ ### 部署 ``` cd terraform/environments/dev cp terraform.tfvars.example terraform.tfvars # 使用你的 subscription_id 编辑 terraform.tfvars terraform init terraform plan terraform apply ``` ### 销毁 ``` terraform destroy ``` ## 设计决策 **为什么将 `hub` 和 `spoke` 分为不同的模块?** 每个环境中 hub 是唯一的;spokes 是可重复的。将它们保持为独立的模块,允许不同的 spoke(dev、prod、staging)共享同一个 hub,而无需代码重复。 **为什么对等互连在环境中定义,而不是在模块中?** 对等互连在两个模块之间创建了依赖关系。在环境级别定义它可以保持 `hub` 和 `spoke` 模块的独立性和可复用性。 **为什么在数据库 NSG 上有显式的 `Deny-From-WebTier` 规则?** 纵深防御。即使 spoke 的 web 和 db 子网位于同一个 VNet 中,显式的拒绝规则也能确保 db 不会被 web 层访问,即使未来的更改意外引入了路由也是如此。该规则也可作为审计文档。 **为什么在未创建实际网关的情况下创建了 `GatewaySubnet`?** 预先分配保留子网是最佳实践 —— 以后添加网关无需更改 VNet。根据 Microsoft 大小调整指南,CIDR 大小调整为 `/27`(32 个地址)。 ## 展示的技能 - Azure 网络:VNets、子网、对等互连、NSGs、地址空间规划 - 云采用框架命名规范 - Terraform:模块、变量、输出、依赖图 - 3 层安全架构和微隔离 - 纵深防御设计模式 - 基础设施即代码最佳实践:状态管理、机密处理、模块可复用性 ## 路线图 - [ ] 添加第二个 spoke(生产环境) - [ ] 在现有的 Bastion 子网中部署 Azure Bastion - [ ] 添加虚拟机工作负载(web、app、db 层) - [ ] 将状态迁移到远程后端(带状态锁定的 Azure 存储) - [ ] 添加 GitHub Actions,在 PR 时执行 `terraform fmt` / `validate` / `plan` - [ ] 用 Azure Firewall 替换简单的对等互连,以实现传递路由 ## 作者 **Diego Servadio** 云与安全工程学生 — ITS Tech Talent Factory,米兰
标签:Azure, Bastion, CISA项目, EC2, ECS, Hub-Spoke架构, IaC, NSG, SRE, Terraform, VNet Peering, VPN网关, 三层架构, 云计算, 企业网络, 偏差过滤, 微软云, 微隔离, 插件系统, 架构设计, 流量捕获, 混合云, 网络分段, 网络安全, 网络安全实验, 网络拓扑, 规则引擎, 隐私保护