透過 Google Cloud Armor 進行機器人管理 +;reCAPTCHA

1. 簡介

Google Cloud HTTP(S) 負載平衡服務會部署於全球 Google 服務點 (POP) 中的 Google 網路邊緣。導向至 HTTP(S) 負載平衡器的使用者流量會進入離使用者最近的 POP,接著透過 Google 的全球網路進行負載平衡,再傳至有足夠容量且距離最近的後端。

Cloud Armor 是 Google 的分散式阻斷服務和網頁應用程式防火牆 (WAF) 偵測系統。Cloud Armor 與 Google Cloud HTTP 負載平衡器緊密結合,可以保護 Google Cloud 客戶的應用程式不受網際網路攻擊。reCAPTCHA Enterprise 服務以現有的 reCAPTCHA API 為基礎,可透過進階風險分析技術分辨人類和機器人,進而避免網站受到垃圾內容和濫用行為的侵擾。Cloud Armor Bot Management 提供端對端解決方案,整合 reCAPTCHA Enterprise 機器人偵測功能,並與網路邊緣 Cloud Armor 的強制執行作業評分,藉此保護下游應用程式。

在本研究室中,您將設定後端的 HTTP 負載平衡器,如下圖所示。接著,您將瞭解如何設定 reCAPTCHA 工作階段權杖網站金鑰,並將其嵌入網站中。您也會學習如何設定重新導向 reCAPTCHA Enterprise 手動驗證問題。接著,我們會設定 Cloud Armor 機器人管理政策,展示機器人偵測功能如何防止應用程式受到惡意機器人流量的侵擾。

8b46e6728996bc0c.png

課程內容

  • 如何設定具備適當健康狀態檢查的 HTTP 負載平衡器。
  • 如何建立 reCAPTCHA 網路應用程式防火牆驗證頁面網站金鑰,並將其與 Cloud Armor 安全性政策建立關聯。
  • 如何建立 reCAPTCHA 工作階段權杖網站金鑰,並將其安裝到網頁上。
  • 如何建立 Cloud Armor 機器人管理政策。
  • 如何驗證機器人管理政策是否根據設定的規則處理流量。

軟硬體需求

  • 基本網路與 HTTP 知識
  • 基本的 Unix/Linux 指令列知識

2. 設定和需求

自修環境設定

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 不使用的字元字串,您可以隨時更新。
  • 所有 Google Cloud 專案的專案 ID 均不得重複,且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常稱為 PROJECT_ID),因此如果您不喜歡的話,請隨機產生一個,或者,您也可以自行嘗試看看是否可用。是「凍結」建立專案後
  • 還有第三個值,也就是部分 API 使用的專案編號。如要進一步瞭解這三個值,請參閱說明文件
  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行這個程式碼研究室並不會產生任何費用,如果有的話。如要關閉資源,以免產生本教學課程結束後產生的費用,請按照任「清除所用資源」操作請參閱本程式碼研究室結尾處的操作說明。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。

啟動 Cloud Shell

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

在 GCP 控制台的右上方,按一下「Cloud Shell」圖示:

55efc1aaa7a4d3ad.png

佈建並連線至環境的作業只需幾分鐘的時間。完成後,您應該會看到類似下方的內容:

7ffe5cbb04455448.png

這部虛擬機器都裝載了您需要的所有開發工具。提供永久的 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
gcloud services enable recaptchaenterprise.googleapis.com

3. 設定防火牆規則,允許 HTTP 和 SSH 流量傳送至後端

設定防火牆規則,允許從 Google Cloud 健康狀態檢查和負載平衡器傳出的 HTTP 流量到後端。此外,請設定防火牆規則,允許透過 SSH 登入執行個體。

