使用 Terraform 在 GCP 上建立 Cloud Armor
terraform gcp cloud armor

👨💻 簡介
本文說明如何在 Google Cloud Platform (GCP) 上使用 Terraform 配置 Google Cloud Armor 安全策略。
前提條件
- Google Cloud Platform (GCP) 帳號:確保有一個有效的 GCP 帳號。
- 安裝 Terraform:還沒安裝可以參考 Terraform 安裝指南。
- 基礎 Terraform 知識:熟悉基本的 Terraform 命令和概念,如果需要,可參考Terraform 入門指南 。
🎯 設定
步驟 1:建立 provider.tf
定義 GCP 提供者和所需的 Terraform 版本。
terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "5.7.0"
    }
  }
}
provider "google" {
  project = "your-project-id"
  region  = "asia-east1"
}
步驟 2:建立 main.tf
在此檔案中,定義 Google Cloud Armor 安全策略資源。
- 安全策略
resource "google_compute_security_policy" "default" {
  name = "my-security-policy"
  rule {
    action   = "allow"
    priority = 1000
    match {
      versioned_expr = "SRC_IPS_V1"
      config {
        src_ip_ranges = ["0.0.0.0/0"]
      }
    }
  }
}
參數介紹
- name:安全策略的名稱。
- action:採取的行動(例如,‘allow’ 或 ‘deny’)。
- priority:規則的優先順序。
- versioned_expr:表達式的版本。
- src_ip_ranges:匹配的來源 IP 範圍。
步驟 3:初始化 Terraform
terraform init
步驟 4:執行 Dry Run
terraform plan
步驟 5:部署
terraform apply
資源刪除
部署完成後清理資源:
terraform destroy
🛠️ 將 Terraform 設定模組化並使用 Google Cloud Armor
了解動態區塊和迭代器
在深入模組化 Terraform 配置之前,讓我們了解 Terraform 的兩個進階功能:動態塊和迭代器。
- 動態區塊:在 Terraform 中,動態區塊用於根據複雜變數(如 list 或 map)動態構建資源內的可重複嵌套區塊。當需要在資源中建立多個類似的配置,但這些區塊的確切數量或組成可能會變化時,這個功能特別有用。 
- 迭代器:迭代器是動態區塊內使用的可選參數,允許我們自定義複雜變數中每個項目的臨時變數名稱。默認情況下,Terraform 使用 each 作為迭代器,但可以指定不同的名稱以提高清晰度或避免與其他變數衝突。 
1. 重構 main.tf 以實現模組化
在重構 Google Cloud Armor 模組的 main.tf 時,我
們將使用 dynamic 塊和 iterator 來有效地從物件列表中建立 cloud armor 的安全規則。
- Google Cloud Armor 模組:
resource "google_compute_security_policy" "main" {
  name = var.name
  dynamic "rule" {
    for_each = var.rules_src_ip_ranges
    iterator = allow
    content {
      action   = allow.value.action
      priority = allow.value.priority
      match {
        versioned_expr = "SRC_IPS_V1"
        config {
          src_ip_ranges = allow.value.ranges
        }
      }
      description = allow.value.description
    }
  }
  
  dynamic "rule" {
    for_each = var.rules_expression
    iterator = deny
    content {
      action   = deny.value.action
      priority = deny.value.priority
      match {
        expr {
          expression = deny.value.expression
        }
      }
      description = deny.value.description
    }
  }
}
在此例中:
- 我們使用兩個 dynamic區塊來建立不同類型的安全規則:一個用於來源 IP 範圍的規則,另一個用於表達式的規則。
- 每個 dynamic區塊遍歷物件列表(rules_src_ip_ranges或rules_expression),為列表中的每個物件建立一個新規則。
- iterator(第一個塊名為- allow,第二個塊名為- deny)在每次迭代中替代列表中的每個項目。
2. 在 variables.tf 中定義變數
在 variables.tf 檔案中定義所需的變數。這些變數用於模組中動態產生安全規則。
- 變數定義:
variable "security_policy_name" {
  description = "安全策略的名稱"
  type        = string
}
variable "rules_src_ip_ranges" {
  description = "來源 IP 範圍的安全規則"
  type = list(object({
    action      = string
    priority    = number
    ranges      = list(string)
    description = string
  }))
}
variable "rules_expression" {
  description = "表達式的安全規則"
  type = list(object({
    action      = string
    priority    = number
    expression  = string
    description = string
  }))
}
3. 建立 Google Cloud Armor 模組
建立一個 modules/cloud_armor 目錄並添加 cloud_armor.tf。
- 模組定義(cloud_armor.tf):
  module "google_cloud_armor" {
    source = "./modules/cloud_armor"
    name   = "my-security-policy"
    
    rules_src_ip_ranges = [{
      action      = "allow"
      priority    = 1
      ranges      = ["0.0.0.0/0"]
      description = "允許全部"
      }
    ]
	rules_expression = [{
	  action = "deny(403)"
	  priority      = 2
	  expression    = "request.headers['x-forwarded-for'].contains('127.0.0.1')"
	  description   = "拒絕 127.0.0.1"
      }
    ]
  }
- 這是您可能為此專案結構化文件夾和文件的一個示例:
terraform-google-cloud-armor/
│
├── main.tf               # 主要 Terraform 設定檔
├── provider.tf           # 提供者配置
│
├── modules/              # 包含所有模組代碼的目錄
│   └── cloud_armor/      # Google Cloud Armor 模組
│       ├── main.tf       # Cloud Armor 模組的主文件
│       ├── variables.tf  # Cloud Armor 模組特有的變數
│
└── terraform.tfvars      # (可選) 定義變數值的檔案
- 以下是你可能會為這個專案組織資料夾和檔案的一個範例:
terraform-google-cloud-armor/
│
├── main.tf               # 主要 Terraform 配置檔案
├── provider.tf           # 提供者配置
│
├── modules/              # 包含所有模組化程式碼的目錄
│   └── cloud_armor/      # Google Cloud Armor 模組
│       ├── main.tf       # Cloud Armor 模組的主檔案
│       ├── variables.tf  # Cloud Armor 模組特有的變數
│
└── terraform.tfvars      # (選擇性) 定義變數值的檔案
4. 應用模組化配置
在專案的根目錄執行以下 Terraform 命令:
- 初始化 Terraform: - terraform init
- 執行預演: - terraform plan
- 應用配置: - terraform apply
這種使用 Terraform 配置 Google Cloud Armor 的模組化方法提供了一種可擴展且易於管理的方式來處理安全政策。