使用 Cloud Armor 防禦邊緣快取

1. 簡介

您可以透過 Google Cloud Armor Edge 安全性政策,限制 Google Cloud CDN 和 Google Cloud Storage 中快取物件的存取權。造成這種情況的例子包括:確保使用者不會從限制的地理位置存取儲存值區中的物件,或確保你的媒體發布設定是篩選你有權進行存取的地理位置。

在這個研究室中,我們會建立 GCS 值區、上傳映像檔並繫結至負載平衡器,然後為值區啟用 Cloud CDN 和邊緣安全性政策。

課程內容

  • 如何設定含有可快取內容的 Cloud Storage 值區
  • 如何建立邊緣安全性政策來保護內容
  • 如何驗證邊緣安全性政策是否正常運作

軟硬體需求

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

2. 設定和需求

自修環境設定

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.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」圖示:

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 值區

前往 Cloud 控制台中的「導覽選單」>[Cloud Storage] >瀏覽器。按一下「建立值區」

baf3d3c74282ecba.png

值區命名規則:

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

點選「繼續」

位置類型:區域

位置:選擇離您較遠的區域

點選「繼續」

預設儲存空間級別:Standard

點選「繼續」

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

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

點選「繼續」

設定值區後,請按一下「建立」

大功告成,您剛剛建立了一個 Cloud Storage 值區!

4. 將物件上傳至值區

現在,將物件上傳至值區。

首先,請將這個映像檔下載至 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 指令從儲存位置將圖片上傳至您建立的值區:

透過 Cloud Shell

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

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

透過 Cloud Shell

rm google.png

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

821aad82d8633922.png

30a975d3ad22d33d.png

5. 建立負載平衡器

接下來,我們要建立 HTTP 負載平衡器。

前往「網路」>「>」網路服務 >>負載平衡 >>建立負載平衡器 >>HTTP 負載平衡器 >>網際網路到我的 VM >>傳統版 HTTP(S) 負載平衡器

首先,為您即將建立的負載平衡器命名。

建立後端 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 提供流量CDN

a52d0ba4c084aa05.png

6. 從 GCS 刪除物件

系統已填入快取資料後,就可以從值區中刪除物件,強制將政策套用至快取,而非後端。

前往「Cloud Storage」>「>」%bucket name% >>物品

選取並刪除圖片。

a1cc1bb9a0ff41df.png

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

瀏覽至 [網路安全性] >>。Cloud Armor,然後點選「建立政策」

選取下列項目

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

預設動作:拒絕

7a12374be33026fd.png

b7c4efc091272358.png

77ddbcddd07b65d2.png

將政策套用至後端值區。

8. 驗證邊緣安全性政策

現在,我們在後端值區的前面建立了 Edge Security Policy,因此可以驗證其是否如預期運作。

查看安全性政策

等待幾分鐘後,您就能檢查 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
<

調查記錄檔

接下來,您可以查看記錄,查看強制執行的邊緣安全性政策。前往「作業 >>」記錄 >>記錄檔探索工具

將下列程式碼片段輸入查詢,然後按一下「執行」

14972af5ae6c182a.png

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

記下 403 回應和強制執行的安全性政策

cddc48ca93ad79ca.png

移除安全性政策

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

瀏覽至 [網路安全性] >>。Cloud Armor >>%POLICY NAME% >>目標,並移除目標值區。

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 Edge 安全性政策的研究室。

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

9. 清理研究室

瀏覽至 [網路安全性] >>。Cloud Armor >>%POLICY NAME%,然後選取「刪除」

21eefb5f375e8fee.png

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

ef2fa8d45c1d3452.png

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

ee2e78c10f4104eb.png

10. 恭喜!

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

涵蓋內容

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

後續步驟

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