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

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

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

  1. 設定憑證授權單位服務,為受管理的工作負載身分核發憑證

  2. 將 CA 繫結至工作負載身分集區

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

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

Google 管理的工作負載身分集區

將叢集新增至 GKE 叢集組時,叢集組會自動建立 Google 管理的工作負載身分識別集區,做為信任網域的根層級。Google 管理的工作負載身分集區有下列限制:

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

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

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

多專案設定

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

事前準備

  1. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

  3. 確認您至少有一個 GKE 叢集。請確認叢集執行的是 1.33.0-gke.2248000 以上版本。

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

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

    gcloud container clusters update CLUSTER_NAME \
        --enable-workload-identity \
        --enable-fleet \
        --fleet-project=PROJECT_ID
    

    更改下列內容:

    • CLUSTER_NAME:要向 GKE 叢集機群註冊的 GKE 叢集名稱
    • PROJECT_ID:GKE 艦隊主機專案 ID
  5. Enable the IAM and Certificate Authority Service APIs:

    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。

必要的角色

如要取得建立受管理工作負載身分和佈建受管理工作負載身分憑證所需的權限,請要求管理員授予您專案的下列 IAM 角色:

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

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

設定 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 繫結至工作負載身分池,CA 必須具備憑證核發設定。視需要,您也可以使用信任設定設定更新集區,讓工作負載跨多個信任網域進行驗證。

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

{
  "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_P256 (預設)、ECDSA_P384RSA_2048RSA_3072RSA_4096

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

  • ROTATION_WINDOW_PERCENTAGE:選用:憑證效期百分比,達到這個百分比時會觸發更新。 這個值必須介於 50 至 80 之間。預設值為 50。

建立信任設定檔

根據預設,同一信任網域內的工作負載可以使用受管理的工作負載 ID 相互驗證。如要讓不同信任網域中的工作負載相互驗證,您需要在工作負載身分集區中明確宣告信任關係。方法是建立信任設定檔,其中包含為每個網域提供憑證的 inlineTrustConfig

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

如要建立信任設定檔,請執行下列步驟:

  1. 下載憑證。

    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. 建立包含內嵌信任設定的檔案,並使用 PEM 格式的憑證。檔案內容大致如下:
    {
      "inlineTrustConfig": {
        "additionalTrustBundles": {
          "TRUST_DOMAIN_NAME1": {
            "trustAnchors": [
              {
                  "pemCertificate": "-----BEGIN CERTIFICATE-----\nCERTIFICATE_MATERIAL1\n-----END CERTIFICATE-----"
              },
              {
                  "pemCertificate": "-----BEGIN CERTIFICATE-----\nCERTIFICATE_MATERIAL2\n-----END CERTIFICATE-----"
              }
            ]
          },
          "TRUSTED_DOMAIN_NAME2": {
            "trustAnchors": [
              {
                  "pemCertificate": "-----BEGIN CERTIFICATE-----\nCERTIFICATE_MATERIAL3\n-----END CERTIFICATE-----"
              },
              {
                  "pemCertificate": "-----BEGIN CERTIFICATE-----\nCERTIFICATE_MATERIAL4\n-----END CERTIFICATE-----"
              }
            ]
          }
        }
      }
    }
    

    更改下列內容:

    • TRUST_DOMAIN_NAME:信任網域名稱,格式如下:
      PROJECT_ID.svc.id.goog
      
    • CERTIFICATE_MATERIAL:一組 PEM 格式的 CA 憑證,這些憑證受信任,可在信任網域中核發憑證。

將 CA 繫結至工作負載身分集區

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

更新工作負載身分集區

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

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

更改下列內容:

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

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

  • TC_JSON_FILE_PATH:選用。您先前建立的 JSON 格式信任設定檔 (tc.json) 路徑。如果工作負載會跨不同信任網域進行驗證,您必須指定這個檔案。否則可以省略 --inline-trust-config

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

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

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
inlineTrustConfig:
    additionalTrustBundles:
      example.com:
          trustAnchors:
          - pemCertificate: |-
            -----BEGIN CERTIFICATE-----
            CERTIFICATE_MATERIAL1
            -----END CERTIFICATE-----
          - pemCertificate: |-
            -----BEGIN CERTIFICATE-----
            CERTIFICATE_MATERIAL2
            -----END CERTIFICATE-----
      myorg.com:
          trustAnchors:
          - pemCertificate: |-
            -----BEGIN CERTIFICATE-----
            CERTIFICATE_MATERIAL3
            -----END CERTIFICATE-----
          - pemCertificate: |-
            -----BEGIN CERTIFICATE-----
            CERTIFICATE_MATERIAL4
            -----END CERTIFICATE-----
name: PROJECT_ID.svc.id.goog
state: ACTIVE

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

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

將 CA 繫結至工作負載身分集區後,您必須授權受管理的工作負載身分,才能向 CA 集區要求憑證。如要授權這些身分,請按照下列步驟操作:

  1. 在每個從屬 CA 集區上,將 CA 服務工作負載憑證要求者 (roles/privateca.workloadCertificateRequester) 身分與存取權管理角色授予信任網域。 下列 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 工作負載身分集區的專案編號。

      如要從 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 (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 工作負載身分集區的專案編號。
    • 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 驗證」。

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

後續步驟

歡迎試用

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

免費試用