Workload Identity 叢集驗證

本文說明如何為 Google Distributed Cloud 連結網路方案 設定及使用 Workload Identity 叢集驗證。Workload Identity 叢集驗證功能會使用短期權杖和 Workload Identity Federation,讓工作負載安全存取 Google Cloud 資源,而非服務帳戶金鑰。短期憑證是 OAuth 2.0 存取權杖。根據預設,存取權杖會在 1 小時後失效。

透過 Workload Identity 叢集驗證,工作負載可以使用自己的 Kubernetes 身分直接存取 Google Cloud 資源,或模擬 Google 服務帳戶。

相較於使用服務帳戶金鑰,Workload Identity 叢集驗證有兩大優點:

  • 提升安全性:如未妥善管理服務帳戶金鑰,可能會產生安全性風險,OAuth 2.0 權杖和 Workload Identity Federation 是服務帳戶金鑰的最佳替代方案。如要進一步瞭解服務帳戶權杖,請參閱「短期服務帳戶憑證」。如要進一步瞭解 Workload Identity Federation,請參閱「 Workload Identity Federation」。

  • 減少維護作業:服務帳戶金鑰需要更多維護作業。 定期輪替及保護這些金鑰可能會造成管理負擔。

本文適用於負責設定、監控及管理基礎技術架構生命週期的管理員、架構師和營運人員。如要進一步瞭解Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。

叢集管理

本指南說明如何為應用程式使用 Workload Identity Federation。系統會自動管理 Distributed Cloud 連線叢集的叢集層級 Workload Identity Federation。

Google 會透過 Distributed Cloud Edge Container API 建立及管理 Distributed Cloud 連線叢集,您可以使用 gcloud edge-cloud container clusters create 指令或在 Google Cloud 控制台中執行這項操作。

Distributed Cloud 連線叢集會自動註冊至所建立專案中的 Fleet。您不需要手動註冊車隊。系統會自動提供 Workload Identity Federation Pool,格式為 PROJECT_ID.svc.id.goog

事前準備

  • 設定工作負載身分聯盟前,請先確認 Google Cloud 專案中已啟用下列 API。如要瞭解如何啟用 API,請參閱「啟用服務」:

    • iam.googleapis.com
    • sts.googleapis.com
    • iamcredentials.googleapis.com
    • gkehub.googleapis.com
  • 確認您已安裝下列指令列工具:

    如果您使用 Cloud Shell 做為與Google Cloud互動的殼層環境,系統會為您安裝這些工具。

  • 確認您已初始化 gcloud CLI,以便搭配專案使用。

  • 請確認您在專案中具備下列 IAM 角色。您必須具備下列角色才能完成設定:

    • 擁有者 (roles/owner) 或
    • IAM 安全管理員 (roles/iam.securityAdmin) 和服務帳戶管理員 (roles/iam.serviceAccountAdmin)

在接下來的幾節中,您將建立服務帳戶,並授予 Workload Identity 叢集驗證所需的角色。

建議:Workload Identity 聯盟直接資源存取權

透過 Workload Identity Federation 直接存取資源,您可以使用 Workload Identity Federation 將 IAM 角色授予 Kubernetes ServiceAccount,讓該帳戶直接存取 Google Cloud資源。

身分識別 目的 角色
Kubernetes ServiceAccount 工作負載使用的 Kubernetes 身分。授予這個身分存取必要 Google Cloud 資源所需的角色。這個範例會授予 roles/storage.objectViewer 角色和 roles/logging.admin 角色。 roles/storage.objectViewer
roles/logging.admin

替代做法:模擬 IAM 服務帳戶

或者,您也可以將 Kubernetes ServiceAccount 設定為使用 IAM 服務帳戶模擬功能。

服務帳戶 目的 角色
Google 服務帳戶 叢集內工作負載模擬的 Google 服務帳戶。授予此服務帳戶存取必要資源所需的角色。 Google Cloud 視存取的資源而定。
Kubernetes ServiceAccount 授予這個身分模擬 Google 服務帳戶的權限。這項授權使用 roles/iam.workloadIdentityUser 角色。 roles/iam.workloadIdentityUser

設定服務帳戶

下列各節包含建立必要 Kubernetes ServiceAccount 的操作說明,並說明如何使用 Workload Identity 聯盟直接資源存取權或 Google 服務帳戶模擬,授予該帳戶 Workload Identity 叢集驗證所需的角色。

建立 Kubernetes ServiceAccount

在叢集中,使用 kubectl create 指令為 Pod 建立 Kubernetes ServiceAccount。您也可以使用任何現有的 ServiceAccount,包括命名空間中的預設 ServiceAccount

kubectl create serviceaccount KSA_NAME --namespace NAMESPACE

替換下列值:

  • KSA_NAME:Kubernetes ServiceAccount 的名稱

  • NAMESPACE:叢集的命名空間

使用 Workload Identity 聯盟授予資源直接存取權

