服務身分簡介

Cloud Run 服務身分可讓執行中的工作負載,透過 Cloud 用戶端程式庫使用代管存取權杖呼叫Cloud de Confiance by S3NS API。Cloud Run 會將存取權分為兩種身分:用於管理資源的部署者帳戶,以及用於執行階段要求的服務身分,可透過 Cloud 用戶端程式庫存取Cloud de Confiance 服務,例如 Cloud Storage、Firestore、Cloud SQL、Pub/Sub 和 Cloud Tasks。

本文適用對象為管理 Cloud Run 工作負載組織政策和使用者存取權的管理員、操作人員和開發人員。

Cloud Run 身分

如要使用 Cloud Run, Cloud de Confiance 需要兩種具備適當權限的身分:

  • Cloud Run 部署者帳戶:您用來向 Cloud Run Admin API 提出要求,部署及管理 Cloud Run 資源的身分 (使用者帳戶或服務帳戶)。
  • Cloud Run 服務身分:Cloud Run 執行個體使用的身分 (服務帳戶)。當您編寫的 Cloud Run 程式碼與 Cloud 用戶端程式庫互動,或呼叫其他 Cloud Run 服務進行服務對服務通訊時,您會使用這個身分從 Cloud Run 向Cloud de Confiance API 或其他 Cloud Run 服務提出要求。

如要存取 Cloud de Confiance API 並向其提出要求,或在服務之間通訊,每個身分都必須在 Identity and Access Management (IAM) 中取得適當權限。

使用部署者帳戶呼叫 Cloud Run Admin API

您可以使用 Cloud Run 部署者帳戶,從 Cloud Run 呼叫 Cloud Run Admin API。部署者帳戶可以是使用者帳戶或服務帳戶,代表登入 Cloud de Confiance by S3NS 環境的帳戶。

部署者帳戶使用 Cloud Run 時,IAM 會檢查部署者帳戶是否具備執行 Cloud Run 作業的必要權限。下圖顯示使用者帳戶如何呼叫 Cloud Run Admin API,從Cloud de Confiance 控制台部署新修訂版本:

從 Cloud de Confiance 控制台呼叫 Cloud Run Admin API。
圖 1 使用者透過 Cloud de Confiance 控制台,將含有存取權杖的要求傳送至 Cloud Run Admin API,藉此部署新修訂版本。IAM 會使用該存取權杖,驗證使用者帳戶是否已通過驗證,可存取 Cloud Run Admin API,然後才執行作業。

使用服務身分呼叫 Cloud de Confiance API

當 Cloud Run 執行個體與其他 IAM 驗證的 Cloud Run 服務互動,或透過應用程式程式碼或內建功能 (例如 Cloud Run 整合或 Cloud Storage 磁碟區掛接) 呼叫 Cloud 用戶端程式庫時, Cloud de Confiance 環境會使用應用程式預設憑證 (ADC),自動偵測 Cloud Run 服務身分是否已通過驗證,可執行 API 作業。Cloud Run 服務身分是指在您部署修訂版本或執行工作時,指派為 Cloud Run 執行個體身分的服務帳戶。

如果您在 Cloud Run 設定中設定相同的服務帳戶,則做為部署者帳戶的服務帳戶只會用作服務身分。

本指南的其餘部分將說明 Cloud Run 資源如何使用服務身分呼叫及存取 Google 服務和 API。如要進一步瞭解服務身分設定,請參閱服務、工作和worker 集區的服務身分設定頁面。

服務身分的服務帳戶類型

當 Cloud Run 執行個體呼叫 Cloud de Confiance by S3NS API 執行所需作業時,Cloud Run 會自動使用服務帳戶做為服務身分。可做為服務身分的服務帳戶有以下兩種類型:

  • 使用者管理的服務帳戶 (建議):您手動建立這個服務帳戶,並決定服務帳戶存取特定 Cloud de Confiance by S3NS 資源所需的最低權限。使用者自行管理的服務帳戶格式為 SERVICE_ACCOUNT_NAME@PROJECT_ID.s3ns.iam.gserviceaccount.com。
  • Compute Engine 預設服務帳戶:Cloud Run 會自動提供 Compute Engine 預設服務帳戶,做為預設服務身分。Compute Engine 預設服務帳戶的格式為 PROJECT_NUMBER-compute@developer.s3ns-system.iam.gserviceaccount.com。

設定服務身分時,避免使用預設服務帳戶

