1. 簡介
你好!歡迎參加 Cloud Armor 預先設定的 WAF 規則程式碼研究室!
Google Cloud Armor 是 Google 的企業級邊緣網路安全解決方案,大規模提供 DDoS 防護、彈性管理功能,並能強制執行 WAF 規則。
Cloud Armor 擴充了預先設定的 WAF 規則集,可防範 OWASP 前 10 大網頁應用程式安全漏洞。這些規則集以 OWASP Modsecurity 核心規則集 3.0.2 版為基礎,可防範最常見的部分網頁應用程式安全風險,包括本機檔案包含 (LFI)、遠端檔案包含 (RFI)、遠端程式碼執行 (RCE) 等。
在本程式碼研究室中,您將瞭解如何使用 Google Cloud Armor WAF 規則,防範一些常見的安全漏洞。
課程內容
- 如何設定執行個體群組和全域負載平衡器供服務使用
- 如何設定 Cloud Armor 安全性政策,並在其中使用預先設定的 WAF 規則,防範 LFI、RCE、掃描工具、通訊協定和工作階段固定等攻擊
- 如何查看記錄,確認 Cloud Armor 是否成功抵禦攻擊。
軟硬體需求
- Google Compute Engine 基礎知識 ( 程式碼研究室)
- 基本的網路和 TCP/IP 知識
- 基本的 Unix/Linux 指令列知識
- 建議您先完成「Google Cloud 中的網路」導覽,瞭解 GCP 網路。
- (選用) 完成 Cloudnet20 Cloud Armor 實驗室,瞭解如何使用 SQL 注入、IP 位址和地理位置規則保護工作負載。
程式碼研究室拓撲和用途

圖 1:Cloud Armor WAF 規則程式碼實驗室拓撲
OWASP Juice Shop 應用程式在設計時,刻意納入 OWASP 前 10 大安全漏洞,非常適合用於安全訓練和安全意識教育。攻擊者也可利用其中的漏洞進行測試。在本程式碼研究室中,我們將使用該應用程式模擬幾種攻擊,再透過 Cloud Armor WAF 規則提供保護措施。應用程式前端的 Google Cloud 負載平衡器會套用 Cloud Armor 安全性政策和規則。此應用程式是在公開網際網路上提供,幾乎從任何地方都能存取。我們要使用 Cloud Armor 和虛擬私有雲防火牆規則來保護 Juice Shop。
2. 設定和需求條件
自修實驗室環境設定



請記住專案 ID,這是所有 Google Cloud 專案中不重複的名稱 (上述名稱已遭占用,因此不適用於您,抱歉!)。本程式碼研究室稍後會將其稱為 PROJECT_ID。
- 接著,您必須在 Cloud 控制台中啟用帳單,才能使用 Google Cloud 資源。
完成本程式碼研究室的費用應該不高,甚至完全免費。請務必按照「清除」部分的指示操作,瞭解如何停用資源,避免在本教學課程結束後繼續產生帳單費用。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。
啟動 Cloud Shell
雖然您可以透過筆電遠端操作 Google Cloud,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是可在雲端執行的指令列環境。
在 GCP 主控台,按一下右上角工具列的 Cloud Shell 圖示:

佈建並連線至環境的作業需要一些時間才能完成。完成後,您應該會看到如下的內容:

