使用 Cloud Armor 防禦邊緣快取

1. 簡介

Google Cloud Armor 邊緣安全性政策可讓您限制存取 Google Cloud CDN 和 Google Cloud Storage 中的快取物件。採取這種做法有很多原因,包括:確保使用者無法從受限制的地理位置存取 Storage bucket 中的物件,或是確認媒體發布系統僅限在您擁有授權的位置放送內容。

在本實驗室中,我們將建立 GCS bucket、將圖片上傳至 bucket、將 bucket 繫結至負載平衡器,然後為 bucket 啟用 Cloud CDN 和邊緣安全性政策。

課程內容

  • 如何設定 Cloud Storage bucket 並上傳可快取的內容
  • 如何建立邊緣安全性政策來保護內容
  • 如何確認邊緣安全性政策運作正常

軟硬體需求

  • 具備基本網路和 HTTP 知識
  • 基本的 Unix/Linux 指令列知識

2. 設定和需求條件

自修實驗室環境設定

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

96a9c957bc475304.pngb9a10ebdf5b5a448.pnga1e3c01a38fa61c2.png

  • 專案名稱是這個專案參與者的顯示名稱。這是 Google API 未使用的字元字串,您隨時可以更新。
  • 專案 ID 在所有 Google Cloud 專案中不得重複,且設定後即無法變更。Cloud 控制台會自動產生專屬字串,通常您不需要理會該字串。在大多數程式碼研究室中,您需要參照專案 ID (通常會標示為 PROJECT_ID),因此如果您不喜歡該字串,可以產生另一個隨機字串,或是嘗試使用自己的字串,看看是否可用。專案建立後,系統就會「凍結」這項設定。
  • 還有第三個值,也就是部分 API 使用的「專案編號」。如要進一步瞭解這三種值,請參閱說明文件。
  1. 接著,您需要在 Cloud 控制台中啟用帳單,才能使用 Cloud 資源/API。完成本程式碼研究室的費用應該不高,甚至完全免費。如要停用資源,避免在本教學課程結束後繼續產生帳單費用,請按照程式碼研究室結尾的「清除」操作說明操作。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。

啟動 Cloud Shell

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

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

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.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

3. 建立 Cloud Storage bucket

在 Cloud 控制台中,依序前往「導覽選單」 >「Cloud Storage」 >「瀏覽器」。按一下「建立值區」:

baf3d3c74282ecba.png

bucket 命名規則:

  • bucket 命名空間全域通用且會公開顯示,因此請勿在 bucket 名稱中加入敏感資訊。
  • bucket 名稱只能使用小寫英文字母、數字、破折號 (-)、底線 (_) 與半形句號 (.)。如果名稱含有半形句號,則須通過驗證。
  • bucket 名稱的開頭與結尾必須是數字或英文字母。
  • bucket 名稱長度須介於 3 至 63 個字元。如果名稱包含英文句號,則其長度上限為 222 個字元,但每段以英文句號隔開的部分不得超過 63 個字元。
  • bucket 名稱不得為採用點分十進位標記法的 IP 位址,例如 192.168.5.4。
  • bucket 名稱不得以「goog」開頭。
  • bucket 名稱不得包含「google」,或是近似「google」的錯別字。
  • 另外,為符合 DNS 規範並維持日後的相容性,請勿使用底線 (_),也不要在半形句號或破折號的前後使用半形句號。舉例來說,DNS 名稱中不得使用「..」、「-.」或「.-」。

點選「繼續」。

位置類型:區域

位置:選擇距離您很遠的地區

點選「繼續」。

預設儲存空間級別:Standard

點選「繼續」。

取消勾選 「禁止公開存取」底下的「強制禁止公開存取這個 bucket」核取方塊。

在「存取控管」下方選擇「精細」。

點選「繼續」。

設定好 bucket 後,請按一下「CREATE」:

至此您已成功建立 Cloud Storage bucket!

4. 將物件上傳至 bucket

現在請將物件上傳至 bucket。

首先,請將這張圖片下載至 Cloud Shell 的暫時執行個體。以下範例使用 Google 首頁的 Google 圖片。

透過 Cloud Shell

wget --output-document google.png https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png

使用 gsutil cp 指令,將圖片從儲存位置上傳至您建立的 bucket:

透過 Cloud Shell

gsutil cp google.png gs://YOUR-BUCKET-NAME

現在請將下載的圖片移除:

透過 Cloud Shell

rm google.png

