設定 GKE 的受管理工作負載身分驗證

本文說明如何在 GKE 叢集車隊管理的叢集中,為 Google Kubernetes Engine (GKE) 設定代管工作負載身分。同時也會說明如何部署工作負載,以及驗證工作負載的身分和憑證。

如要設定及使用 GKE 的代管工作負載身分,請完成下列步驟:

  1. 選擇憑證授權單位 (CA) 選項

  2. 設定憑證授權單位

  3. 使用受管理的工作負載身分部署工作負載

  4. 選用:啟用工作負載身分集區之間的信任聯盟

Google 管理的 workload identity pool

將叢集新增至 GKE 機群時,GKE 會自動建立 Google 管理的工作負載身分集區,做為信任根,也就是工作負載的 SPIFFE 信任網域。信任網域內的所有工作負載都會收到憑證和信任錨點,預設可在信任網域內進行驗證。如果您有多個信任網域,可以啟用信任同盟,讓這些網域之間能夠通訊。

Google 管理的工作負載身分集區有下列限制:

  • Google 會全權管理集區,因此您無法建立任何子資源,例如命名空間、身分或身分識別提供者。

  • 集區只能用於 GKE 工作負載。您無法將其他類型的工作負載 (例如 Compute Engine VM) 新增至集區。

  • 集區中的所有叢集都適用於標準 Kubernetes 命名空間相同性模型。也就是說,集區中的所有叢集都具有同等權限。集區中任何叢集上的工作負載,都可以使用該集區中的任何身分。

多專案設定

您在本文件中使用的Google Cloud 資源 (例如 GKE 叢集、根 CA 和下層 CA) 可以位於不同專案。如要參照這些資源,請使用 --project 旗標為每個資源指定正確的專案。

事前準備

  1. 建立或選取 Google Cloud 專案

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您已獲授角色,即可選取任何專案。
    • 建立專案:如要建立專案,您需要「專案建立者」角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色
    • 建立 Google Cloud 專案:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替換為您要建立的 Google Cloud 專案名稱。

    • 選取您建立的 Google Cloud 專案:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替換為 Google Cloud 專案名稱。

  2. 瞭解受管理的工作負載身分

  3. 請確認叢集執行的是 1.33.0-gke.2248000 以上版本。

  4. 將叢集新增至 GKE 機群。如果叢集是 Autopilot 叢集,請省略 --enable-workload-identity 標記。Fleet 會自動建立 Google 管理的工作負載身分集區,做為信任網域

    執行下列指令,啟用 GKE 叢集機群:

    gcloud container clusters update CLUSTER_NAME \
    --workload-pool=PROJECT_ID.svc.id.goog \
    --enable-fleet \
    --fleet-project=PROJECT_ID
    

    替換下列值:

    • CLUSTER_NAME:要向 GKE 機群註冊的 GKE 叢集名稱
    • PROJECT_ID:GKE 機群 主機專案 ID
  5. 啟用 IAM 和憑證授權單位服務 API:

    啟用 API 時所需的角色

    如要啟用 API,您需要具備服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

    gcloud services enable cloudresourcemanager.googleapis.com iam.googleapis.com privateca.googleapis.com

  6. 將 Google Cloud CLI 設為使用帳單和配額專案。

    gcloud config set billing/quota_project PROJECT_ID
    

    PROJECT_ID 替換為機群專案的 ID。

必要的角色

如要取得建立受管理 Workload Identity,以及佈建受管理 Workload Identity 憑證所需的權限,請要求系統管理員在專案中授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

選擇 CA 選項

如要簽署工作負載憑證,請選擇最符合您用途的憑證授權單位 (CA) 選項:

  • Google 代管的預設 CA:使用這個選項可獲得全代管的免費解決方案。預設 CA 會為所有 Google Cloud 使用者提供共用的信任根。

  • 自訂 CA:選取這個選項,即可透過憑證授權單位服務設定自己的公用金鑰基礎架構 (PKI)。如果您需要自訂信任根,或是必須將簽署金鑰儲存在硬體安全性模組 (HSM) 中,以符合法規遵循規定,則適合使用這個選項。憑證授權單位服務的費用與受管理的工作負載身分費用分開計算。詳情請參閱「CA 服務定價」。

設定 CA

預設 CA

如要將預設 CA 繫結至 workload identity pool,請使用 use-default-shared-ca 旗標更新 workload identity pool。

  gcloud iam workload-identity-pools update TRUST_DOMAIN_NAME \
      --location="global" \
      --use-default-shared-ca \
      --project=PROJECT_ID