根據預設,系統會自動建立 Compute Engine 預設服務帳戶。如果在建立 Cloud Run 資源時未指定服務帳戶,Cloud Run 會使用這個服務帳戶。

視組織政策設定而定,預設服務帳戶可能會自動獲得專案的編輯者角色。強烈建議您 強制執行 iam.automaticIamGrantsForDefaultServiceAccounts 組織政策限制,停用自動角色授予功能。如果組織是在 2024 年 5 月 3 日後建立,系統預設會強制執行這項限制。

停用此功能後,您必須決定要將哪些角色授予預設服務帳戶,然後自行授予這些角色。

如果預設服務帳戶已具備「編輯者」角色,建議您將「編輯者」角色替換為權限較少的角色。

服務身分的運作方式

當程式碼使用 Cloud 用戶端程式庫向Cloud de Confiance API 發出要求時,會發生下列情況:

  1. 用戶端程式庫會向執行個體中繼資料伺服器,要求服務身分的 OAuth 2.0 存取權杖。
  2. 執行個體中繼資料伺服器會為設為服務身分的服務帳戶,提供 IAM 存取權杖。
  3. 系統會使用 OAuth 2.0 存取權杖,將要求傳送至 Cloud de Confiance API。
  4. IAM 會驗證存取權杖中參照的服務身分是否具備必要權限,並檢查政策繫結,然後將呼叫轉送至 API 端點。
  5. Cloud de Confiance API 會執行這項作業。
從 Cloud Run 呼叫 Google Cloud API。
圖 1. Cloud Run 會從中繼資料伺服器產生存取權杖,IAM 則會使用該存取權杖,驗證指派的 Cloud Run 服務身分是否已通過驗證,可存取 Cloud de Confiance API。

為 Cloud Run 要求產生存取權杖,以便呼叫 Cloud de Confiance API

如果 Cloud Run 程式碼使用 Cloud 用戶端程式庫,您可以在部署或執行時指派服務帳戶,在 Cloud Run 中設定服務身分。這樣一來,程式庫就能自動取得存取權杖,驗證程式碼的要求。如果 Cloud Run 程式碼與其他已驗證的 Cloud Run 服務通訊,您必須在要求中加入存取權杖。

如要將服務帳戶指派為服務身分,請參閱下列指南:

不過,如果您使用自己的自訂程式碼,或需要以程式輔助方式提出要求,可以直接使用中繼資料伺服器,手動擷取下一節所述的身分權杖和存取權杖。請注意,您無法直接從本機電腦查詢這個伺服器,因為中繼資料伺服器僅適用於在Cloud de Confiance上執行的工作負載。

使用中繼資料伺服器擷取 ID 和存取權杖

您可以使用中繼資料伺服器擷取下列兩種權杖:

  • OAuth 2.0 存取權杖:用於呼叫大多數 Google API 用戶端程式庫。
  • ID 權杖:用於呼叫其他 Cloud Run 服務,或叫用任何服務來驗證 ID 權杖。

如要擷取權杖,請按照所用權杖類型對應分頁中的操作說明操作:

存取權杖

舉例來說,如要建立 Pub/Sub 主題,請使用 projects.topics.create 方法。

  1. 使用 Compute 中繼資料伺服器擷取存取權杖:

    curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
        --header "Metadata-Flavor: Google"

    這個端點會傳回含有 access_token 屬性的 JSON 回應。

  2. 在 HTTP 通訊協定要求中,必須使用 Authorization 標頭中的存取權杖驗證要求:

    PUT https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID
    Authorization: Bearer ACCESS_TOKEN
    

    其中:

    • PROJECT_ID 是您的專案 ID。
    • TOPIC_ID 是主題 ID。
    • ACCESS_TOKEN 是您在上一步擷取的存取權杖。

    回應:

    {
        "name": "projects/PROJECT_ID/topics/TOPIC_ID"
    }
    

ID 權杖

使用 Compute 中繼資料伺服器,擷取具有特定目標對象的身分權杖:

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE" \
    --header "Metadata-Flavor: Google"

其中 AUDIENCE 是要求的 JWT 目標對象。

如果是 Cloud Run 服務,目標對象應為您叫用的服務網址,或為服務設定的自訂目標對象,例如自訂網域。

https://service.domain.com

如果是其他資源,則可能是受 IAP 保護資源的 OAuth 用戶端 ID:

1234567890.apps.googleusercontent.com

後續步驟