本頁面簡介已簽署的網址,並說明如何搭配 Cloud CDN 使用。使用已簽署的網址,可將限時的資源存取權提供給任何知道該網址的使用者,且不限於 Google 帳戶擁有者。
已簽署的網址可用來提供有限權限,允許使用者在時限內提出要求。這類網址的查詢字串中包含驗證資訊,可讓不具憑證的使用者對資源執行特定動作。產生已簽署的網址時,您指定的使用者或服務帳戶須具備充分的權限,有權提出與該網址相關的要求。
產生已簽署網址後,任何知道該網址的使用者,都可以用來在指定的一段時間內執行特定動作,例如讀取物件。
已簽署的網址也支援選用的 URLPrefix 參數,可根據通用前置字元提供多個網址的存取權。
如要將存取範圍限制在特定網址前置字元,可考慮使用已簽署的 Cookie。
事前準備
使用已簽署的網址前,請先完成下列步驟:
確認已啟用 Cloud CDN;如需操作說明,請參閱「使用 Cloud CDN」。啟用 Cloud CDN 之前,您可以先在後端設定已簽署的網址,但這類網址須等到 Cloud CDN 啟用後才會生效。
請視需要更新至最新版 Google Cloud CLI:
gcloud components update
請參閱「已簽署的網址和 Cookie」瞭解概況。
設定已簽署的要求金鑰
如要為已簽署的網址或 Cookie 建立金鑰,請完成以下各節說明的步驟。
安全性考量
在下列情況中,Cloud CDN「不會」驗證要求:
- 要求未經簽署。
- 要求所用的後端服務或後端 bucket 未啟用 Cloud CDN。
已簽署的要求「一律」須先在來源端經過驗證,才能提供回應。這是因為來源可用於提供混合已簽署和未簽署的內容,且用戶端可直接存取來源。
- Cloud CDN 不會封鎖沒有
Signature查詢參數或Cloud-CDN-CookieHTTP Cookie 的要求,且會拒絕要求參數無效 (或格式有誤) 的要求。 - 應用程式偵測到無效簽章時,需確保應用程式會以
HTTP 403 (Unauthorized)回應代碼回應。HTTP 403回應代碼不可快取。 - 系統會分別快取已簽署和未簽署要求的回應,因此對有效已簽署要求的成功回應,絕不會用來處理未簽署的要求。
- 如果應用程式將可快取的回應代碼傳送給無效的要求,往後的有效要求可能會遭到拒絕。
如果使用 Cloud Storage 後端,請務必移除公開存取權,Cloud Storage 才能拒絕缺少有效簽章的要求。
下表彙整了相關行為。
| 要求具有簽章 | 快取命中 | 行為 |
|---|---|---|
| 否 | 否 | 轉送至後端來源。 |
| 否 | 是 | 從快取提供。 |
| 是 | 否 | 驗證簽章。簽章有效則轉送至後端來源。 |
| 是 | 是 | 驗證簽章。簽章有效則從快取提供。 |
建立已簽署的要求金鑰
如要啟用 Cloud CDN 已簽署的網址和 Cookie 支援功能,請在已啟用 Cloud CDN 的後端服務和/或後端 bucket 中,建立一或多組金鑰。
在每個後端服務或後端 bucket 中,依據安全需求建立和刪除金鑰。每個後端一次最多可以設定三組金鑰。建議您定期刪除最舊的金鑰並新增金鑰,然後在簽署網址或 Cookie 時使用新金鑰,藉此輪換金鑰。
各組金鑰彼此不相依,因此可在多個後端服務和後端 bucket 中使用相同的金鑰名稱。金鑰名稱長度上限 63 個字元,如要為金鑰命名,請使用 A-Z、a-z、0-9、_ (底線) 和 - (連字號) 字元。
建立金鑰時,請務必確保金鑰安全,因為任何使用者只要取得其中一組金鑰,就能建立 Cloud CDN 接受的已簽署網址或 Cookie,直到該組金鑰從 Cloud CDN 中刪除為止。金鑰會儲存在您用來產生已簽署網址或 Cookie 的電腦中。另外,Cloud CDN 也會儲存金鑰並用於驗證要求簽章。
為確保金鑰隱密性,請勿在傳送至任何 API 要求的回應中加入金鑰值。如果金鑰遺失,您必須建立新的金鑰。
如要建立已簽署的要求金鑰,請按照下列步驟操作。
控制台
- 前往 Google Cloud 控制台的「Cloud CDN」頁面。
- 按一下要新增金鑰的來源名稱。
- 在「Origin details」(來源詳細資料) 頁面上,按一下「Edit」(編輯) 按鈕。
- 在「Origin basics」(來源基本資訊) 部分,點選「Next」(下一步),開啟「Host and path rules」(主機與路徑規則) 部分。
- 在「Host and path rules」(主機與路徑規則) 部分,點選「Next」(下一步),開啟「Cache performance」(快取效能) 部分。
- 在「Restricted content」(受限制的內容) 部分,選取「Restrict access using signed URLs and signed cookies」(透過已簽署的網址和 Cookie 限制存取權限)。
按一下「Add signing key」(新增簽署金鑰)。
- 為新的簽署金鑰指定不重複的名稱。
將「Key creation method」(金鑰建立方法) 設為「Automatically generate」(自動產生),或是按一下「Let me enter」(讓我輸入),然後指定簽署金鑰值。
如果採用前者,請將自動產生的簽署金鑰值複製到私密檔案,方便用於建立已簽署的網址。
按一下「Done」(完成)。
在「Cache entry maximum age」(快取項目存在時間長度上限) 部分輸入值,然後選取時間單位。
按一下「Done」(完成)。
gcloud
gcloud 指令列工具會從您指定的本機檔案讀取金鑰。金鑰檔必須以下列方式建立:產生高度隨機 128 個位元,使用 base64 進行編碼,然後將字元 + 替換為 -,並將字元 / 替換為 _。詳情請參閱 RFC 5116。產生高度隨機金鑰是重要步驟。在 UNIX 等系統上,您可以使用下列指令,產生高度隨機金鑰並儲存在金鑰檔案中:
head -c 16 /dev/urandom | base64 | tr +/ -_ > KEY_FILE_NAME
如要將金鑰新增至後端服務,請按照下列步驟操作:
gcloud compute backend-services \ add-signed-url-key BACKEND_NAME \ --key-name KEY_NAME \ --key-file KEY_FILE_NAME
如要將金鑰新增至後端 bucket,請按照下列步驟操作:
gcloud compute backend-buckets \ add-signed-url-key BACKEND_NAME \ --key-name KEY_NAME \ --key-file KEY_FILE_NAME
設定 Cloud Storage 權限
如果您使用 Google Cloud Storage,且已限制哪些使用者可以讀取物件,則必須將 Cloud CDN 服務帳戶新增至 Cloud Storage 的 ACL,藉此授予 Cloud CDN 讀取物件的權限。
您不需要建立服務帳戶,首次將金鑰新增至專案後端 bucket 時,系統會自動建立服務帳戶。
執行下列指令前,請先將至少一個金鑰新增至專案中的後端 bucket。若沒有執行這個步驟,指令就會失敗並發生錯誤,因為必須先為專案新增一或多個金鑰,系統才會建立 Cloud CDN 快取填補服務帳戶。
gcloud storage buckets add-iam-policy-binding gs://BUCKET \ --member=serviceAccount:service-PROJECT_NUMBER@cloud-cdn-fill.iam.gserviceaccount.com \ --role=roles/storage.objectViewer
將 PROJECT_NUMBER 替換為專案編號,並將 BUCKET 替換為儲存空間 bucket。
Cloud CDN 服務帳戶 service-PROJECT_NUMBER@cloud-cdn-fill.iam.gserviceaccount.com 不會顯示在專案的服務帳戶清單中。這是因為 Cloud CDN 服務帳戶的擁有者為 Cloud CDN,而非專案。
如要進一步瞭解專案編號,請參閱 Google Cloud 控制台說明文件中的「尋找專案 ID 與專案編號」。
自訂快取時間上限
無論後端的 Cache-Control 標頭為何,Cloud CDN 都會快取已簽署要求的回應。在不重新驗證的情況下快取回應的時間長度上限,是透過 signed-url-cache-max-age 標記設定,預設上限為一小時,不過可以按照下列步驟修改。
如要設定後端服務或後端 bucket 的快取時間長度上限,請執行下列任一指令:
gcloud compute backend-services update BACKEND_NAME \ --signed-url-cache-max-age MAX_AGE
gcloud compute backend-buckets update BACKEND_NAME \ --signed-url-cache-max-age MAX_AGE
列出已簽署的要求金鑰名稱
如要列出後端服務或後端 bucket 的金鑰,請執行下列任一指令:
gcloud compute backend-services describe BACKEND_NAME
gcloud compute backend-buckets describe BACKEND_NAME
刪除已簽署的要求金鑰
透過特定金鑰簽署的網址失效之後,請執行下列其中一個指令,從後端服務或後端 bucket 中刪除該組金鑰:
gcloud compute backend-services \ delete-signed-url-key BACKEND_NAME --key-name KEY_NAME
gcloud compute backend-buckets \ delete-signed-url-key BACKEND_NAME --key-name KEY_NAME
簽署網址
最後一個步驟是簽署並發布網址。您可以使用 gcloud compute sign-url 指令或自行編寫的程式碼簽署網址。如需大量已簽署的網址,使用自訂程式碼的效果較好。
建立已簽署的網址
請按照下列操作說明,使用 gcloud compute sign-url 指令建立已簽署的網址。此步驟假設您已建立金鑰。
控制台
您無法使用 Google Cloud 控制台建立已簽署的網址,但可以使用 Google Cloud CLI,或透過下列範例撰寫自訂程式碼。
gcloud
Google Cloud CLI 包含可用來簽署網址的指令。請參閱自行編寫程式碼的相關段落,瞭解用於實作演算法的指令。
gcloud compute sign-url \ "URL" \ --key-name KEY_NAME \ --key-file KEY_FILE_NAME \ --expires-in TIME_UNTIL_EXPIRATION \ [--validate]
這項指令會從 KEY_FILE_NAME 讀取並解碼 base64url 編碼的金鑰值,然後輸出已簽署的網址,供您用於對指定的網址執行 GET 或 HEAD 要求。
例如:
gcloud compute sign-url \ "https://example.com/media/video.mp4" \ --key-name my-test-key \ --expires-in 30m \ --key-file sign-url-key-file
URL 必須是含有路徑元件的有效網址。舉例來說,http://example.com 無效,但 https://example.com/ 和 https://example.com/whatever 都是有效的網址。
如果提供選用的 --validate 旗標,這項指令會使用產生的網址傳送 HEAD 要求,並顯示 HTTP 回應代碼。如果已簽署的網址正確,回應代碼會與後端傳送的結果代碼相同。如果回應代碼不相同,請重新檢查 KEY_NAME 與指定檔案的內容,確認 TIME_UNTIL_EXPIRATION 的值至少為幾秒鐘。
如果沒有提供 --validate 旗標,系統就不會驗證下列項目:
- 輸入內容
- 產生的網址
- 產生的已簽署網址
以程式輔助方式建立已簽署的網址
下列程式碼範例示範如何以程式輔助方式建立已簽署的網址。