更改下列內容:

  • TRUST_DOMAIN_NAME

    信任網域名稱,格式如下:

      PROJECT_ID.svc.id.goog
    
  • PROJECT_ID: 專案 ID。

自訂 CA

  1. 設定 CA 服務,為代管工作負載身分核發憑證
  2. 將 CA 繫結至 workload identity pool
  3. 授權受管理的工作負載身分,向 CA 集區要求憑證

設定 CA 服務,為受管理的工作負載身分核發憑證

如要為 GKE 設定代管工作負載身分,請先設定憑證授權單位 (CA) 和一或多個從屬 CA。這項設定稱為「CA 階層」

您可以使用 CA 服務集區設定這個階層。透過這個階層,下層 CA 集區會將 X.509 工作負載身分憑證核發給工作負載。

設定根 CA 集區

如要建立根 CA 集區,請按照下列步驟操作:

Enterprise 層級中,使用 gcloud privateca pools create 建立根 CA 集區。 這個層級適用於長期、低用量的憑證核發作業。

gcloud privateca pools create ROOT_CA_POOL_ID \
    --location=REGION \
    --project=CA_PROJECT_ID \
    --tier=enterprise

更改下列內容:

  • ROOT_CA_POOL_ID:根 CA 集區的專屬 ID。ID 長度上限為 64 個字元,且只能包含大小寫英數字元、底線或連字號。集區 ID 在區域內不得重複。

  • REGION:根 CA 集區所在的區域。

  • CA_PROJECT_ID:您要在當中建立根 CA 的專案 ID。

如要進一步瞭解 CA 集區、層級和區域,請參閱「建立 CA 集區」。

設定根 CA

使用 gcloud privateca roots create 在根 CA 集區中建立根 CA。 如果這是根 CA 集區中唯一的 CA,系統可能會提示您啟用根 CA

如要建立根 CA,請執行下列指令:

gcloud privateca roots create ROOT_CA_ID \
    --pool=ROOT_CA_POOL_ID \
    --subject="CN=ROOT_CA_CN, O=ROOT_CA_ORGANIZATION" \
    --key-algorithm="KEY_ALGORITHM" \
    --max-chain-length=1 \
    --location=REGION \
    --project=CA_PROJECT_ID \
    --auto-enable

更改下列內容:

  • ROOT_CA_ID:根 CA 的專屬名稱。CA 名稱長度最多為 64 個字元,且只能包含大小寫英數字元、底線或連字號。CA 名稱在區域內不得重複。
  • ROOT_CA_POOL_ID:根 CA 集區的 ID。
  • ROOT_CA_CN:根 CA 的一般名稱。
  • ROOT_CA_ORGANIZATION:根 CA 的機構。
  • KEY_ALGORITHM:金鑰演算法,例如 ec-p256-sha256
  • REGION:根 CA 集區所在的區域。
  • CA_PROJECT_ID:您建立根 CA 的專案 ID。

如要進一步瞭解 CA 的 subject 欄位,請參閱「主體」。

您也可以選擇在根 CA 集區中建立其他根 CA。這項操作有助於輪替根 CA

設定從屬 CA

您也可以選擇設定下層 CA。設定下層 CA 可協助您:

  • 多個憑證核發情境:如果您有多個憑證核發情境,可以為每個情境建立從屬 CA。

  • 更完善的負載平衡:在 CA 集區中新增多個從屬 CA,有助於更完善地平衡分配憑證要求負載。

如要建立從屬 CA 集區和從屬 CA,請按照下列步驟操作:

  1. DevOps 層級中建立從屬 CA 集區,這個層級適用於大量核發短期憑證。

    gcloud privateca pools create SUBORDINATE_CA_POOL_ID \
        --location=REGION \
        --project=CA_PROJECT_ID \
        --tier=devops
    

    更改下列內容:

    • SUBORDINATE_CA_POOL_ID:下層 CA 集區的專屬 ID。ID 長度上限為 64 個字元,且只能包含大小寫英數字元、底線或連字號。集區 ID 在區域內不得重複。
    • REGION:要建立下層 CA 集區的區域。
    • CA_PROJECT_ID:您建立下層 CA 的專案 ID。

    詳情請參閱「建立 CA 集區」。

  2. 在從屬 CA 集區中建立從屬 CA。請勿變更預設的以設定為準的核發模式

    gcloud privateca subordinates create SUBORDINATE_CA_ID \
        --pool=SUBORDINATE_CA_POOL_ID \
        --location=REGION \
        --issuer-pool=ROOT_CA_POOL_ID \
        --issuer-location=REGION \
        --subject="CN=SUBORDINATE_CA_CN, O=SUBORDINATE_CA_ORGANIZATION" \
        --key-algorithm="KEY_ALGORITHM" \
        --use-preset-profile=subordinate_mtls_pathlen_0 \
        --project=CA_PROJECT_ID \
        --auto-enable
    

    更改下列內容:

    • SUBORDINATE_CA_ID:下層 CA 的專屬名稱。名稱長度上限為 64 個字元,且只能包含大小寫英數字元、底線或連字號。集區名稱在區域內不得重複。
    • SUBORDINATE_CA_POOL_ID:下層 CA 集區的名稱。
    • REGION:從屬 CA 集區所在的區域。
    • ROOT_CA_POOL_ID:根 CA 集區的 ID。
    • REGION:根 CA 集區的區域。
    • SUBORDINATE_CA_CN:下層 CA 的一般名稱。
    • SUBORDINATE_CA_ORGANIZATION:核發機構的下層 CA 名稱。
    • KEY_ALGORITHM:金鑰演算法,例如 ec-p256-sha256
    • CA_PROJECT_ID:您建立下層 CA 的專案 ID。

    如要進一步瞭解 CA 的 subject 欄位,請參閱「主體」。

