具有 IAM 控管標記的階層式防火牆政策

1. 簡介

Cloud Next Generation Firewall (NGFW)

Cloud Next Generation Firewall 是完全分散式的防火牆服務,提供進階防護功能、微區隔和全面涵蓋範圍,可保護 Google Cloud 工作負載不受內外部攻擊的侵擾。

Cloud NGFW 具備下列優點:

  • 分散式防火牆服務:Cloud NGFW 會在每個工作負載上提供有狀態的完全分散式主機型強制執行功能,以啟用零信任安全架構。
  • 簡化設定和部署作業:Cloud NGFW 會實作網路和階層式防火牆政策,可附加至資源階層節點。這些政策可在整個 Google Cloud 資源階層中,提供一致的防火牆體驗。
  • 精細控管和微區隔:防火牆政策和 Identity and Access Management (IAM) 控管的標記相輔相成,可針對虛擬私有雲 (VPC) 網路中的單一 VM,精細控管南北向和東西向流量。

網路防火牆政策

網路防火牆政策可做為防火牆規則的容器。將網路防火牆政策與虛擬私有雲網路建立關聯後,系統才會在任何位置強制執行政策中定義的規則。每個 VPC 網路只能連結一項網路防火牆政策。網路防火牆政策支援防火牆規則中受 IAM 管理的標記 (或簡稱標記),可用於為工作負載提供身分。

在多個網路之間共用網路防火牆政策,並與 IAM 控管的標記整合,可大幅簡化防火牆的設定和管理作業。

隨著網路防火牆政策的推出,Google Cloud 的防火牆政策現在包含下列元件:

  1. 階層式防火牆政策
  2. 虛擬私有雲防火牆規則
  3. 全域網路防火牆政策區域網路防火牆政策

資源階層中的機構和資料夾節點支援階層式防火牆政策,而虛擬私有雲防火牆規則和網路防火牆政策則是在虛擬私有雲層級套用。虛擬私有雲防火牆規則與網路防火牆政策的最大差異在於,虛擬私有雲防火牆規則只能套用至單一虛擬私有雲網路,而網路防火牆政策可附加至單一虛擬私有雲或虛擬私有雲群組,並享有批次更新等其他優點。

在本實驗室中,我們將測試階層式防火牆政策和全域網路防火牆政策。

最後,每個虛擬私有雲網路都設有默示防火牆規則

  • 動作為「允許」且目的地為 0.0.0.0/0 的輸出規則
  • 動作為拒絕、來源為 0.0.0.0/0 的輸入規則

根據預設,強制執行順序如下圖所示:

86df8f0d19c64e80.png

IAM 控管的標記

整合至防火牆政策規則的標記是鍵/值組合資源,定義於 Google Cloud 資源階層的機構或專案層級。如名稱所示,這類標記包含 IAM 存取控管機制,可指定哪些使用者能對標記執行哪些操作。舉例來說,IAM 權限可讓您指定哪些主體可將值指派給標記,以及哪些主體可將標記附加至資源。標記套用至資源後,防火牆政策規則即可使用標記允許及拒絕流量。

標記遵循 Google Cloud 的資源繼承模型,也就是標記及其值會從父項向下傳遞至整個階層。因此,標記可能會在某個位置建立,然後由整個資源階層中的其他資料夾和專案使用。如要進一步瞭解標記和存取限制,請參閱這個頁面

請勿將標記與網路標記混淆,後者是可新增至 Compute Engine 執行個體的字串,與執行個體相關聯,並在執行個體停用時消失。虛擬私有雲防火牆規則可能包含網路標記,但由於這些規則不屬於雲端資源,因此不受 IAM 存取控管。如要瞭解兩者的差異,請參閱這個頁面

2. 學習內容

  • 如何建立受 IAM 管控的標記,以搭配 Cloud NGFW 使用,並具有全域範圍。
  • 如何將標記附加至 VM。
  • 如何建立階層式防火牆政策,並將其與資料夾建立關聯。
  • 如何透過階層式防火牆政策建立防火牆規則,並使用 IAM 控管的標記指定來源和目標。

3. 實驗室整體架構

1bfe78ad755496e5.png

機構和資料夾:

  • 您會在機構底下直接建立 folder1folder2 這兩個資料夾。

