使用 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 的模組化方法提供了一種可擴展且易於管理的方式來處理安全政策。