本頁面說明如何使用自訂目標對象進行授權。
呼叫受 Identity and Access Management 保護的 Cloud Run 服務的用戶端,必須提供有效的 ID 權杖,其中包含與接收服務的 *.run.app
網址相符的目標對象宣告。如果客戶不知道這個網址,您可以使用自訂目標對象值。
瞭解自訂目標對象
Cloud Run 提供調用者 (roles/run.invoker
) 角色,支援使用 IAM 進行存取權控管。IAM 存取控制會使用 Google 簽署的 ID 權杖,這些權杖會封裝為 JSON Web Token (JWT)。這些權杖的內容符合 OIDC 標準。
系統會在權杖中編碼目標對象欄位,指定可使用權杖的預期目標。這可降低重播攻擊的風險,因為重播攻擊會將用於某項服務的攔截符記號,重播至其他服務。
依慣例,目標對象是目標服務的完整網址。在 Cloud Run 中,這項預設值是 Google 為結尾為 run.app
的服務產生的網址。
不過,Cloud Run 服務可能會位於預設產生的網址以外的網址後方,例如在下列情況下:
在這些情況下,您必須設定服務,以便接受自訂目標對象值,讓用戶端可知道其他目標。Google 產生的預設網址一律會保留為可接受的目標對象值。
設定及更新自訂目標對象
您可以在服務層級設定 Cloud Run 的自訂目標對象,並套用至所有服務修訂版本,這與 IAM 授權會員資格類似。
您可以設定多個自訂目標對象,只要目標對象的 JSON 編碼 (以字串清單形式) 不超過 32,768 個半形字元即可。
任何設定變更都會建立新的修訂版本。除非您明確做出更新,否則後續的修訂版本也會自動取得這個設定。
gcloud
您可以使用下列指令,在服務上設定自訂目標對象:
gcloud run services update SERVICE --add-custom-audiences=AUDIENCE
取代
- SERVICE 改為 Cloud Run 服務名稱
- AUDIENCE 與要支援的自訂目標對象字串,例如
myservice
或https://myservice.example.com
您可以使用下列指令,從服務中移除所有自訂目標對象:
gcloud run services update SERVICE --clear-custom-audiences
YAML
如果您要建立新服務,請略過這個步驟。如果您要更新現有服務,請下載其 YAML 設定:
gcloud run services describe SERVICE --format export > service.yaml
請在服務中繼資料上設定
run.googleapis.com/custom-audiences
註解 (不要在template
中繼資料上設定):apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE annotations: run.googleapis.com/custom-audiences: '["AUDIENCE"]' spec: template: ...
取代
- SERVICE 改為 Cloud Run 服務名稱
- AUDIENCE 與要支援的自訂目標對象字串,例如
myservice
或https://myservice.example.com
請注意,屬性的值是加上引號的 JSON 字串陣列,需要同時使用雙引號和單引號。
使用下列指令,將服務替換為新設定:
gcloud run services replace service.yaml
Terraform
如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。
將下列內容新增至 Terraform 設定中的google_cloud_run_v2_service
資源:resource "google_cloud_run_v2_service" "default" {
name = "SERVICE"
location = "us-central1"
custom_audiences = ["AUDIENCE"]
template {
containers {
image = "us-docker.pkg.dev/cloudrun/container/hello"
}
}
}
取代:
- SERVICE 改為 Cloud Run 服務名稱。
- AUDIENCE 與您要支援的自訂目標對象字串,例如
myservice
。
驗證自訂目標對象
取得服務帳戶的 ID 權杖,該帳戶具有可叫用服務的 IAM 權限。請注意,使用自訂目標對象 AUDIENCE。
export TOKEN=$(gcloud auth print-identity-token --impersonate-service-account SERVICE_ACCOUNT_EMAIL --audiences='AUDIENCE')
取代:
- SERVICE_ACCOUNT_EMAIL 與服務帳戶的電子郵件地址。結尾為
.iam.gserviceaccount.com
。 - AUDIENCE 與您在服務中設定的自訂目標對象值。
- SERVICE_ACCOUNT_EMAIL 與服務帳戶的電子郵件地址。結尾為
使用該 ID 權杖呼叫服務的端點
curl -H "Authorization: Bearer ${TOKEN}" ENDPOINT
將 ENDPOINT 替換為可存取服務的端點,例如自訂網域或
.run.app
網址。確認要求已獲得授權,且您看到服務的預期回應。