專案:

  • folder1 中,您將建立主專案。這個專案將包含共用虛擬私有雲網路。
  • 您會在 folder2 中建立服務專案。這個專案會包含使用共用虛擬私有雲的虛擬機器。

網路:

  • 系統會在主專案中建立名為 mynet 的虛擬私有雲網路,並將其設定為「共用虛擬私有雲」。這樣一來,服務專案中的資源就能使用該網路。
  • 系統會在服務專案中建立兩部 VM,並連線至mynet共用虛擬私有雲。

IAM 控管的標記:

  • 您將在機構層級建立名為 http_tags 的 IAM 管理標記,並包含兩個值,分別是 http_serverhttp_client。這些標記/值會用於識別 VM,並將防火牆規則套用至 VM。

防火牆政策:

  • 系統會建立階層式防火牆政策,並與 folder1 建立關聯。這項政策中的規則會使用 IAM 管理的標記,允許流量從 http-client 傳送至通訊埠 80 上的 http-server
  • 系統會在主專案中建立「網路防火牆政策」,並與 mynet 虛擬私有雲建立關聯。這項政策會包含一項規則,允許 IAP SSH 存取 VM,以利進行測試。

4. 準備步驟

首先,請在 Google Cloud 機構中設定必要的 IAM 角色、網路基礎架構和執行個體。

實驗室作業所需的 IAM 角色

首先,我們會在機構層級將必要 IAM 角色指派給 GCP 帳戶。

  • 機構管理員 (roles/resourcemanager.organizationAdmin):這個角色可讓您管理 IAM 政策,以及查看機構、資料夾和專案的機構政策。
  • 標記管理員(roles/resourcemanager.tagAdmin):可建立、更新及刪除安全標記。
  • 標記使用者角色 (roles/resourcemanager.tagUser):這個角色可讓您存取安全標記清單,並管理標記與資源的關聯。
  • Compute 機構防火牆政策管理員角色 (roles/compute.orgFirewallPolicyAdmin):這個角色可讓您完整控管 Compute Engine 機構防火牆政策。
  • Compute 機構資源管理員角色 (roles/compute.orgSecurityResourceAdmin):這個角色可讓您完整控管與機構或資料夾相關聯的 Compute Engine 防火牆政策。
  • Compute 網路管理員 (roles/compute.networkAdmin):這個角色可讓您完全控管 Compute Engine 網路資源。
  • Compute 執行個體管理員( Beta 版) (roles/compute.instanceAdmin):這個角色可讓您完全掌控 Compute Engine 執行個體資源。
  • 記錄管理員 (roles/logging.admin):這個角色可授予所有記錄權限和相關權限的存取權。
  • 服務帳戶管理員 (roles/iam.serviceAccountAdmin):可建立及管理服務帳戶。
  • 服務使用情形管理員 (roles/serviceusage.serviceUsageAdmin):這個角色可讓您啟用、停用及檢查服務狀態、檢查作業,以及使用消費者專案的配額和帳單。
  • Compute 共用虛擬私有雲管理員 (roles/compute.xpnAdmin):這個角色可讓您管理共用 VPC 網路 (XPN)。

建立資料夾和專案

在 Cloud Shell 中執行下列操作,建立 folder1folder2

gcloud auth login

export org_id=$(gcloud organizations list --format='value(ID)')
export BILLING_ACCOUNT_ID=$(gcloud billing accounts list --format='value(ACCOUNT_ID)')
export folder1=[FOLDER1 NAME]
export folder2=[FOLDER2 NAME]
export hostproject=[HOST PROJECT NAME]
export serviceproject=[SERVICE PROJECT NAME]
export regionname=[REGION NAME]
export zonename=[COMPUTE ZONE NAME]

gcloud resource-manager folders create --display-name=$folder1 --organization=$org_id
export folder1_id=$(gcloud resource-manager folders list --organization=$org_id --filter="displayName=$folder1" --format="value(ID)")
gcloud resource-manager folders create --display-name=$folder2 --organization=$org_id
export folder2_id=$(gcloud resource-manager folders list --organization=$org_id --filter="displayName=$folder2" --format="value(ID)")

在 Cloud Shell 中執行下列操作,在 folder1 下方建立主機專案:

gcloud projects create  --name=$hostproject --folder=$folder1_id

您會看到下列內容。按下 Y 鍵,使用新的專案 ID 建立專案。

No project ID provided.

