使用 Cloud Armor 防禦邊緣快取

1. 簡介

Google Cloud Armor 邊緣安全性政策可限制 Google Cloud CDN 和 Google Cloud Storage 中快取物件的存取權。舉例來說,您可能想確保使用者無法從受限地理區域存取儲存空間值區中的物件,或是確保媒體發布作業會根據您有授權的地理區域進行篩選。

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

課程內容

  • 如何設定 Cloud Storage bucket,並提供可快取的內容
  • 如何建立 Edge 安全性政策來保護內容
  • 如何驗證 Edge 安全性政策是否正常運作

軟硬體需求

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

2. 設定和需求

自修實驗室環境設定

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

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

這部虛擬機器搭載各種您需要的開發工具,並提供永久的 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 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 值區!

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

30a975d3ad22d33d.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

建立主機與路徑規則

前往左側的「主機與路徑規則」。我們會使用簡單的主機/路徑規則,並將所有要求傳送至儲存空間。

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 提供流量,請依序前往「Network Services」(網路服務) >>「CDN」

a52d0ba4c084aa05.png

6. 從 GCS 刪除物件

快取已填入內容,現在請從值區中刪除物件,再次確認我們是將政策套用至快取,而非後端。

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

選取圖片並刪除。

a1cc1bb9a0ff41df.png

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

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

選取下列項目

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

預設動作:拒絕

7a12374be33026fd.png

b7c4efc091272358.png

77ddbcddd07b65d2.png

將政策套用至後端 bucket。

8. 驗證邊緣安全性政策

我們已在後端 bucket 前方建立 Edge 安全性政策,現在要驗證政策是否正常運作。

查看安全性政策

幾分鐘後,您就能確認 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

移除安全性政策

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

依序前往「Network Security」>>「Cloud Armor」>>「%POLICY NAME%」>>「targets」,然後移除目標 bucket。

350655729a89eb33.png

確認政策已移除

幾分鐘後,再次將 curl 傳送至儲存空間值區中的資源。這次您會收到 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

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

ee2e78c10f4104eb.png

10. 恭喜!

您已完成「使用 Cloud Armor 保護 Edge Cache」程式碼研究室!

涵蓋內容

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

後續步驟

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