建立憑證核發設定檔

將 CA 繫結至工作負載身分集區時,需要憑證核發設定。 如要讓工作負載在多個信任網域之間進行驗證,請參閱「啟用工作負載身分集區之間的信任聯盟 (選用)」。

如要設定憑證核發設定,請建立名為 cic.json 的憑證核發設定檔。檔案格式類似於下列範例:

{
  "inlineCertificateIssuanceConfig": {
      "caPools": {
        "REGION1": "projects/CA_PROJECT_NUMBER1/locations/REGION1/caPools/SUBORDINATE_CA_POOL_ID1",
        "REGION2": "projects/CA_PROJECT_NUMBER2/locations/REGION2/caPools/SUBORDINATE_CA_POOL_ID2"
      },
      "lifetime": "DURATION",
      "rotationWindowPercentage": ROTATION_WINDOW_PERCENTAGE,
      "keyAlgorithm": "ALGORITHM"
  }
}

更改下列內容:

  • REGION:CA 所在的區域。

  • CA_PROJECT_NUMBER:您建立下層 CA 集區的專案專案編號。如要從CA_PROJECT_ID專案取得專案編號,請執行下列指令:

    gcloud projects describe CA_PROJECT_ID --format="value(projectNumber)"
    
  • SUBORDINATE_CA_POOL_ID:下層 CA 集區的名稱。

  • ALGORITHM:選用。用來產生私密金鑰的加密演算法。有效值為 ECDSA_P256ECDSA_P384RSA_2048RSA_3072RSA_4096。如未指定,系統會使用 ECDSA_P256 做為預設演算法。

  • DURATION:選用。分葉憑證效期 (以秒為單位)。這個值必須介於 86400 (1 天) 和 2592000 (30 天) 之間。如未指定,系統會使用預設值 86400 (1 天)。核發憑證的實際效期也取決於核發 CA,因為該 CA 可能會限制核發憑證的效期。

  • ROTATION_WINDOW_PERCENTAGE:(選用) 憑證效期達到這個百分比時,就會觸發更新。這個值必須介於 50 至 80 之間。如未指定,系統會使用 50 做為預設值。

將 CA 繫結至 workload identity pool

建立 CA 層級,並為每個 CA 建立憑證核發設定後,請將 CA 繫結至 workload identity pool。如要將 CA 繫結至工作負載身分集區,請使用 CA 的憑證核發設定更新工作負載身分集區。接著,您可以確認集區是否已更新。

更新 workload identity pool

如要更新集區,請執行下列指令:

gcloud iam workload-identity-pools update TRUST_DOMAIN_NAME \
    --location="global" \
    --inline-certificate-issuance-config-file=CIC_JSON_FILE_PATH \
    --project=PROJECT_ID

更改下列內容:

  • TRUST_DOMAIN_NAME:信任網域的名稱,格式如下:

    PROJECT_ID.svc.id.goog
    
  • CIC_JSON_FILE_PATH:您先前建立的 JSON 格式憑證核發設定檔 (cic.json) 路徑。

確認工作負載身分集區已更新

如要確認工作負載身分集區已更新憑證核發設定,請執行下列指令:

gcloud iam workload-identity-pools describe TRUST_DOMAIN_NAME \
    --location="global" \
    --project=PROJECT_ID

TRUST_DOMAIN_NAME 替換為您先前在本文件中更新工作負載身分集區時使用的信任網域名稱。