Use [NEW-PROJECT-ID] as project ID (Y/n)?

記下專案 ID。在 Cloud Shell 中執行下列操作,將其匯出至 hostproject_id:

export hostproject_id=[HOSTPROJECT ID]

在 Cloud Shell 中執行下列操作,將主機專案連結至帳單帳戶:

gcloud billing projects link $hostproject_id \
--billing-account=$BILLING_ACCOUNT_ID

在 Cloud Shell 中執行下列操作,在 folder2 下建立服務專案:

gcloud projects create  --name=$serviceproject --folder=$folder2_id

您會看到下列內容。按下 Y 鍵,使用新的專案 ID 建立專案。

No project ID provided.

Use [NEW-PROJECT-ID] as project ID (Y/n)?

記下專案 ID。在 Cloud Shell 中執行下列操作,將其匯出至 serviceproject_id:

export serviceproject_id=[SERVICEPROJECT ID]

在 Cloud Shell 中執行下列操作,將服務專案連結至帳單帳戶:

gcloud billing projects link $serviceproject_id \
--billing-account=$BILLING_ACCOUNT_ID

建立 IAM 控管的標記

標記是可附加至機構、資料夾或專案的鍵/值組合。詳情請參閱「建立及管理代碼」和「必要權限」。

我們會在機構層級建立一個標記 http-tags。標記的用途是搭配 Cloud NGFW 使用。我們不會將範圍限制於單一網路,標記的範圍是全域。稍後,我們會將標記套用至服務專案中 folder2 下建立的 VM。

在 Cloud Shell 中執行下列操作:

gcloud resource-manager tags keys create http_tags \
    --parent=organizations/$org_id \
    --purpose GCE_FIREWALL \
    --purpose-data organization=auto

我們會在建立 VM 時使用標記鍵 ID 進行註解。在 Cloud Shell 中執行下列操作,取得標記鍵 ID:

export http_tags_id=$(gcloud resource-manager tags keys describe $org_id/http_tags --format="value(name)")
echo $http_tags_id

在 Cloud Shell 中執行下列操作,建立兩個新的標記值 http_serverhttp_client

 gcloud resource-manager tags values create http_server \
      --parent $org_id/http_tags
 gcloud resource-manager tags values create http_client \
      --parent $org_id/http_tags

我們會在建立 VM 時使用標記 ID 和標記值 ID 進行註解。在 Cloud Shell 中執行下列操作,取得 http_serverhttp_client 的代碼值 ID:

export http_tags_http_server_id=$(gcloud resource-manager tags values describe $org_id/http_tags/http_server --format="value(name)")
echo $http_tags_http_server_id

export http_tags_http_client_id=$(gcloud resource-manager tags values describe $org_id/http_tags/http_client --format="value(name)")
echo $http_tags_http_client_id

在主專案和服務專案中啟用 API

在 Cloud Shell 中執行下列操作:

gcloud services enable compute.googleapis.com --project=$serviceproject_id
gcloud services enable compute.googleapis.com --project=$hostproject_id

在主專案中建立虛擬私有雲

在主機專案中,以自訂子網路模式建立 VPC 網路,並在 Cloud Shell 中執行下列操作:

gcloud compute networks create mynet \
    --subnet-mode=custom \
    --project=$hostproject_id

在主專案中建立子網路

在 Cloud Shell 中執行下列操作,建立 IPv4 子網路:

gcloud compute networks subnets create mysubnet \
    --network=mynet \
    --range=10.0.0.0/28 \
    --region=$regionname \
    --project=$hostproject_id

在主專案中啟用共用虛擬私有雲

在 Cloud Shell 中執行下列操作,在主專案中啟用共用虛擬私有雲:

gcloud compute shared-vpc enable $hostproject_id

在主專案中附加共用虛擬私有雲的服務專案

在 Cloud Shell 中執行下列操作,將服務專案附加至主專案中的共用虛擬私有雲:

gcloud compute shared-vpc associated-projects add $serviceproject_id --host-project=$hostproject_id 

在主專案中建立 Cloud Router 和 Cloud NAT

Cloud NAT 可讓 VM 輸出至網際網路,下載及安裝應用程式。

gcloud compute routers create $regionname-cr \
   --network=mynet \
   --region=$regionname \
   --project=$hostproject_id