我們會使用您在專案中建立的 default 虛擬私有雲網路。建立防火牆規則,允許 HTTP 流量傳送至後端。健康狀態檢查會判斷負載平衡器的哪些執行個體能接收新的連線。以 HTTP 負載平衡來說,對達到負載平衡的執行個體所執行的健康狀態檢查探測,是從位址範圍 130.211.0.0/22 和 35.191.0.0/16 傳出。虛擬私有雲防火牆規則必須允許這類連線。此外,負載平衡器也會與相同 IP 範圍的後端通訊。

  1. 前往 Cloud 控制台中的「導覽選單」 ( mainmenu.png) >「虛擬私有雲網路」>防火牆

131fb495c9242335.png

  1. 請留意現有的 ICMPinternalRDPSSH 防火牆規則。每個 Google Cloud 專案的開頭都是 default 網路和這些防火牆規則。
  2. 按一下「建立防火牆規則」
  3. 設定下方的值,其他屬性均保留預設值:

屬性

值 (依指示輸入值或選取選項)

名稱

default-allow-health-check

網路

預設

目標

指定的目標標記

目標標記

allow-health-check

來源篩選器

IP 範圍

來源 IP 範圍

130.211.0.0/22、35.191.0.0/16

通訊協定和通訊埠

指定的通訊協定和通訊埠,然後勾選 tcp。輸入 80 做為通訊埠號碼

  1. 按一下「建立」

或者,如果您使用的是 gcloud 指令列,指令如下:

gcloud compute firewall-rules create default-allow-health-check --direction=INGRESS --priority=1000 --network=default --action=ALLOW --rules=tcp:80 --source-ranges=130.211.0.0/22,35.191.0.0/16 --target-tags=allow-health-check
  1. 同樣地,請建立防火牆規則,允許透過 SSH 連線至執行個體。
gcloud compute firewall-rules create allow-ssh --direction=INGRESS --priority=1000 --network=default --action=ALLOW --rules=tcp:22 --source-ranges=0.0.0.0/0 --target-tags=allow-health-check

4. 設定執行個體範本和建立代管執行個體群組

代管執行個體群組會使用執行個體範本,以建立相同執行個體的群組。請使用這些範本建立 HTTP 負載平衡器的後端。

設定執行個體範本

執行個體範本是一種資源,可用來建立 VM 執行個體和代管執行個體群組。執行個體範本會定義機器類型、開機磁碟映像檔、子網路、標籤和其他執行個體屬性。按照下方指示建立執行個體範本。

  1. 前往 Cloud 控制台中的「導覽選單」 ( mainmenu.png) >Compute Engine >執行個體範本,然後點選「建立執行個體範本」
  2. 在「名稱」部分輸入 lb-backend-template
  3. 為「系列」選取 N1
  4. 點選「網路、磁碟、安全性、管理、單一用戶群」

1d0b7122f4bb410d.png

  1. 前往「管理」部分,將下列指令碼插入「開機指令碼」欄位。
#! /bin/bash
sudo apt-get update
sudo apt-get install apache2 -y
sudo a2ensite default-ssl
sudo a2enmod ssl
sudo vm_hostname="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/name)"
sudo echo "Page served from: $vm_hostname" | \
tee /var/www/html/index.html
  1. 按一下「網路」分頁標籤,新增網路標記:allow-health-check
  2. 依據下方的值進行設定,其他設定均保留預設值:

屬性

值 (依指示輸入值或選取選項)

網路 (在「網路介面」下方)

預設

子網路 (在「網路介面」下方)

預設 (us-east1)

網路標記

allow-health-check

  1. 按一下「建立」
  2. 等待執行個體範本建立完成。

建立代管執行個體群組

  1. 同樣在「Compute Engine」頁面,按一下左選單中的「執行個體群組」

ed419061ad2b982c.png

  1. 按一下「建立執行個體群組」。選取「新增代管執行個體群組 (無狀態)」
  2. 設定下方的值,其他屬性均保留預設值:

屬性

值 (依指示輸入值或選取選項)

名稱

lb-backend-example

位置

單一可用區

區域

us-east1

可用區

us-east1-b

執行個體範本

lb-backend-template

