1. 簡介
你好!歡迎來到 Cloud Armor 預先設定的網路應用程式防火牆規則程式碼研究室!
Google Cloud Armor 是 Google 的企業邊緣網路安全性解決方案,可大規模提供分散式阻斷服務攻擊、實行網路應用程式防火牆規則,並能彈性調整管理方式。
Cloud Armor 已擴充預先設定的網路應用程式防火牆規則集,以防範 OWASP 十大網頁應用程式安全漏洞。規則集是以 OWASP Modsecurity 核心規則集 3.0.2 版為基礎,可防範一些最常見的網頁應用程式安全性風險,包括本機檔案 (lfi)、遠端檔案納入 (rfi)、遠端程式碼執行 (rce) 等等。
在本程式碼研究室中,您將瞭解如何使用 Google Cloud Armor 網路應用程式防火牆規則,降低一些常見的安全漏洞。
課程內容
- 如何設定執行個體群組和全域負載平衡器來支援服務
- 如何使用預先設定的網路應用程式防火牆規則來設定 Cloud Armor 安全性政策,以防範 lfi、Rce、掃描器、通訊協定攻擊和工作階段修正
- 如何觀察記錄檔,驗證 Cloud Armor 是否可緩解攻擊。
軟硬體需求
- Google Compute Engine 的基本知識 ( 程式碼研究室)
- 基本的網路和 TCP/IP 知識
- 基本的 Unix/Linux 指令列知識
- 建議您先透過 Google Cloud 中的網路功能完成 GCP 網路導覽,
- (選用) 完成 Cloudnet20 Cloud Armor 研究室,瞭解如何利用 SQL 插入、IP 型與地理位置規則保護工作負載。
程式碼研究室拓撲與用途
圖 1 - Cloud Armor 網路應用程式防火牆規則程式碼研究室拓撲
OWASP Juice Shop 應用程式可提供安全性訓練和感知能力,因為在設計上包含了 OWASP 前 10 大安全漏洞的執行個體。攻擊者可能會利用這個漏洞進行測試。在本程式碼研究室中,我們會以此示範應用程式攻擊,隨後使用 Cloud Armor 網路應用程式防火牆規則來保護應用程式。應用程式會顯示在 Google Cloud 負載平衡器的前方,並套用 Cloud Armor 安全性政策和規則。這項服務會在公開的網際網路上提供,因此幾乎從任何位置都能連上,並受到 Cloud Armor 和虛擬私有雲防火牆規則保護。
2. 設定和需求
自修環境設定
提醒您,專案 ID 是所有 Google Cloud 專案的專屬名稱 (已經有人使用上述名稱,很抱歉對您不符!)。稍後在本程式碼研究室中會稱為 PROJECT_ID
。
- 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Google Cloud 資源。
執行這個程式碼研究室並不會產生任何費用,如果有的話。請務必依照「清除所用資源」一節指示本節將說明如何關閉資源,這樣您就不會產生本教學課程結束後產生的費用。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。
啟動 Cloud Shell
雖然 Google Cloud 可以從筆記型電腦遠端操作,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是一種在 Cloud 中執行的指令列環境。
在 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 安全性驗證。
透過 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].
確認果汁商店服務已連上網路
透過 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 找不到」回應。
透過 Cloud Shell
curl -Ii http://$PUBLIC_SVC_IP
輸出
HTTP/1.1 200 OK <...>
你也可以使用瀏覽器來瀏覽果汁店!
我們已經準備好探討 Juice Shop 的安全漏洞,以及如何運用 Cloud Armor 網頁應用程式防火牆規則組合防範這些安全漏洞。
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 標記,查看完整輸出內容。
觀察知名掃描器的出入途徑
商業用途和開放原始碼掃描應用程式用途各種用途,包括掃描安全漏洞。這些工具採用已知的使用者代理程式和其他標頭。Observe curl 可與已知的使用者代理程式標頭搭配使用:
透過 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 網路應用程式防火牆規則
列出預先設定的網路應用程式防火牆規則:
透過 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 存取 (INSERT YOUR IP BELOW)
透過 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 和 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 網路應用程式防火牆規則。
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 核心規則集 ver.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 安全性規則
現在,我們建立了安全性政策,接著來看看目前設定了哪些規則。
系統會依優先順序評估規則:數字越小,越先評估,一旦觸發,優先順序值較高的規則就不會繼續處理。
- Priority 9000 - 封鎖 LFI (包含本機檔案)
- 優先順序 9001 - 封鎖 RCE (遠端程式碼執行/指令插入)
- 優先順序 9002 - 偵測到封鎖掃描器
- 優先順序 9003 - 封鎖通訊協定攻擊,例如 HTTP 分割和 HTTP 走動
- 優先順序 9004 - 封鎖工作階段修正攻擊
- Priority 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 記錄
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
刪除負載平衡器資源
要刪除的負載平衡器資源包括轉送規則、 target-http-proxies、url-maps、後端、健康狀態檢查和執行個體群組。
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 預先設定的網路應用程式防火牆規則程式碼研究室!
涵蓋內容
- 如何設定執行個體群組和全域 Cloud 負載平衡器
- 如何使用預先設定的網路應用程式防火牆規則來設定 Cloud Armor 安全性政策,以防範 lfi、Rce、掃描器、通訊協定攻擊和工作階段修正
- 如何驗證 Cloud Armor 是否透過記錄檔降低部分 OWASP 前 10 大攻擊的影響
後續步驟
- 透過 Cloud Armor 預先設定的網路應用程式防火牆規則,保護應用程式免受 OWASP 前 10 大安全漏洞侵擾
- 根據靈敏度等級微調規則
- 您可以使用自訂規則語言參考資料,對安全性進行更具體的違規處置。