Cloud Armor 預先設定的網路應用程式防火牆規則程式碼研究室

1. 簡介

你好!歡迎參加 Cloud Armor 預先設定的 WAF 規則 Codelab!

Google Cloud Armor 是 Google 的企業級邊緣網路安全解決方案,可提供 DDoS 防護、強制執行 WAF 規則,以及大規模自動調整式管理功能。

Cloud Armor 已擴充預先設定的 WAF 規則集,可防範 OWASP 前 10 大網頁應用程式安全漏洞。這些規則集以 OWASP Modsecurity 核心規則集 3.0.2 版為基礎,可防範一些最常見的網頁應用程式安全風險,包括本機檔案包含 (lfi)、遠端檔案包含 (rfi)、遠端程式碼執行 (rce) 等。

在本程式碼研究室中,您將瞭解如何使用 Google Cloud Armor WAF 規則,減輕一些常見的安全性弱點。

課程內容

  • 如何設定執行個體群組和全域負載平衡器來支援服務
  • 如何使用預先設定的 WAF 規則設定 Cloud Armor 安全性政策,防範 LFI、RCE、掃描器、通訊協定攻擊和會期固定攻擊
  • 如何透過觀察記錄檔,驗證 Cloud Armor 是否已減輕攻擊。

軟硬體需求

程式碼研究室拓撲和用途

119e13312f3cec25.jpeg

圖 1 - Cloud Armor 網路應用程式防火牆規則 Codelab 拓撲

OWASP Juice Shop 應用程式內含 OWASP 前 10 大安全漏洞的例項,因此非常適合用於安全訓練和意識提升。攻擊者可能會利用這項功能進行測試。在本程式碼研究室中,我們將使用這項工具示範一些應用程式攻擊,然後使用 Cloud Armor WAF 規則保護應用程式。應用程式前端會採用 Google Cloud 負載平衡器,並套用 Cloud Armor 安全性政策和規則。這項服務會透過公開網際網路提供,因此幾乎任何地方都能存取,並受到 Cloud Armor 和 VPC 防火牆規則保護。

2. 設定和需求

自修實驗室環境設定

  1. 登入 Cloud 控制台,建立新專案或重複使用現有專案。如果沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

請記住專案 ID,這是所有 Google Cloud 專案中不重複的名稱 (上述名稱已遭占用,因此不適用於您,抱歉!)。本程式碼研究室稍後會將其稱為 PROJECT_ID

  1. 接著,您必須在 Cloud 控制台中啟用帳單,才能使用 Google Cloud 資源。

完成本程式碼研究室的費用應該不高,甚至完全免費。請務必按照「清除」部分的指示操作,瞭解如何停用資源,避免在本教學課程結束後繼續產生帳單費用。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。

啟動 Cloud Shell

雖然可以透過筆電遠端操作 Google Cloud,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是可在雲端執行的指令列環境。

在 GCP 主控台,按一下右上角工具列的 Cloud Shell 圖示:

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.png

這部虛擬機器搭載各種您需要的開發工具,並提供永久的 5GB 主目錄,而且可在 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 存取測試應用程式網站的外部 IP,通訊埠為 3000。第二條防火牆規則用於允許來自負載平衡器來源 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 安全性挑戰。

透過 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!

428c18eee6708c28.png

我們現在要來探討 Juice Shop 的安全漏洞,以及如何使用 Cloud Armor WAF 規則集防範這些漏洞。

5. 展示已知安全漏洞

為節省時間,我們將以簡短的步驟,示範 Cloud Armor 網路應用程式防火牆規則傳播前後的狀態。

觀察 LFI 安全漏洞:路徑遍歷

本地檔案包含是指觀察伺服器上現有檔案的程序,方法是利用要求中缺少輸入驗證的漏洞,以利公開機密資料。以下僅顯示路徑遍歷是可行的。在瀏覽器中或使用 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 安全漏洞

遠端程式碼執行包括各種 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 規則:

透過 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 核心規則集,套用規則來尋找 Carriage Return (CR) %0d 和 Linefeed (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 安全性規則

我們已建立安全性政策,現在來看看設定了哪些規則。

d00e4102fc89e44f.png

系統會依優先順序評估規則:數字越小,評估的優先順序越高。一旦觸發規則,系統就不會繼續處理優先順序值較高的規則。

  • 優先順序 9000 - 封鎖 LFI (本機檔案包含)
  • 優先順序 9001 - 封鎖 RCE (遠端程式碼執行/指令注入)
  • 優先順序 9002 - 偵測到掃描器遭到封鎖
  • 優先順序 9003 - 封鎖通訊協定攻擊,例如 HTTP 分割和 HTTP 走私
  • 優先順序 9004 - 封鎖會期固定攻擊
  • 優先順序 10000 - 允許 IP 存取網站
  • 優先順序預設值 - 拒絕。

*請注意,「允許您的 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 記錄

983a6cab0cff940d.png

RCE 記錄

988a3a571f9d9d45.png

掃描器偵測記錄

7ed661863ba27555.png

通訊協定攻擊記錄

17ee3cbe0bd98939.png

工作階段固定記錄

80d1ddfd0fe982e1.png

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

刪除防火牆規則、子網路和虛擬私有雲

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
  • 如何使用預先設定的 WAF 規則設定 Cloud Armor 安全性政策,防範 LFI、RCE、掃描器、通訊協定攻擊和會期固定攻擊
  • 如何透過記錄驗證 Cloud Armor 已減輕部分 OWASP 前 10 大攻擊

後續步驟