gcloud compute routers nats create $regionname-nat \
    --router=$regionname-cr \
    --region=$regionname \
    --nat-all-subnet-ip-ranges \
    --auto-allocate-nat-external-ips \
    --project=$hostproject_id

在服務專案中建立執行個體

在服務專案中,於您剛在主專案共用虛擬私有雲中建立的子網路中,建立兩個執行個體。其中一個執行個體名為 http-server,我們會使用 http_server 的值為 http_tags 的標記加上註解。另一個執行個體名為 http-client,我們會使用 http_client 的值註解 http_tags 的標記。在 Cloud Shell 中執行下列指令:

gcloud compute instances create http-client \
    --project=$serviceproject_id \
   --subnet=projects/$hostproject_id/regions/$regionname/subnetworks/mysubnet \
    --zone=$zonename \
    --no-address \
    --resource-manager-tags=$http_tags_id=$http_tags_http_client_id

gcloud compute instances create http-server \
    --project=$serviceproject_id \
    --subnet=projects/$hostproject_id/regions/$regionname/subnetworks/mysubnet \
    --zone=$zonename \
    --no-address \
    --resource-manager-tags=$http_tags_id=$http_tags_http_server_id \
    --metadata startup-script='#! /bin/bash
    sudo apt-get update
    sudo apt-get install apache2 -y
    a2enmod ssl
    sudo a2ensite default-ssl
    echo "I am a Http Server." | \
    tee /var/www/html/index.html
    systemctl restart apache2'

記下 http-server 的內部 IP。我們會在稍後的防火牆規則測試步驟中使用。

export http_server_ip=$(gcloud compute instances describe http-server --zone $zonename --format='value(networkInterfaces[0].networkIP)' --project $serviceproject_id)
echo $http_server_ip

5. 在主專案中建立全域網路防火牆政策

我們會在主專案中建立全域網路防火牆政策,並將其與主專案中的共用 VPC 建立關聯。

gcloud config set project $hostproject_id
gcloud compute network-firewall-policies create  mynet-fw-policy \
--global \
--project=$hostproject_id
gcloud compute network-firewall-policies associations create \
    --firewall-policy=mynet-fw-policy \
    --network=mynet \
    --name=mynet-fw-policy \
    --global-firewall-policy \
    --project=$hostproject_id

如要允許 IAP 連線至您的 VM 執行個體,請在網路防火牆政策中建立防火牆規則:

  • 套用至所有您希望能透過 IAP 存取的 VM 執行個體。
  • 允許來自 IP 範圍 35.235.240.0/20 的輸入流量。這個範圍包含 IAP 用於 TCP 轉送的所有 IP 位址。
gcloud compute network-firewall-policies rules create 1000 \
    --action=ALLOW \
    --firewall-policy=mynet-fw-policy \
    --description="mynet-allow-iap" \
    --direction=INGRESS \
    --src-ip-ranges=35.235.240.0/20 \
    --layer4-configs=tcp:22  \
    --global-firewall-policy \
    --project=$hostproject_id

在控制台中,您可以前往主專案,在「防火牆政策」下方找到新建立的全球網路防火牆政策。您可以在網路防火牆政策中查看新建立的防火牆規則。這是主控台連結,點選即可前往。請務必在控制台中將專案選擇工具變更為主專案。

6. 測試從 http-client VM 存取 http-server VM

透過 SSH 連線至名為 http-client 的 VM,並測試是否能透過 HTTP 80 連接埠存取 http-server

在 Cloud Shell 中執行下列操作:

gcloud compute ssh \
    --zone=$zonename "http-client" \
    --tunnel-through-iap \
    --project=$serviceproject_id

使用 curl 存取網路伺服器。

curl -m 10 [http_server_ip]

畫面上會顯示 curl 指令結果。沒有輸入防火牆規則允許 http-server 使用通訊埠 80。

連線在 10000 毫秒後逾時。

結束 SSH 工作階段,返回 Cloud Shell。

exit

7. 建立階層式防火牆政策和防火牆規則

我們將在 folder1 建立階層式防火牆政策,並將該政策與 folder1 建立關聯。政策中的防火牆規則會套用至 folder1 下的主機專案。

建立階層式防火牆政策

gcloud compute firewall-policies create \
  --folder=$folder1_id \
  --short-name=my-folder1-fw-policy

在階層式防火牆政策中建立防火牆規則