自動調度資源

不啟用自動調度資源功能

執行個體數量

1

  1. 按一下「建立」

將已命名的通訊埠新增至執行個體群組

針對執行個體群組定義 HTTP 服務,並將通訊埠名稱對應至相關通訊埠。負載平衡服務會將流量轉送至已命名的通訊埠。

gcloud compute instance-groups set-named-ports lb-backend-example \
    --named-ports http:80 \
    --zone us-east1-b

5. 設定 HTTP 負載平衡器

設定 HTTP 負載平衡器,將流量傳送至後端 lb-backend-example:

開始設定

  1. 在 Cloud 控制台中,按一下「導覽選單」圖示 ( mainmenu.png) >按一下「網路服務」>負載平衡,然後點選「建立負載平衡器」
  2. 在「HTTP(S) Load Balancing」(HTTP(S) 負載平衡) 下方,按一下「Start configuration」(啟動設定)

4f8b8cb10347ecec.png

  1. 選取「從網際網路到我的 VM」、「傳統 HTTP(S) 負載平衡器」,然後按一下「繼續」
  2. 將「Name」(名稱) 設為 http-lb。

設定後端

後端服務會將傳入流量導向至一或多個連接的後端。每個後端都含有執行個體群組,以及其他負載能力中繼資料。

  1. 點選「後端設定」
  2. 在「後端服務和後端值區」部分,點選「建立後端服務」
  3. 設定下方的值,其他屬性均保留預設值:

屬性

值 (依指示選取選項)

名稱

http-backend

通訊協定

HTTP

已命名通訊埠

htp

執行個體群組

lb-backend-example

通訊埠編號

80

  1. 按一下 [完成]。
  2. 點選「Add backend」
  3. 在「健康狀態檢查」部分,選取「建立健康狀態檢查」

168a9ba1062b1f45.png

  1. 設定下方的值,其他屬性均保留預設值:

屬性

值 (依指示選取選項)

名稱

http-health-check

通訊協定

TCP

通訊埠

80

dc45bc726bb4dfad.png

  1. 按一下 [儲存]
  2. 勾選「啟用記錄功能」方塊。
  3. 將「取樣率」設為 1:

c8f884fa4a8cd50.png

  1. 點選「建立」即可建立後端服務。

1fd2ad21b1d32a95.png

設定前端

主機與路徑規則會決定流量的導向方式。舉例來說,您可以將影片流量導向至其中一個後端,並將靜態內容流量導向至另一個後端。不過,您不會在本研究室中設定主機和路徑規則。

  1. 點選「前端設定」
  2. 指定下方的值,其他屬性均保留預設值:

屬性

值 (依指示輸入值或選取選項)

通訊協定

HTTP

IP 版本

IPv4

IP 位址

臨時

通訊埠

80

  1. 按一下 [完成]。

檢查並建立 HTTP 負載平衡器

  1. 點選「檢查並完成」

478e5e51057af3a3.png

  1. 檢查「後端服務」和「前端」
  2. 點選「建立」
  3. 等待負載平衡器建立完成。
  4. 按一下負載平衡器的名稱 (http-lb)。
  5. 請注意負載平衡器的 IPv4 位址,用於下一項工作。我們稱之為 [LB_IP_v4]。

6. 測試 HTTP 負載平衡器

您已為後端建立 HTTP 負載平衡器,請確認流量是否轉送至後端服務。在瀏覽器中開啟新分頁並前往 http://[LB_IP_v4],測試能否透過 IPv4 存取 HTTP 負載平衡器。請務必以負載平衡器的 IPv4 位址取代 [LB_IP_v4]。

7. 建立及部署 reCAPTCHA 工作階段權杖和驗證頁面網站金鑰

reCAPTCHA Enterprise for WAF 和 Google Cloud Armor 整合功能提供下列功能:reCAPTCHA 驗證頁面reCAPTCHA 動作符記reCAPTCHA 工作階段符記。在本程式碼研究室中,我們會導入 reCATCHA 工作階段權杖網站金鑰和 reCAPTCHA WAF 驗證頁面網站。