如要直接將 Identity and Access Management 角色授予 Kubernetes ServiceAccount 身分,請按照下列步驟操作。

  1. 使用 gcloud projects describe 指令找出專案編號:

    gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    

    PROJECT_ID 替換為專案 ID。

  2. 使用 gcloud projects add-iam-policy-binding 指令,將必要角色授予 Kubernetes 身分主體:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="principal://iam.gserviceaccount.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role=roles/storage.objectViewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="principal://iam.gserviceaccount.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role=roles/logging.admin
    

    替換下列值:

    • PROJECT_NUMBER:您的專案編號 (數值)
    • NAMESPACE:叢集的命名空間
    • KSA_NAME:Kubernetes ServiceAccount 的名稱

替代做法:使用 IAM 服務帳戶模擬功能授予存取權

如要讓工作負載模擬 Google 服務帳戶,請按照下列步驟操作。

  1. 使用 gcloud iam service-accounts create 指令建立 Google 服務帳戶:

    gcloud iam service-accounts create my-app-sa \
        --project=PROJECT_ID
    

    PROJECT_ID 替換為專案 ID。

  2. 使用 gcloud projects add-iam-policy-binding 指令,將必要角色授予 Google 服務帳戶:

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/storage.objectViewer
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/logging.admin
    
  3. 使用 gcloud iam service-accounts add-iam-policy-binding 指令,授予 Kubernetes ServiceAccount 模擬 Google 服務帳戶的能力:

    gcloud iam service-accounts add-iam-policy-binding my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role=roles/iam.workloadIdentityUser \
        --member="serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"
    

    替換下列值:

    • NAMESPACE:叢集的命名空間
    • KSA_NAME:Kubernetes ServiceAccount 的名稱
  4. 使用 kubectl annotate 指令為 Kubernetes ServiceAccount 加上註解,將其連結至 Google 服務帳戶:

    kubectl annotate serviceaccount \
        --namespace NAMESPACE KSA_NAME \
        iam.gke.io/gcp-service-account=my-app-sa@PROJECT_ID.iam.gserviceaccount.com
    

設定工作負載

更新 Pod 規格,使用 Kubernetes ServiceAccount 並掛接投射的權杖磁碟區。由於 Distributed Cloud 連線叢集位於Google Cloud外部,您也必須提供憑證設定檔,並設定 GOOGLE_APPLICATION_CREDENTIALS 環境變數來指向該檔案。Pod 中的Google Cloud 用戶端程式庫會使用這些憑證,透過 Security Token Service API 將 Kubernetes 權杖換成 Google Cloud 存取權杖。

  1. 產生 credential-configuration.json 檔案。根據您是使用 Workload Identity Federation 直接存取資源,還是使用 IAM 服務帳戶模擬功能,選擇適用的指令。

    Workload Identity 聯盟直接資源存取權

    使用 gcloud iam workload-identity-pools create-cred-config 指令:

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/providers/attestor \
        --credential-source-file=/var/run/secrets/tokens/gcp-ksa/token \
        --credential-source-type=text \
        --output-file=credential-configuration.json
    

    使用 IAM 服務帳戶模擬功能授予存取權

    使用 gcloud iam workload-identity-pools create-cred-config 指令:

    gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/providers/attestor \
        --service-account=my-app-sa@PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/secrets/tokens/gcp-ksa/token \
        --credential-source-type=text \
        --output-file=credential-configuration.json
    

    PROJECT_NUMBER 替換為 Google Cloud 專案編號。您可以執行 gcloud projects describe PROJECT_ID --format="value(projectNumber)" 來找出專案編號。

  2. 使用 kubectl create configmap 指令建立 Kubernetes ConfigMap,儲存設定檔:

    kubectl create configmap CREDENTIAL_CONFIG_MAP \
        --namespace NAMESPACE \
        --from-file=credential-configuration.json
    

    替換下列值:

    • CREDENTIAL_CONFIG_MAPConfigMap 的名稱,其中包含憑證設定檔

    • NAMESPACE:叢集的命名空間

  3. 使用下列 YAML 內容更新 Pod 規格:

    spec:
      serviceAccountName: KSA_NAME
      containers:
      - name: MY_CONTAINER
        image: MY_IMAGE
        env:
        - name: GOOGLE_APPLICATION_CREDENTIALS
          value: /var/run/secrets/tokens/gcp-creds/credential-configuration.json
        volumeMounts:
        - mountPath: /var/run/secrets/tokens/gcp-ksa
          name: gcp-ksa
        - mountPath: /var/run/secrets/tokens/gcp-creds
          name: gcp-creds
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 0420
          sources:
          - serviceAccountToken:
              path: token
              audience: PROJECT_ID.svc.id.goog
              expirationSeconds: 3600
      - name: gcp-creds
        configMap:
          name: CREDENTIAL_CONFIG_MAP
    

    替換下列值:

    • KSA_NAME:Kubernetes ServiceAccount 的名稱

    • MY_CONTAINER:容器名稱

    • MY_IMAGE:圖片名稱

限制

使用 Distributed Cloud connected 的 Workload Identity Federation 時,不支援下列功能:

  • 在權杖交換程序中使用 Proxy 伺服器

如要瞭解如何搭配使用 Workload Identity Federation 與 VPC Service Controls,請參閱「設定 VPC Service Controls 整合」。

後續步驟