指令會輸出類似以下的結果:

inlineCertificateIssuanceConfig:
    caPools:
      REGION1: projects/PROJECT_NUMBER1/locations/REGION1/caPools/SUBORDINATE_CA_POOL_ID1,
      REGION2: projects/PROJECT_NUMBER2/locations/REGION2/caPools/SUBORDINATE_CA_POOL_ID2
    keyAlgorithm: ALGORITHM
    lifetime: DURATION
    rotationWindowPercentage: ROTATION_WINDOW_PERCENTAGE
mode: TRUST_DOMAIN
name: PROJECT_ID.svc.id.goog
state: ACTIVE

如果指令輸出內容中沒有 inlineCertificateIssuanceConfig,請確認您已正確設定 gcloud CLI,以便使用正確的專案進行帳單和配額作業。您可能需要更新至新版 gcloud CLI。

授權受管理的工作負載身分,從 CA 集區要求憑證

將 CA 繫結至 workload identity pool 後,請授權受管理的工作負載身分,從 CA 集區要求憑證。如要授權這些身分:

  1. 在每個下層 CA 集區中,將 CA 服務工作負載憑證要求者 (roles/privateca.workloadCertificateRequester) IAM 角色授予信任網域。下列 gcloud privateca pools add-iam-policy-binding 指令會授權信任網域,要求 CA 服務憑證鏈核發憑證。

    gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_ID \
        --location=REGION \
        --role=roles/privateca.workloadCertificateRequester \
        --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/name/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog" \
        --project=CA_PROJECT_ID
    

    更改下列內容:

    • SUBORDINATE_CA_POOL_ID:下層 CA 集區的 ID。
    • REGION:從屬 CA 集區的區域。
    • PROJECT_NUMBER:包含 GKE Workload Identity Pool 的專案編號。

      如要從 PROJECT_ID 取得 PROJECT_NUMBER,請執行下列指令:

      gcloud projects describe PROJECT_ID --format="value(projectNumber)"
      
    • PROJECT_ID:GKE 機群主機專案的專案 ID。

    • CA_PROJECT_ID:您建立下層 CA 的專案 ID。

  2. 將從屬 CA 集區的「CA Service Pool Reader」(CA 服務集區讀取者) (roles/privateca.poolReader) 角色授予受管理的工作負載身分。這樣做可授權代管工作負載身分,從 CA 的憑證鏈結取得已簽署的 X.509 憑證。

    gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_ID \
        --location=REGION \
        --role=roles/privateca.poolReader \
        --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/name/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog" \
        --project=CA_PROJECT_ID
    

    更改下列內容:

    • SUBORDINATE_CA_POOL_ID:下層 CA 集區的 ID。
    • REGION:從屬 CA 集區的區域。
    • PROJECT_NUMBER:包含 GKE Workload Identity Pool 的專案編號。
    • PROJECT_ID:GKE 機群主機專案的專案 ID。
    • CA_PROJECT_ID:您建立下層 CA 的專案 ID。

使用受管理的工作負載身分部署工作負載

設定 CA 集區,為受管理的工作負載身分核發憑證後,您就能部署具有受管理工作負載身分的工作負載。

本節說明如何部署具有代管工作負載身分的測試工作負載。方法是部署 Pod、檢查是否已產生憑證,並查看憑證和 SPIFFE ID。

部署 Pod

如要在叢集中部署測試 Pod,請執行下列操作:

  1. 取得叢集憑證。

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=CLUSTER_ZONE \
        --project=CLUSTER_PROJECT_ID
    
  2. 建立 Kubernetes 命名空間。

    kubectl create namespace KUBERNETES_NAMESPACE
    
  3. 部署測試 PodSpec。

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      namespace: KUBERNETES_NAMESPACE
      name: example-pod
    spec:
      containers:
      - name: main
        image: debian
        command: ['sleep', 'infinity']
        volumeMounts:
        - name: fleet-spiffe-credentials
          mountPath: /var/run/secrets/workload-spiffe-credentials
          readOnly: true
      nodeSelector:
        iam.gke.io/gke-metadata-server-enabled: "true"
      volumes:
      - name: fleet-spiffe-credentials
        csi:
          driver: podcertificate.gke.io
          volumeAttributes:
            signerName: spiffe.gke.io/fleet-svid
            trustDomain: fleet-project/svc.id.goog
    EOF
    

列出工作負載憑證

如要列出工作負載憑證,請執行下列指令。建立憑證可能需要幾分鐘的時間。

kubectl exec -it example-pod -n KUBERNETES_NAMESPACE -- ls  /var/run/secrets/workload-spiffe-credentials

