s3nafps/GCP-Fortress-Architecture
GitHub: s3nafps/GCP-Fortress-Architecture
该项目是一个 Terraform 蓝图,用于在 GCP 上构建纯私有、高可用且内置安全基线的 Web 架构。
Stars: 0 | Forks: 0
# GCP-Fortress-Architecture
Terraform 蓝图,用于构建纯私有的 GCP Web 架构,包含负载均衡、仅限 IAP 的 SSH 以及由 CI 支持的安全检查。
它被设计为 Web 应用程序的安全基线,在此架构中,后端 VM 不接入公共互联网,同时跨区域保持高可用性。
## 架构图
### 高层拓扑
```
graph TD
subgraph Internet["🌐 Internet"]
User["👤 External User"]
end
subgraph GCP["☁️ Google Cloud Platform"]
GLB["🌍 Global External HTTP Load Balancer
Static Anycast IP"] subgraph VPC["🔒 Custom VPC (fortress-vpc)"] subgraph Subnet["Private Subnet (10.0.1.0/24)"] MIG["🔄 Regional Managed Instance Group
Multi-Zone, Auto-Healing"] VM1["🖥️ VM Instance (Zone A)
No Public IP, Nginx"] VM2["🖥️ VM Instance (Zone B)
No Public IP, Nginx"] MIG -->|Manages| VM1 MIG -->|Manages| VM2 end subgraph Firewalls["🛡️ Firewall Rules"] FW_IAP["✅ Allow: IAP SSH (tcp:22)"] FW_HC["✅ Allow: Google Health Checks (tcp:80)"] FW_DENY["❌ Deny: All other ingress"] end end SA["🔑 Custom Service Account
Roles: logWriter, metricWriter"] GCS["🪣 GCS Backend
Remote Terraform State"] end User -->|HTTP Request| GLB GLB -->|Proxies to Backend| MIG SA -.->|Attached to| VM1 SA -.->|Attached to| VM2 FW_IAP -.->|Protects| Subnet FW_HC -.->|Permits Probes to| MIG ``` ### 请求流与 Identity-Aware Proxy (IAP) ``` sequenceDiagram participant User as Internet User participant Admin as System Admin participant IAP as Google IAP participant GLB as Load Balancer participant VM as Private VM %% Standard Web Traffic User->>GLB: 1. HTTP Request (Port 80) GLB->>VM: 2. Proxied Request (Internal IP) VM-->>GLB: 3. Nginx Response GLB-->>User: 4. HTTP Response %% Secure Admin Access (No Bastion/Public IP) Admin->>IAP: 1. `gcloud compute ssh` IAP->>IAP: 2. Verify IAM Identity & Permissions IAP->>VM: 3. Tunnel SSH to Internal IP (Port 22) VM-->>Admin: 4. Secure SSH Session Established ``` ## 安全亮点(“为什么”) | 功能 | 设计决策与安全原理 | |---|---| | **仅限 IAP 的 SSH** | 消除了对堡垒机或公共 IP 的需求。SSH 身份验证完全由 Google IAM 处理,并且所有会话都集中在 Cloud Audit Logs 中。 | | **VM 无公共 IP** | 移除了头号云攻击向量。VM 无法从开放互联网访问,从而强制所有入口流量通过 Load Balancer。 | | **Private Google Access** | 允许隔离的 VM 通过内部 Google Edge 路由访问 Google API(如 Cloud Storage 或 Logging),无需 NAT 网关。 | | **最小权限 SA** | 默认的 Compute Engine SA 授予项目范围的 Editor 访问权限。本项目使用自定义 SA,仅包含以下两个角色:`roles/logging.logWriter` 和 `roles/monitoring.metricWriter`。 | | **显式 Deny-All** | 低优先级 (65534) 的 deny-all 入站规则作为纵深防御的安全网,并使默认拒绝策略在 Terraform plan 和审计日志中可见。 | | **VPC Flow Logs** | 在私有子网上启用,以提供网络取证并满足合规性要求。 | ## 项目结构(模块化 Terraform) 代码严格分离为专注的模块,以实现可重用性: ``` . ├── main.tf # Root: provider config + module composition ├── variables.tf # Root: project-level inputs ├── outputs.tf # Root: top-level outputs ├── backend.tf # GCS remote state configuration ├── versions.tf # Provider version constraints ├── terraform.tfvars # Variable values (ignored from git) ├── terraform.tfvars.example # Example variable template └── modules/ ├── networking/ # Custom VPC, Private Subnet, IAP & HC Firewalls ├── compute/ # Custom SA, Instance Template, Regional MIG └── loadbalancer/ # Global Anycast IP, HTTP Proxy, Backend Service ``` ## 持续集成 / 持续部署 (CI/CD) 本项目严格遵守 GitOps 原则。**生产部署只能通过自动化流水线进行,而不是从本地工作站。** 稳健的 GitHub Actions 工作流 (`.github/workflows/terraform.yml`) 在所有拉取请求和合并到 `main` 分支时运行,执行以下阶段: 1. **格式检查 (`terraform fmt`)**:强制执行一致的 HashiCorp 样式。 2. **初始化与验证**:确保模块/提供商功能正常且 HCL 语法正确。 3. **静态安全分析 (`tfsec`)**:Aquasecurity 的 `tfsec` 在部署*之前*扫描 Terraform 代码,以尽早发现安全配置错误(例如,捕获开放的 0.0.0.0/0 防火墙规则或未加密的磁盘)。 4. **自动化规划**:在 PR 上,执行 `terraform plan` 并将输出自动作为评论注入到 PR 中,使审查者无需在本地拉取代码即可查看确切的基础架构更改。 ## 本地部署(仅限沙箱/测试) ### 前置条件 1. **Google Cloud SDK** — [安装 gcloud CLI](https://cloud.google.com/sdk/docs/install) 2. **Terraform** — `>= 1.5` ([安装 Terraform](https://developer.hashicorp.com/terraform/install)) 3. **GCP 项目** — 已启用结算功能 ### 1. 身份验证与启用 API ``` # 登录 gcloud 并设置您的项目 gcloud auth login gcloud config set project YOUR_PROJECT_ID # 验证 Terraform (Application Default Credentials) gcloud auth application-default login # 启用所需的 GCP APIs gcloud services enable compute.googleapis.com iam.googleapis.com iap.googleapis.com logging.googleapis.com monitoring.googleapis.com ``` ### 2. 配置 State Bucket 创建一个 GCS 存储桶以安全地存储您的 Terraform state: ``` # 创建 bucket gcloud storage buckets create gs://YOUR_STATE_BUCKET_NAME --location=YOUR_REGION --uniform-bucket-level-access # 启用版本控制(对 state 安全至关重要) gcloud storage buckets update gs://YOUR_STATE_BUCKET_NAME --versioning ``` *使用您的新存储桶名称更新 `backend.tf`。* ### 3. 部署到沙箱 ``` # 创建并填充 tfvars cp terraform.tfvars.example terraform.tfvars # 使用您的项目详情编辑 terraform.tfvars # 标准 Terraform workflow terraform init terraform plan -out=tfplan terraform apply tfplan ``` ### 4. 验证 ``` # 获取全局 anycast IP terraform output -raw load_balancer_ip # 测试连接(注意:Global LBs 需要 3-5 分钟才能完成传播) curl http://$(terraform output -raw load_balancer_ip) ``` ### 5. 安全的 SSH 检查 测试 Identity-Aware Proxy 隧道(无需公共 IP): ``` gcloud compute ssh --tunnel-through-iap --zone
```
## 清理
为防止持续产生费用,请在完成后销毁基础架构:
```
terraform destroy
gcloud storage rm -r gs://YOUR_STATE_BUCKET_NAME
```
## 成本与结算
虽然此架构利用了 Google Cloud 的免费层级 `e2-micro` 实例作为计算后端,但**请注意,Global External HTTP Load Balancer 会产生标准路由和转发费用。**
如果您出于学习目的部署此架构,强烈建议在非活动状态下使用 `terraform destroy` 销毁环境,以避免产生意外的负载均衡费用。
*此架构旨在用于演示目的,展示了 Google Cloud 上安全、可扩展的基础设施即代码模式。*
Static Anycast IP"] subgraph VPC["🔒 Custom VPC (fortress-vpc)"] subgraph Subnet["Private Subnet (10.0.1.0/24)"] MIG["🔄 Regional Managed Instance Group
Multi-Zone, Auto-Healing"] VM1["🖥️ VM Instance (Zone A)
No Public IP, Nginx"] VM2["🖥️ VM Instance (Zone B)
No Public IP, Nginx"] MIG -->|Manages| VM1 MIG -->|Manages| VM2 end subgraph Firewalls["🛡️ Firewall Rules"] FW_IAP["✅ Allow: IAP SSH (tcp:22)"] FW_HC["✅ Allow: Google Health Checks (tcp:80)"] FW_DENY["❌ Deny: All other ingress"] end end SA["🔑 Custom Service Account
Roles: logWriter, metricWriter"] GCS["🪣 GCS Backend
Remote Terraform State"] end User -->|HTTP Request| GLB GLB -->|Proxies to Backend| MIG SA -.->|Attached to| VM1 SA -.->|Attached to| VM2 FW_IAP -.->|Protects| Subnet FW_HC -.->|Permits Probes to| MIG ``` ### 请求流与 Identity-Aware Proxy (IAP) ``` sequenceDiagram participant User as Internet User participant Admin as System Admin participant IAP as Google IAP participant GLB as Load Balancer participant VM as Private VM %% Standard Web Traffic User->>GLB: 1. HTTP Request (Port 80) GLB->>VM: 2. Proxied Request (Internal IP) VM-->>GLB: 3. Nginx Response GLB-->>User: 4. HTTP Response %% Secure Admin Access (No Bastion/Public IP) Admin->>IAP: 1. `gcloud compute ssh` IAP->>IAP: 2. Verify IAM Identity & Permissions IAP->>VM: 3. Tunnel SSH to Internal IP (Port 22) VM-->>Admin: 4. Secure SSH Session Established ``` ## 安全亮点(“为什么”) | 功能 | 设计决策与安全原理 | |---|---| | **仅限 IAP 的 SSH** | 消除了对堡垒机或公共 IP 的需求。SSH 身份验证完全由 Google IAM 处理,并且所有会话都集中在 Cloud Audit Logs 中。 | | **VM 无公共 IP** | 移除了头号云攻击向量。VM 无法从开放互联网访问,从而强制所有入口流量通过 Load Balancer。 | | **Private Google Access** | 允许隔离的 VM 通过内部 Google Edge 路由访问 Google API(如 Cloud Storage 或 Logging),无需 NAT 网关。 | | **最小权限 SA** | 默认的 Compute Engine SA 授予项目范围的 Editor 访问权限。本项目使用自定义 SA,仅包含以下两个角色:`roles/logging.logWriter` 和 `roles/monitoring.metricWriter`。 | | **显式 Deny-All** | 低优先级 (65534) 的 deny-all 入站规则作为纵深防御的安全网,并使默认拒绝策略在 Terraform plan 和审计日志中可见。 | | **VPC Flow Logs** | 在私有子网上启用,以提供网络取证并满足合规性要求。 | ## 项目结构(模块化 Terraform) 代码严格分离为专注的模块,以实现可重用性: ``` . ├── main.tf # Root: provider config + module composition ├── variables.tf # Root: project-level inputs ├── outputs.tf # Root: top-level outputs ├── backend.tf # GCS remote state configuration ├── versions.tf # Provider version constraints ├── terraform.tfvars # Variable values (ignored from git) ├── terraform.tfvars.example # Example variable template └── modules/ ├── networking/ # Custom VPC, Private Subnet, IAP & HC Firewalls ├── compute/ # Custom SA, Instance Template, Regional MIG └── loadbalancer/ # Global Anycast IP, HTTP Proxy, Backend Service ``` ## 持续集成 / 持续部署 (CI/CD) 本项目严格遵守 GitOps 原则。**生产部署只能通过自动化流水线进行,而不是从本地工作站。** 稳健的 GitHub Actions 工作流 (`.github/workflows/terraform.yml`) 在所有拉取请求和合并到 `main` 分支时运行,执行以下阶段: 1. **格式检查 (`terraform fmt`)**:强制执行一致的 HashiCorp 样式。 2. **初始化与验证**:确保模块/提供商功能正常且 HCL 语法正确。 3. **静态安全分析 (`tfsec`)**:Aquasecurity 的 `tfsec` 在部署*之前*扫描 Terraform 代码,以尽早发现安全配置错误(例如,捕获开放的 0.0.0.0/0 防火墙规则或未加密的磁盘)。 4. **自动化规划**:在 PR 上,执行 `terraform plan` 并将输出自动作为评论注入到 PR 中,使审查者无需在本地拉取代码即可查看确切的基础架构更改。 ## 本地部署(仅限沙箱/测试) ### 前置条件 1. **Google Cloud SDK** — [安装 gcloud CLI](https://cloud.google.com/sdk/docs/install) 2. **Terraform** — `>= 1.5` ([安装 Terraform](https://developer.hashicorp.com/terraform/install)) 3. **GCP 项目** — 已启用结算功能 ### 1. 身份验证与启用 API ``` # 登录 gcloud 并设置您的项目 gcloud auth login gcloud config set project YOUR_PROJECT_ID # 验证 Terraform (Application Default Credentials) gcloud auth application-default login # 启用所需的 GCP APIs gcloud services enable compute.googleapis.com iam.googleapis.com iap.googleapis.com logging.googleapis.com monitoring.googleapis.com ``` ### 2. 配置 State Bucket 创建一个 GCS 存储桶以安全地存储您的 Terraform state: ``` # 创建 bucket gcloud storage buckets create gs://YOUR_STATE_BUCKET_NAME --location=YOUR_REGION --uniform-bucket-level-access # 启用版本控制(对 state 安全至关重要) gcloud storage buckets update gs://YOUR_STATE_BUCKET_NAME --versioning ``` *使用您的新存储桶名称更新 `backend.tf`。* ### 3. 部署到沙箱 ``` # 创建并填充 tfvars cp terraform.tfvars.example terraform.tfvars # 使用您的项目详情编辑 terraform.tfvars # 标准 Terraform workflow terraform init terraform plan -out=tfplan terraform apply tfplan ``` ### 4. 验证 ``` # 获取全局 anycast IP terraform output -raw load_balancer_ip # 测试连接(注意:Global LBs 需要 3-5 分钟才能完成传播) curl http://$(terraform output -raw load_balancer_ip) ``` ### 5. 安全的 SSH 检查 测试 Identity-Aware Proxy 隧道(无需公共 IP): ``` gcloud compute ssh
标签:DevSecOps, ECS, GCP, Terraform, 上游代理, 云原生架构, 私有网络