建立 reCAPTCHA 工作階段權杖和 網路應用程式防火牆驗證網頁金鑰

建立工作階段權杖網站金鑰和驗證頁面網站金鑰前,請確認您已啟用 reCAPTCHA Enterprise API,如「啟用 API」所示。

評估完成後,reCAPTCHA JavaScript 會將 reCAPTCHA 工作階段符記設為使用者瀏覽器中的 Cookie。只要 reCAPTCHA JavaScript 仍處於活動狀態,使用者的瀏覽器就會附加 Cookie 並重新整理 Cookie。

  1. 建立 reCAPTCHA 工作階段權杖網站金鑰,並為金鑰啟用網路應用程式防火牆功能。我們也會將網路應用程式防火牆服務設為 Cloud Armor,以啟用 Cloud Armor 整合功能。
gcloud recaptcha keys create --display-name=test-key-name \
   --web --allow-all-domains --integration-type=score --testing-score=0.5 \
   --waf-feature=session-token --waf-service=ca
  1. 上述指令的輸出內容提供建立的金鑰。請記下這項資訊,我們會在下一個步驟中將其加入您的網站。
  2. 建立 reCAPTCHA WAF 驗證頁面網站金鑰,並為金鑰啟用網路應用程式防火牆功能。您可以使用 reCAPTCHA 驗證頁面功能將傳入要求重新導向至 reCAPTCHA Enterprise,藉此判斷每項要求都是詐欺或正當要求。之後我們會將這組金鑰與 Cloud Armor 安全性政策建立關聯,以啟用手動驗證。在後續步驟中,我們會把這組金鑰稱為「挑戰」。
gcloud recaptcha keys create --display-name=challenge-page-key \
   --web --allow-all-domains --integration-type=INVISIBLE \
   --waf-feature=challenge-page --waf-service=ca
  1. 前往「導覽選單」 ( mainmenu.png) >安全性 >reCAPTCHA Enterprise您應該會在「Enterprise Keys」下方看到您建立的金鑰:

4e2567aae0eb92d7.png

導入 reCAPTCHA 工作階段權杖網站金鑰

  1. 前往「導覽選單」 ( mainmenu.png) >Compute Engine >VM 執行個體。在執行個體群組中找到 VM,並透過 SSH 連線至該 VM。

6d7b0fd12a667b5f.png

  1. 前往網路伺服器根目錄,然後將使用者變更為根目錄。
@lb-backend-example-4wmn:~$ cd /var/www/html/
@lb-backend-example-4wmn:/var/www/html$ sudo su
  1. 更新 click index.html 網頁,並嵌入 reCAPTCHA 工作階段權杖網站金鑰。工作階段符記網站金鑰的設定是在到達網頁的 head 區段設定,如下所示:

<script src="https://www.google.com/recaptcha/enterprise.js?render=&lt;REPLACE_TOKEN_HERE&gt;&waf=sessionasync defer&gt;&lt;/script&gt;

請記得在更新 index.html 檔案前更換憑證,如下圖所示:

root@lb-backend-example-4wmn:/var/www/html# echo '<!doctype html><html><head><title>ReCAPTCHA Session Token</title><script src="https://www.google.com/recaptcha/enterprise.js?render=<REPLACE_TOKEN_HERE>&waf=session" async defer></script></head><body><h1>Main Page</h1><p><a href="/good-score.html">Visit allowed link</a></p><p><a href="/bad-score.html">Visit blocked link</a></p><p><a href="/median-score.html">Visit redirect link</a></p></body></html>' > index.html
  1. 建立另外三個範例網頁,測試機器人管理政策:
  • good-score.html
root@lb-backend-example-4wmn:/var/www/html# echo '<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1252"></head><body><h1>Congrats! You have a good score!!</h1></body></html>' > good-score.html
  • bad-score.html