找到物件,點選右側的三點圖示,然後將權限設為公開。

821aad82d8633922.png30a975d3ad22d33d.png

5. 建立負載平衡器

接著,我們將建立 HTTP 負載平衡器。

依序前往「Networking」(網路) >>「Network services」(網路服務) >>「Load Balancing」(負載平衡) >>「Create Load Balancer」(建立負載平衡器) >>「HTTP Load Balancer」(HTTP 負載平衡器) >>「Internet to my VMs」(從網際網路連線至我的 VM) >>「Classic HTTP(S) Load Balancer」(傳統版 HTTP(S) 負載平衡器)

首先,請為要建立的負載平衡器命名。

建立後端 bucket

建立新的後端 bucket (即您剛建立的 bucket),然後選取「啟用 CDN」和「快取靜態內容」。按一下「建立」。

ed392a56538d499e.png

建立主機與路徑規則

前往左側的「主機與路徑規則」。我們會使用簡易型主機/路徑規則,將所有要求傳送至 bucket。

7c1a664e0d1f15b0.png

建立前端設定

選取前端設定。前端設定請使用 HTTP (若有憑證,也能使用 HTTPS) 和暫時性 IP 位址,並確保已選取進階級網路。

2597a5e63d618622.png

點選 [建立]

取得負載平衡器 IP

在專案的負載平衡器清單中,按一下負載平衡器名稱,即可透過控制台取得負載平衡器 IP。

9b757362d806e835.png

對負載平衡器執行查詢

請在幾分鐘後查詢負載平衡器,確認上傳的物件。您需要提供負載平衡器的 IP 位址和映像檔名稱。指令結構如下:

出發航廈

curl -svo /dev/null http://LOAD_BALANCER_IP/google.png

輸出內容