您應該會看到以下的輸出內容:

ca_certificates.pem
certificates.pem
private_key.pem
trust_bundles.json

查看憑證

如要查看認證,請按照下列步驟操作:

  1. 將憑證匯出至憑證檔案。

    kubectl exec -it example-pod --namespace=KUBERNETES_NAMESPACE -- cat /var/run/secrets/workload-spiffe-credentials/certificates.pem | openssl x509 -noout -text > certfile
    
  2. 查看憑證檔案。

    cat certfile
    

    在憑證的 X509v3 Subject Alternative Name 屬性中,您會看到 SPIFFE ID,格式如下:spiffe://PROJECT_ID.svc.id.goog/ns/KUBERNETES_NAMESPACE/sa/default

    default 是指預設的 Kubernetes ServiceAccount。

測試工作負載對工作負載的驗證

如要測試工作負載對工作負載的驗證,請參閱「使用 Go 測試 mTLS 驗證」。

存放區中的程式碼範例會建立用戶端伺服器工作負載。您可以使用本文件稍早產生的憑證,測試工作負載之間的雙向驗證。

啟用工作負載身分集區之間的信任聯盟 (選用)

如要為不同信任網域中的工作負載啟用相互驗證,您必須設定 workload identity pool 之間的信任聯盟。只有在工作負載需要向不同 workload identity pool 中的工作負載進行驗證時,才需要執行這個步驟。

如要啟用信任同盟,請完成下列步驟:

  1. 建立信任設定檔
  2. 更新工作負載身分集區的信任設定

建立信任設定檔

建立信任設定檔,並在 inlineTrustConfig 區段中指定每個網域的憑證。

信任設定檔包含一組信任錨點,受管理的工作負載身分會使用這些錨點驗證對等互連憑證。信任設定檔會將 SPIFFE 信任網域對應至 CA 憑證。

  1. 如為自訂 CA,請下載使用自訂 CA 的信任網域憑證。

    gcloud privateca pools get-ca-certs ROOT_CA_POOL_ID \
        --output-file=CERTIFICATE_PATH \
        --location=REGION
    

    更改下列內容:

    • ROOT_CA_POOL_ID:根 CA 集區的 ID。
    • CERTIFICATE_PATH:PEM 編碼憑證的輸出路徑。
    • REGION:根 CA 集區的區域。
  2. 建立名為 tc.json 的檔案,其中包含內嵌信任設定。如果網域使用 Google 代管的預設 CA,請使用 trustDefaultSharedCa 欄位。如果網域使用自訂 CA,請使用先前下載的 PEM 編碼憑證。

    檔案內容應如下所示:

    在這個範例中,TRUST_DOMAIN_A 使用 Google 代管的預設 CA,TRUSTED_DOMAIN_B 則使用自訂 CA 和下載的根憑證。

    {
      "inlineTrustConfig": {
        "additionalTrustBundles": {
          "TRUST_DOMAIN_A": {
            "trustDefaultSharedCa": true
          },
          "TRUSTED_DOMAIN_B": {
            "trustAnchors": [
              {
                  "pemCertificate": "-----BEGIN CERTIFICATE-----\nCERTIFICATE_MATERIAL1\n-----END CERTIFICATE-----"
              },
              {
                  "pemCertificate": "-----BEGIN CERTIFICATE-----\nCERTIFICATE_MATERIAL2\n-----END CERTIFICATE-----"
              }
            ]
          }
        }
      }
    }
    

    更改下列內容:

    • TRUST_DOMAIN_A:使用 Google 管理預設 CA 的信任網域名稱。
    • TRUST_DOMAIN_B:使用自訂 CA 的信任網域名稱。
    • CERTIFICATE_MATERIAL:一組 PEM 格式的 CA 憑證,這些憑證受信任,可核發信任網域中的憑證。

更新 workload identity pool 的信任設定

gcloud iam workload-identity-pools update TRUST_DOMAIN_NAME \
    --location="global" \
    --inline-trust-config-file=TC_JSON_FILE_PATH \
    --project=PROJECT_ID

更改下列內容:

  • TRUST_DOMAIN_NAME:信任網域的名稱。
  • TC_JSON_FILE_PATH:您建立的 JSON 格式信任設定檔 (tc.json) 路徑。
  • PROJECT_ID:專案 ID。

後續步驟

歡迎試用

如果您未曾使用過 Google Cloud,歡迎建立帳戶來評估我們的產品在實際工作環境中的成效。新客戶也能獲得價值 $300 美元的免費抵免額,可用於處理、測試及部署工作負載。

免費試用