root@lb-backend-example-4wmn:/var/www/html# echo '<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1252"></head><body><h1>Sorry, You have a bad score!</h1></body></html>' > bad-score.html
  • median-score.html
root@lb-backend-example-4wmn:/var/www/html# echo '<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1252"></head><body><h1>You have a median score that we need a second verification.</h1></body></html>' > median-score.html
  1. 在瀏覽器中開啟網頁,驗證您可以存取所有網頁。請務必以負載平衡器的 IPv4 位址取代 [LB_IP_v4]。
  • 開啟 http://[LB_IP_v4]/index.html。看到「由 reCAPTCHA 保護」時,您就能驗證 reCAPTCHA 實作作業是否正常運作。

d695ad23d91ae4e9.png

  • 點進各個連結。

4a2ad1b2f10b4c86.png

  • 確認您能夠存取所有網頁。

481f63bf5e6f244.png

8. 為機器人管理建立 Cloud Armor 安全性政策規則

在本節中,您將使用 Cloud Armor 機器人管理規則,依據 reCAPTCHA 分數允許、拒絕及重新導向要求。請記住,當您建立工作階段符記網站金鑰時,將測試分數設為 0.5。

  1. 開啟 Cloud Shell(請參閱「設定與需求」下方的「啟動 Cloud Shell」一節,瞭解如何使用 Cloud Shell),然後透過 gcloud 建立安全性政策:
gcloud compute security-policies create recaptcha-policy \
    --description "policy for bot management"
  1. 如要使用 reCAPTCHA Enterprise 手動驗證來區分真人和自動用戶端,請將我們為手動驗證機制建立的 reCAPTCHA 網路應用程式驗證網站金鑰,與安全性政策建立關聯。取代「CHALLENGE-PAGE-KEY」連結至先前建立的金鑰
gcloud compute security-policies update recaptcha-policy \
   --recaptcha-redirect-site-key "CHALLENGE-PAGE-KEY"
  1. 新增機器人管理規則,允許網址路徑與 good-score.html 相符,且分數大於 0.4 時允許流量。
gcloud compute security-policies rules create 2000 \
     --security-policy recaptcha-policy\
     --expression "request.path.matches('good-score.html') &&    token.recaptcha_session.score > 0.4"\
     --action allow
  1. 新增機器人管理規則,在網址路徑符合 bad-score.html 且分數低於 0.6 時,拒絕流量。
  gcloud compute security-policies rules create 3000 \
     --security-policy recaptcha-policy\
     --expression "request.path.matches('bad-score.html') && token.recaptcha_session.score < 0.6"\
     --action "deny-403"
  1. 新增機器人管理規則,在網址路徑與 median-score.html 相符,且分數等於 0.5 時,將流量重新導向至 Google reCAPTCHA
  gcloud compute security-policies rules create 1000 \
     --security-policy recaptcha-policy\
     --expression "request.path.matches('median-score.html') && token.recaptcha_session.score == 0.5"\
     --action redirect \
     --redirect-type google-recaptcha
  1. 將安全性政策附加至後端服務 http-backend:
gcloud compute backend-services update http-backend \
    --security-policy recaptcha-policy –-global
  1. 在控制台中前往「導覽選單」>「Network Security」(網路安全性) >Cloud Armor
  2. 按一下「recaptcha-policy」。政策應會如下所示:

74852618aaa96786.png

9. 透過 Cloud Armor 驗證機器人管理機制

  1. 開啟瀏覽器並輸入以下網址:http://[LB_IP_v4]/index.html。前往「前往許可清單連結」。應該要能在 - 前允許

edf3e6ca238d2ee7.png

  1. 以無痕模式開啟新視窗,確保我們能啟動新的工作階段。輸入網址 http://[LB_IP_v4]/index.html,然後前往「造訪遭封鎖的連結」頁面。您應該會收到 HTTP 403 錯誤。

