👨‍💻 簡介

本文說明如何在 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_rangesrules_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 的模組化方法提供了一種可擴展且易於管理的方式來處理安全政策。

📚References