設定服務的自訂目標對象

本頁面說明如何使用自訂目標對象進行授權。

呼叫受 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 產生網址的服務。
  • 負載平衡器後方部署多項服務時,用戶端無法預測要求會到達哪個區域服務。即使服務名稱相同,Google 產生的服務網址仍會因區域而異。

在這些情況下,您必須設定服務,以便接受自訂目標對象值,讓用戶端可知道其他目標。Google 產生的預設網址一律會保留為可接受的目標對象值。

設定及更新自訂目標對象

您可以在服務層級設定 Cloud Run 的自訂目標對象,並套用至所有服務修訂版本,這與 IAM 授權會員資格類似。

您可以設定多個自訂目標對象,只要目標對象的 JSON 編碼 (以字串清單形式) 不超過 32,768 個半形字元即可。

任何設定變更都會建立新的修訂版本。除非您明確做出更新,否則後續的修訂版本也會自動取得這個設定。

gcloud

您可以使用下列指令,在服務上設定自訂目標對象:

gcloud run services update SERVICE --add-custom-audiences=AUDIENCE

取代

  • SERVICE 改為 Cloud Run 服務名稱
  • AUDIENCE 與要支援的自訂目標對象字串,例如 myservicehttps://myservice.example.com

您可以使用下列指令,從服務中移除所有自訂目標對象:

gcloud run services update SERVICE --clear-custom-audiences

YAML

  1. 如果您要建立新服務,請略過這個步驟。如果您要更新現有服務,請下載其 YAML 設定

    gcloud run services describe SERVICE --format export > service.yaml
  2. 請在服務中繼資料上設定 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 與要支援的自訂目標對象字串,例如 myservicehttps://myservice.example.com

    請注意,屬性的值是加上引號的 JSON 字串陣列,需要同時使用雙引號和單引號。

  3. 使用下列指令,將服務替換為新設定:

    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

驗證自訂目標對象

  1. 取得服務帳戶的 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 與您在服務中設定的自訂目標對象值。
  2. 使用該 ID 權杖呼叫服務的端點

    curl -H "Authorization: Bearer ${TOKEN}" ENDPOINT

    ENDPOINT 替換為可存取服務的端點,例如自訂網域或 .run.app 網址。

  3. 確認要求已獲得授權,且您看到服務的預期回應。