armanrye-macbookpro% curl -svo /dev/null http://34.98.81.123/google.png
*   Trying 34.98.81.123...
* TCP_NODELAY set
* Connected to 34.98.81.123 (34.98.81.123) port 80 (#0)
> GET /google.png HTTP/1.1
> Host: YOUR_IP
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< X-GUploader-UploadID: ADPycdtoILI76KVsvBvdVGvSfzaxys1m3zYqCepBrmJxAI48ni24cWCRIdNu-53PX3DS6iycxp6xwFbMpwtcHHZQUQmEBxAgng
< Expires: Mon, 13 Dec 2021 22:58:26 GMT
< Date: Mon, 13 Dec 2021 21:58:26 GMT
< Cache-Control: public, max-age=3600
< Last-Modified: Mon, 13 Dec 2021 21:45:57 GMT
< ETag: "8f9327db2597fa57d2f42b4a6c5a9855"
< x-goog-generation: 1639431957957903
< x-goog-metageneration: 2
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 5969
< Content-Type: image/png
< x-goog-hash: crc32c=TeiHTA==
< x-goog-hash: md5=j5Mn2yWX+lfS9CtKbFqYVQ==
< x-goog-storage-class: STANDARD
< Accept-Ranges: bytes
< Content-Length: 5969
< Server: UploadServer

透過 CDN 或負載平衡監控功能,確認內容確實是由 CDN 提供。您應該會看到接近 100% 的命中率。如需執行幾項查詢,請按照下列步驟操作:

出發航廈

#for i in `seq 1 50`; do curl http://%loadbalncer-IP%/google.png; done

確認 Cloud CDN 提供的內容

前往「網路服務」>>「CDN」,確認流量確實是由 CDN 提供。

a52d0ba4c084aa05.png

6. 從 Google Cloud Storage 刪除物件

快取已填入完成,現在請從 bucket 刪除物件,再次確認政策的套用對象為快取,而不是後端。

依序前往「Cloud Storage」>>「%bucket name%」>>「objects」

選取圖片並刪除。

a1cc1bb9a0ff41df.png

7. 為 CDN 快取建立邊緣安全性政策

依序前往「網路安全性」>>「Cloud Armor」,然後按一下「建立政策」

選取下列項目

政策類型:邊緣安全性政策

預設動作:拒絕

7a12374be33026fd.pngb7c4efc091272358.png77ddbcddd07b65d2.png

將政策套用至後端 bucket。

8. 驗證邊緣安全性政策

我們已在後端 bucket 前方建立邊緣安全性政策,現在請驗證政策是否如預期運作。

檢查安全性政策

幾分鐘後,您就能確認 Cloud Armor 政策是否正在執行。在指令列執行下列指令,系統會傳回 403 錯誤

出發航廈

curl -svo /dev/null http://LOAD_BALANCER_IP/google.png

輸出內容

curl -svo /dev/null http://34.98.81.123/google.png
*   Trying 34.98.81.123...
* TCP_NODELAY set
* Connected to 34.98.81.123 (34.98.81.123) port 80 (#0)
> GET /google.png HTTP/1.1
> Host: YOUR_IP
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 403 Forbidden
< X-GUploader-UploadID: ADPycdtS6FtJOGIsiWYDrAAE8VFeQuNutcvbGoQe2t8EZxsuspVtmCjyiTv_P3CNktroHMOGFXkTCfG-Jj-rUO60ZGPpEbpqcw
< Content-Type: application/xml; charset=UTF-8
< Content-Length: 111
< Date: Mon, 13 Dec 2021 23:09:35 GMT
< Expires: Mon, 13 Dec 2021 23:09:35 GMT
< Cache-Control: private, max-age=0
< Server: UploadServer
<

調查記錄

接著查看記錄,確認已強制執行邊緣安全性政策。依序前往「Operations」>>「Logging」>>「Logs Explorer」

在查詢中輸入下列程式碼片段,然後點選「執行」

14972af5ae6c182a.png

resource.type:(http_load_balancer) AND jsonPayload.enforcedEdgeSecurityPolicy.name:(%SECURITY_POLICY_NAME%)

請注意 403 回應和強制執行的安全性政策

cddc48ca93ad79ca.png

移除安全性政策

移除安全性政策,並從快取查詢物件。

依序前往「網路安全性」>>「Cloud Armor」>>「%POLICY NAME%」>>「targets」,然後移除目標 bucket。

350655729a89eb33.png

確認政策已移除

幾分鐘後,再次執行 curl 指令,將資源傳送至儲存空間 bucket。這次您會收到 200 回應。

出發航廈

curl -svo /dev/null http://LOAD_BALANCER_IP/google.png

輸出內容

armanrye-macbookpro% curl -svo /dev/null http://34.98.81.123/google.png

*   Trying 34.98.81.123...
* TCP_NODELAY set
* Connected to 34.98.81.123 (34.98.81.123) port 80 (#0)
> GET /google.png HTTP/1.1
> Host: YOUR_IP
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< X-GUploader-UploadID: ADPycdtI7f49P3MSuZSZ8vl6RwfwmnIDJ59EeSKp7UPvLPawdaiRHXiNWLtseQTxUxceWOvSLvpYmT3pWVkV4qeIP7M
< Date: Mon, 13 Dec 2021 23:06:46 GMT
< Last-Modified: Mon, 13 Dec 2021 21:45:57 GMT
< ETag: "8f9327db2597fa57d2f42b4a6c5a9855"
< x-goog-generation: 1639431957957903
< x-goog-metageneration: 2
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 5969
< Content-Type: image/png
< x-goog-hash: crc32c=TeiHTA==
< x-goog-hash: md5=j5Mn2yWX+lfS9CtKbFqYVQ==
< x-goog-storage-class: STANDARD
< Accept-Ranges: bytes
< Content-Length: 5969
< Server: UploadServer
< Age: 1621
< Cache-Control: public,max-age=3600
<
{ [775 bytes data]
* Connection #0 to host 34.98.81.123 left intact
* Closing connection 0

恭喜!您已完成本實驗室的 Cloud Armor 邊緣安全性政策。

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

9. 實驗室清理

依序前往「Network Security」>>「Cloud Armor」>>「%POLICY NAME%」,然後選取「delete」

21eefb5f375e8fee.png

前往「Cloud Storage」,選取您建立的 bucket,然後按一下「刪除」。

ef2fa8d45c1d3452.png

依序前往「Networking」(網路) >>「Network services」(網路服務) >>「Load Balancing」(負載平衡)。選取您建立的負載平衡器,然後按一下「刪除」。

ee2e78c10f4104eb.png

10. 恭喜!

您已完成「使用 Cloud Armor 保護邊緣快取」程式碼研究室!

涵蓋內容

  • 如何設定 Cloud Storage 值區和相關聯的 Cloud Load Balancer
  • 如何建立 Cloud Armor 邊緣安全性政策
  • 如何驗證邊緣安全性政策是否正常運作。

後續步驟

  • 嘗試設定邊緣安全性政策,並從 Compute Engine 資源快取命中。