這項規則允許標記值為 http_tags/http_client 的 VM,透過 TCP 通訊埠 80 存取標記值為 http_tags/http_server 的 VM。

gcloud compute firewall-policies rules create 100 \
  --organization=$org_id \
  --firewall-policy my-folder1-fw-policy \
  --direction=INGRESS \
  --layer4-configs=tcp:80 \
  --action=allow \
  --src-secure-tags=$org_id/http_tags/http_client \
  --target-secure-tags=$org_id/http_tags/http_server \
  --description=folder1-allow-http

將階層式防火牆政策與 folder1 建立關聯

gcloud compute firewall-policies associations create \
   --firewall-policy=my-folder1-fw-policy \
   --folder=$folder1_id \
   --name=my-folder1-fw-policy\
   --organization=$org_id

在控制台中,前往 folder1,即可在「防火牆政策」下方找到新建立的階層式防火牆政策。「位於這個資料夾的防火牆政策」會顯示防火牆政策。您可以在階層式防火牆政策中查看新建立的防火牆規則。這是主控台連結,點選即可前往。請務必在控制台中將專案挑選器變更為 folder1

8. 測試從 http-client VM 存取 http-server VM

檢查套用至主專案共用 VPC 的有效防火牆政策。

在 Cloud Shell 中執行下列操作:

gcloud compute networks get-effective-firewalls mynet --project=$hostproject_id

您會看到類似下圖的繼承階層式防火牆政策:

TYPE: org-firewall
FIREWALL_POLICY_NAME: <NUMBER_FOR_YOUR_FW_POLICY>
FIREWALL_POLICY_PRIORITY: 
PRIORITY: 100
ACTION: ALLOW
DIRECTION: INGRESS
DISABLED: False
IP_RANGES:

You will see the network firewall policy to the VPC like this:
TYPE: network-firewall-policy
FIREWALL_POLICY_NAME: mynet-fw-policy
FIREWALL_POLICY_PRIORITY: 1000
PRIORITY: 1000
ACTION: ALLOW
DIRECTION: INGRESS
DISABLED: False
IP_RANGES: 35.235.240.0/20

透過 SSH 連線至名為 http-client 的 VM,並測試是否能透過 HTTP 80 連接埠存取 http-server

在 Cloud Shell 中執行下列操作:

gcloud compute ssh \
    --zone=$zonename "http-client" \
    --tunnel-through-iap \
    --project=$serviceproject_id

使用 curl 存取網路伺服器。

curl [http_server_ip]

您會看到 curl 指令成功從 http-server 傳回回應。

I am a Http Server.

階層式防火牆政策的輸入防火牆規則允許從 http-client 存取通訊埠 80 的 http-server

結束 SSH 工作階段,返回 Cloud Shell。

exit

9. 清理

清除服務專案中的 VM

在 Cloud Shell 中執行下列操作:

gcloud compute instances delete http-server --zone $zonename --project=$serviceproject_id
gcloud compute instances delete http-client --zone $zonename --project=$serviceproject_id

清除階層式防火牆政策

在 Cloud Shell 中執行下列操作:

gcloud compute firewall-policies associations delete my-folder1-fw-policy \
   --firewall-policy=my-folder1-fw-policy \
   --organization=$org_id
gcloud compute firewall-policies rules delete 100 \
  --organization=$org_id \
  --firewall-policy=my-folder1-fw-policy
gcloud compute firewall-policies delete my-folder1-fw-policy \
  --organization=$org_id

在機構層級清除標記

在 Cloud Shell 中執行下列操作:

gcloud resource-manager tags values delete $http_tags_http_server_id
gcloud resource-manager tags values delete $http_tags_http_client_id
gcloud resource-manager tags keys delete $http_tags_id

清除主專案

在 Cloud Shell 中執行下列操作:

gcloud compute shared-vpc associated-projects remove $serviceproject_id --host-project=$hostproject_id 
gcloud compute shared-vpc disable $hostproject_id
gcloud projects delete $hostproject_id

清除服務專案

在 Cloud Shell 中執行下列操作:

gcloud projects delete $serviceproject_id

清理資料夾

在 Cloud Shell 中執行下列操作:

gcloud resource-manager folders delete $folder1_id
gcloud resource-manager folders delete $folder2_id

10. 恭喜

您已成功測試階層式防火牆政策與 IAM 管理的標記。