ecef5655b291dbb0.png

  1. 以無痕模式開啟新視窗,確保我們能啟動新的工作階段。輸入網址 http://[LB_IP_v4]/index.html,然後前往 [造訪重新導向連結]。您應該會看到重新導向至 Google reCAPTCHA 和手動驗證頁面,如下所示:

53ed2b4067b55436.png

驗證 Cloud Armor 記錄

查看安全性政策記錄,驗證機器人管理作業是否正常運作。

  1. 在控制台中前往「導覽選單」Network Security >Cloud Armor
  2. 按一下「recaptcha-policy」
  3. 按一下「Logs」(記錄檔)

46fd825d8506d355.png

  1. 點選「查看政策記錄檔」
  2. 以下是 MQL(監控查詢語言) 查詢,您可以複製並貼到查詢編輯工具中:
resource.type:(http_load_balancer) AND jsonPayload.enforcedSecurityPolicy.name:(recaptcha-policy)
  1. 現在點選「執行查詢」
  2. 在查詢結果中找出要求為 http://[LB_IP_v4]/good-score.html 的記錄項目。展開 jsonPayload.ExpandEnforceSecurityPolicy。

b7b1712642cf092b.png

  1. 對 http://[LB_IP_v4]/bad-score.html 和 http://[LB_IP_v4]/median-score.html 重複相同步驟

c28f96d83056725a.png

8c4803d75a77142c.png

請注意,SetAction 設為 ALLOW、DENY 或 GOOGLE_RECAPTCHA,名稱則為 recaptcha-policy

恭喜!您已完成這個「Bot Management 與 Cloud Armor」的研究室

©2020 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。

10. 清理研究室

  1. 瀏覽至 [網路安全性] >>。Cloud Armor >>%POLICY NAME%並選取「刪除」-

2646f9c1df093f90.png

  1. 前往「網路」>「>」網路服務 >>負載平衡選取您建立的負載平衡器,然後按一下「刪除」。

8ad4f55dc06513f7.png

選擇後端服務和健康狀態檢查做為其他資源:

f6f02bb56add6420.png

  1. 前往「導覽選單」 ( mainmenu.png) >Compute Engine >執行個體群組。選取代管執行個體群組,然後按一下「刪除」

2116b286954fd6.png

如要確認刪除,請輸入「delete」文字框中。

等待代管執行個體群組刪除完成。這麼做也會刪除群組中的執行個體。您必須先刪除執行個體群組,才能刪除範本。

  1. 前往左側窗格**的「執行個體範本」。**選取執行個體範本,然後按一下「刪除」。
  2. 前往「導覽選單」 ( mainmenu.png) >「虛擬私有雲網路」>防火牆。選取 default-allow-health-check 和 allow-ssh 規則,再按一下「刪除」。
  3. 前往「導覽選單」 ( mainmenu.png) >安全性 >reCAPTCHA Enterprise選取並刪除我們建立的金鑰。如要確認刪除,請輸入「DELETE」文字框中。

e71ecd11baf262ca.png

11. 恭喜!

您已成功透過 Cloud Armor 導入機器人管理機制。您設定了 HTTP 負載平衡器。接著,您在網頁上建立並導入 reCAPTCHA 工作階段權杖網站金鑰。您也學到如何建立驗證頁面網站金鑰。您設定了 Cloud Armor 機器人管理政策,並確認政策依據規則處理要求的方式。您可以瀏覽安全性政策記錄,找出允許、封鎖或重新導向流量的原因。

涵蓋內容

  • 如何設定執行個體範本和建立代管執行個體群組。
  • 如何設定 HTTP 負載平衡器。
  • 如何建立 Cloud Armor 機器人管理政策。
  • 如何建立及導入 reCAPTCHA 工作階段權杖網站金鑰。
  • 如何建立及導入 reCAPTCHA 驗證頁面網站金鑰。
  • 如何驗證機器人管理政策正常運作。

後續步驟

  • 請嘗試設定 reCAPTCHA 動作權杖。