這部虛擬機器已預先安裝所有必要的開發工具,並提供永久的 5 GB 主目錄,而且可在 Google Cloud 運作,大幅提升網路效能並強化驗證功能。您只要使用瀏覽器,就能完成本實驗室的所有工作。
事前準備
在 Cloud Shell 中,確認專案 ID 是否已設定完畢
gcloud config list project gcloud config set project [YOUR-PROJECT-NAME] PROJECT_ID=[YOUR-PROJECT-NAME] echo $PROJECT_ID
啟用 API
啟用所有必要服務
gcloud services enable compute.googleapis.com gcloud services enable logging.googleapis.com gcloud services enable monitoring.googleapis.com
3. 建立虛擬私有雲網路
建立虛擬私有雲網路
透過 Cloud Shell
gcloud compute networks create ca-lab-vpc --subnet-mode custom
輸出內容
Created NAME SUBNET_MODE BGP_ROUTING_MODE IPV4_RANGE GATEWAY_IPV4 ca-lab-vpc CUSTOM REGIONAL
建立子網路
透過 Cloud Shell
gcloud compute networks subnets create ca-lab-subnet \
--network ca-lab-vpc --range 10.0.0.0/24 --region us-central1
輸出內容
Created NAME REGION NETWORK RANGE ca-lab-subnet us-central1 ca-lab-vpc 10.0.0.0/24
建立虛擬私有雲防火牆規則
建立虛擬私有雲和子網路後,請設定幾項防火牆規則。第一項防火牆規則會允許所有 IP 位址透過通訊埠 3000 存取測試應用程式網站的外部 IP。第二項防火牆規則用於允許負載平衡器來源 IP 傳出的健康狀態檢查流量。
透過 Cloud Shell
gcloud compute firewall-rules create allow-js-site --allow tcp:3000 --network ca-lab-vpc
輸出內容
Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED allow-js-site ca-lab-vpc INGRESS 1000 tcp:3000 False
建立防火牆規則,允許來自 Google 健康狀態檢查位址範圍的流量。
透過 Cloud Shell
gcloud compute firewall-rules create allow-health-check \
--network=ca-lab-vpc \
--action=allow \
--direction=ingress \
--source-ranges=130.211.0.0/22,35.191.0.0/16 \
--target-tags=allow-healthcheck \
--rules=tcp
輸出內容
Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED allow-health-check ca-lab-vpc INGRESS 1000 tcp False
4. 設定測試應用程式
下一步是建立測試應用程式,即 OWASP Juice Shop 網路伺服器。
建立運算執行個體時,我們會使用容器映像檔,確保伺服器具備所需的服務。這個伺服器會部署在 us-central1-c,並加上允許健康狀態檢查的網路標記。
建立 OWASP Juice Shop 應用程式
使用知名的開放原始碼 OWASP Juice Shop 應用程式,做為有安全漏洞的環境。您也能在 OWASP 的網站上,透過這個應用程式完成 OWASP 安全漏洞挑戰。
透過 Cloud Shell
gcloud compute instances create-with-container owasp-juice-shop-app --container-image bkimminich/juice-shop \
--network ca-lab-vpc \
--subnet ca-lab-subnet \
--private-network-ip=10.0.0.3 \
--machine-type n1-standard-2 \
--zone us-central1-c \
--tags allow-healthcheck
輸出內容
NAME ZONE MACHINE_TYPE PREEMPTIBLE owasp-juice-shop-app us-central1-c n1-standard-2 INTERNAL_IP EXTERNAL_IP STATUS 10.0.0.3 <public IP> RUNNING
設定 Cloud 負載平衡器元件:執行個體群組
建立非代管執行個體群組。
透過 Cloud Shell
gcloud compute instance-groups unmanaged create juice-shop-group \
--zone=us-central1-c
輸出內容
NAME LOCATION SCOPE NETWORK MANAGED INSTANCES juice-shop-group us-central1-c zone 0
將 Juice Shop GCE 執行個體新增至非代管執行個體群組。
透過 Cloud Shell
gcloud compute instance-groups unmanaged add-instances juice-shop-group \
--zone=us-central1-c \
--instances=owasp-juice-shop-app
輸出內容
Updated [https://www.googleapis.com/compute/v1/projects/<project name>/zones/us-central1-c/instanceGroups/juice-shop-group].
將具名通訊埠設為 Juice Shop 應用程式使用的通訊埠。
透過 Cloud Shell
gcloud compute instance-groups unmanaged set-named-ports \ juice-shop-group \ --named-ports=http:3000 \ --zone=us-central1-c
輸出內容
Updated [https://www.googleapis.com/compute/v1/projects/<project name>/zones/us-central1-c/instanceGroups/juice-shop-group].
建立非代管執行個體群組後,接著來設定健康狀態檢查、後端服務、網址對應、目標 Proxy 和轉送規則。
設定 Cloud 負載平衡器元件:健康狀態檢查
為 Juice Shop 服務的通訊埠建立健康狀態檢查。
透過 Cloud Shell
gcloud compute health-checks create tcp tcp-port-3000 \
--port 3000
輸出內容
Created NAME PROTOCOL tcp-port-3000 TCP
設定 Cloud 負載平衡器元件:後端服務
建立後端服務參數。
透過 Cloud Shell
gcloud compute backend-services create juice-shop-backend \
--protocol HTTP \
--port-name http \
--health-checks tcp-port-3000 \
--enable-logging \
--global
輸出內容
NAME BACKENDS PROTOCOL juice-shop-backend HTTP
將 Juice Shop 執行個體群組新增至後端服務。
透過 Cloud Shell
gcloud compute backend-services add-backend juice-shop-backend \
--instance-group=juice-shop-group \
--instance-group-zone=us-central1-c \
--global
輸出內容
Updated [https://www.googleapis.com/compute/v1/projects/cythom-host1/global/backendServices/juice-shop-backend].
設定 Cloud 負載平衡器元件:網址對應
建立要傳送至後端的網址對應。
透過 Cloud Shell
gcloud compute url-maps create juice-shop-loadbalancer \
--default-service juice-shop-backend
輸出內容
NAME DEFAULT_SERVICE juice-shop-loadbalancer backendServices/juice-shop-backend
設定 Cloud 負載平衡器元件:目標 Proxy
建立目標 Proxy,做為網址對應的前端。
透過 Cloud Shell
gcloud compute target-http-proxies create juice-shop-proxy \
--url-map juice-shop-loadbalancer
輸出內容
NAME URL_MAP juice-shop-proxy juice-shop-loadbalancer
設定 Cloud 負載平衡器元件:轉送規則
為負載平衡器建立轉送規則。
透過 Cloud Shell
gcloud compute forwarding-rules create juice-shop-rule \
--global \
--target-http-proxy=juice-shop-proxy \
--ports=80
輸出內容
Created [https://www.googleapis.com/compute/v1/projects/cythom-host1/global/forwardingRules/juice-shop-rule].
確認 Juice Shop 服務已上線
透過 Cloud Shell
PUBLIC_SVC_IP="$(gcloud compute forwarding-rules describe juice-shop-rule --global --format="value(IPAddress)")"
透過 Cloud Shell
echo $PUBLIC_SVC_IP
輸出內容
<public VIP of service>
請稍候幾分鐘再繼續,否則可能會收到「HTTP/1.1 404 Not Found」回應。
透過 Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP
輸出內容
HTTP/1.1 200 OK <...>
您也可以前往瀏覽器查看 Juice Shop!

現在,您可以開始探索 Juice Shop 的安全漏洞,並瞭解如何使用 Cloud Armor WAF 規則集加以防範。
5. 模擬已知的安全漏洞攻擊
為節省時間,我們會透過幾個簡單步驟,比對 Cloud Armor WAF 規則生效前後的差異。
確認 LFI 安全漏洞存在:路徑遍歷
「本機檔案包含」(LFI) 是指利用「要求中缺乏輸入驗證機制」這個漏洞,查看伺服器上的檔案,試圖洩漏敏感資料。透過以下操作,您會發現確實可對 Juice Shop 進行路徑遍歷攻擊。請透過瀏覽器或 curl,確認應用程式目前使用的路徑。
透過 Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP/ftp
輸出內容
HTTP/1.1 200 OK <...>
此外,您也會發現路徑遍歷攻擊也會成功:
透過 Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP/ftp/../
輸出內容
HTTP/1.1 200 OK <...>
確認 RCE 安全漏洞存在
「遠端程式碼執行」(RCE) 攻擊包括各種 UNIX 和 Windows 指令注入情境,攻擊者能藉此執行通常只有特殊權限使用者才能使用的 OS 指令。以下示範如何傳入並執行簡單的 ls 指令。
透過 Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP/ftp?doc=/bin/ls
輸出內容
HTTP/1.1 200 OK <...>
您可以移除 curl 旗標,查看完整輸出內容。
確認可透過知名掃描工具存取
商用和開放原始碼工具會掃描應用程式,以達成各種目的,包括掃描安全漏洞。這些工具會使用廣為人知的 User-Agent 和其他標頭。確認 curl 指令使用知名的 User-Agent 標頭時,也能正常運作:
透過 Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP -H "User-Agent: blackwidow"
輸出內容
HTTP/1.1 200 OK <...>
模擬通訊協定攻擊:HTTP 分割
部分網頁應用程式會根據使用者輸入內容,產生回應標頭。如果應用程式未妥善過濾輸入內容,攻擊者可能會利用 %0d%0a 序列 (用於分隔不同行的 CRLF 序列) 來汙染輸入參數。因此,任何會剖析該回應的元件 (例如中介 Proxy 伺服器) 都可能將其解讀為兩個回應,並可能在後續要求中提供不實內容。請在輸入參數中插入 %0d%0a 序列,這可能會導致系統顯示誤導性頁面。
透過 Cloud Shell
curl -Ii "http://$PUBLIC_SVC_IP/index.html?foo=advanced%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2035%0d%0a%0d%0a<html>Sorry,%20System%20Down</html>"
輸出內容
HTTP/1.1 200 OK <...>
模擬工作階段固定攻擊
透過 Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP -H session_id=X
輸出內容
HTTP/1.1 200 OK <...>
6. 定義 Cloud Armor WAF 規則
列出預先設定的 WAF 規則:
透過 Cloud Shell
gcloud compute security-policies list-preconfigured-expression-sets
輸出內容
EXPRESSION_SET
Sqli-canary
RULE_ID
owasp-crs-v030001-id942110-sqli
owasp-crs-v030001-id942120-sqli
<...>
建立 Cloud Armor 安全性政策
在 Cloud Shell 執行以下指令:
gcloud compute security-policies create block-with-modsec-crs \
--description "Block with OWASP ModSecurity CRS"
更新安全性政策預設規則
請注意,預設規則的優先順序數值為 2147483647
在 Cloud Shell 執行以下指令:
gcloud compute security-policies rules update 2147483647 \
--security-policy block-with-modsec-crs \
--action "deny-403"
預設規則的動作設為「拒絕」,因此您必須允許從自己的 IP 發出的存取要求。請找出您的公開 IP (可使用 curl、ipmonkey、whatismyip 等工具查詢)。
在 Cloud Shell 執行以下指令:
MY_IP=$(curl ifconfig.me)
新增第一項規則,允許您 IP 的存取行為 (請在下方插入您的 IP)
在 Cloud Shell 執行以下指令:
gcloud compute security-policies rules create 10000 \
--security-policy block-with-modsec-crs \
--description "allow traffic from my IP" \
--src-ip-ranges "$MY_IP/32" \
--action "allow"
更新安全性政策,阻擋 LFI 攻擊
請套用 OWASP ModSecurity 核心規則集,防止攻擊者透過路徑遍歷發動本機檔案包含攻擊。
在 Cloud Shell 執行以下指令:
gcloud compute security-policies rules create 9000 \
--security-policy block-with-modsec-crs \
--description "block local file inclusion" \
--expression "evaluatePreconfiguredExpr('lfi-stable')" \
--action deny-403
更新安全性政策,阻擋遠端程式碼執行 (RCE) 攻擊
請根據 OWASP ModSecurity 核心規則集,套用偵測 RCE (包括指令注入) 的規則。系統會偵測並封鎖常見的 OS 指令。
在 Cloud Shell 執行以下指令:
gcloud compute security-policies rules create 9001 \
--security-policy block-with-modsec-crs \
--description "block rce attacks" \
--expression "evaluatePreconfiguredExpr('rce-stable')" \
--action deny-403
更新安全性政策,封鎖安全性掃描工具
請套用 OWASP ModSecurity 核心規則集,封鎖知名的安全性掃描工具、指令碼 HTTP 用戶端和網路檢索器。
在 Cloud Shell 執行以下指令:
gcloud compute security-policies rules create 9002 \
--security-policy block-with-modsec-crs \
--description "block scanners" \
--expression "evaluatePreconfiguredExpr('scannerdetection-stable')" \
--action deny-403
更新安全性政策,阻擋通訊協定攻擊
請根據 OWASP ModSecurity 核心規則集,套用規則來偵測回車字元 (CR) %0d 和換行字元 (LF) %0a,以及 HTTP 要求走私等其他類型的通訊協定攻擊。
在 Cloud Shell 執行以下指令:
gcloud compute security-policies rules create 9003 \
--security-policy block-with-modsec-crs \
--description "block protocol attacks" \
--expression "evaluatePreconfiguredExpr('protocolattack-stable')" \
--action deny-403
更新安全性政策,阻擋工作階段固定攻擊
請根據 OWASP ModSecurity 核心規則集,套用下列規則:
在 Cloud Shell 執行以下指令:
gcloud compute security-policies rules create 9004 \
--security-policy block-with-modsec-crs \
--description "block session fixation attacks" \
--expression "evaluatePreconfiguredExpr('sessionfixation-stable')" \
--action deny-403
將安全性政策附加至後端服務
在 Cloud Shell 執行以下指令:
gcloud compute backend-services update juice-shop-backend \
--security-policy block-with-modsec-crs \
--global
規則可能需要一些時間才會生效,但不會超過 10 分鐘。生效後,請在下一步測試前面找到的安全漏洞,確定系統確實強制執行 Cloud Armor WAF 規則。
7. 確認系統已設好採用 OWASP ModSecurity 核心規則集的 Cloud Armor 保護機制
確認 LFI 安全漏洞已獲得解決
透過 Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP/?a=../
輸出內容
HTTP/1.1 403 Forbidden <...>
確認系統可防範 RCE 攻擊
透過 Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP/ftp?doc=/bin/ls
輸出內容
HTTP/1.1 403 Forbidden <..>
確認系統能偵測到知名掃描工具
透過 Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP -H "User-Agent: blackwidow"
輸出內容
HTTP/1.1 403 Forbidden <..>
確認系統可抵擋通訊協定攻擊
根據 OWASP ModSecurity 核心規則集 3.0.2 版,可透過下列指令確認系統能防範通訊協定攻擊:
透過 Cloud Shell
curl -Ii "http://$PUBLIC_SVC_IP/index.html?foo=advanced%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2035%0d%0a%0d%0a<html>Sorry,%20System%20Down</html>"
輸出內容
HTTP/1.1 403 Forbidden <..>
確認系統會阻擋工作階段固定攻擊
透過 Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP/?session_id=a
輸出內容
HTTP/1.1 403 Forbidden <..>
8. 查看 Cloud Armor 安全性規則
建立安全性政策後,請查看已設定的規則。

系統會依優先順序評估規則:編號越小,優先順序越高。一旦觸發規則,系統就不會繼續處理編號較大的規則。
- 優先順序 9000:阻擋 LFI (本機檔案包含) 攻擊
- 優先順序 9001 - 阻擋 RCE (遠端程式碼執行/指令注入) 攻擊
- 優先順序 9002:封鎖偵測到的掃描工具
- 優先順序 9003 - 阻擋通訊協定攻擊,例如 HTTP 分割和 HTTP 走私
- 優先順序 9004:阻擋工作階段固定攻擊
- 優先順序 10000:允許您的 IP 存取網站
- 優先順序 Default - Deny。
*請注意,「允許您的 IP」規則的優先順序編號最大,這可讓您存取網站,同時確保系統仍能阻擋攻擊行為。
9. 查看 Cloud Armor 安全性政策記錄
在 Cloud Armor 控制台頁面,查看安全性政策的詳細資料,然後依序點選 Logs 分頁標籤和 View policy logs 連結,即可前往 Cloud Logging 頁面。系統會根據您感興趣的安全性政策自動進行過濾,例如:resource.type:(http_load_balancer) AND jsonPayload.enforcedSecurityPolicy.name:(block-with-modsec-crs)。觀察 403 錯誤回應代碼,展開記錄詳細資料,查看強制執行的安全性政策名稱、相符的欄位值,以及預先設定的運算式 ID (或簽章 ID)。以下螢幕截圖顯示本程式碼研究室已設定並強制執行的安全性政策記錄範例。
LFI 記錄

RCE 記錄

掃描工具偵測記錄

通訊協定攻擊記錄

工作階段固定攻擊記錄

10. 實驗室清理
完成實驗室後,請清理資源。
執行下列指令,刪除 Cloud Armor 安全性政策、負載平衡器、執行個體、防火牆規則和虛擬私有雲網路。
從後端服務移除 Cloud Armor 安全性政策
gcloud -q compute backend-services update juice-shop-backend --security-policy "" --global
刪除 Cloud Armor 安全性政策
刪除安全性政策時,系統會自動刪除相關聯的規則。
gcloud -q compute security-policies delete block-with-modsec-crs
刪除負載平衡器資源
要刪除的負載平衡器資源包括轉送規則、目標 HTTP Proxy、網址對應、後端、健康狀態檢查和執行個體群組。
gcloud -q compute forwarding-rules delete juice-shop-rule --global
gcloud -q compute target-http-proxies delete juice-shop-proxy
gcloud -q compute url-maps delete juice-shop-loadbalancer
gcloud -q compute backend-services delete juice-shop-backend \
--global
gcloud -q compute health-checks delete tcp-port-3000
gcloud -q compute instance-groups unmanaged delete juice-shop-group --zone=us-central1-c
刪除執行個體
gcloud -q compute instances delete owasp-juice-shop-app --zone us-central1-c
刪除防火牆規則、子網路和 VPC
gcloud -q compute firewall-rules delete allow-health-check gcloud -q compute firewall-rules delete allow-js-site gcloud -q compute networks subnets delete ca-lab-subnet --region us-central1 gcloud -q compute networks delete ca-lab-vpc
11. 恭喜!
恭喜完成 Cloud Armor 預先設定的 WAF 規則程式碼實驗室!
涵蓋內容
- 如何設定執行個體群組和全域 Cloud Load Balancer
- 如何設定 Cloud Armor 安全性政策,並在其中使用預先設定的 WAF 規則,防範 LFI、RCE、掃描工具、通訊協定和工作階段固定等攻擊
- 如何透過記錄驗證 Cloud Armor 是否成功抵禦部分 OWASP 前 10 大攻擊
後續步驟
- 使用 Cloud Armor 預先設定的 WAF 規則,防範 OWASP 前 10 大漏洞
- 根據機密程度微調規則
- 如要更具體地強制執行安全性,請參閱自訂規則語言參考資料。