設定地端叢集

本文說明如何為 Google Distributed Cloud 建立的地端叢集設定 Binary Authorization。然後說明如何設定二進位授權政策範例。

事前準備

  1. 確認叢集使用支援的 Google Distributed Cloud 版本。Binary Authorization 支援下列環境。

    裸機

    Google Distributed Cloud 1.14 或 1.15。如果是 1.16 以上版本,您可以在建立或更新叢集時設定二進位授權

    VMware

    Distributed Cloud for VMware (Google Distributed Cloud) 1.4 以上版本。

  2. Binary Authorization 服務會使用可透過一般網際網路連線存取的外部 IP 位址。設定 HTTPS 的 防火牆規則 ,允許使用者叢集存取端點 binaryauthorization.googleapis.com

  3. 如要使用集中式 Cloud 稽核記錄查看稽核記錄項目,包括來自叢集外部 Google Cloud的二進位授權項目,您必須在叢集設定中設定 Cloud 稽核記錄。

    裸機

    Google Distributed Cloud 中設定 Cloud Audit Logs。

    VMware

    Google Distributed Cloud 中設定 Cloud Audit Logs。

  4. 您必須按照下列步驟啟用 Binary Authorization API:

    1. 前往 Google Cloud 控制台。

      啟用 API

    2. 在專案下拉式清單中,選取車隊主專案。您可以在使用者叢集設定檔的 gkeConnect 區段中找到這個值。這個 Google Cloud 專案 會將使用者叢集連結至 Google Cloud。

設定二進位授權

在本節中,您將在內部部署叢集中設定二進位授權。

指定安裝環境變數

如要指定環境變數,請執行下列操作:

使用 Workload Identity

  1. 指定機群主專案:

    export PROJECT_ID=PROJECT_ID
    
  2. 將機群成員 ID 設為叢集 ID:

    執行 gcloud container fleet memberships list 指令時,會員 ID 會列在 NAME 欄中。

    export MEMBERSHIP_ID=CLUSTER_NAME
    

使用服務帳戶金鑰

  1. 指定機群主專案:

    export PROJECT_ID=PROJECT_ID
    

    PROJECT_ID 替換為使用者叢集設定檔gkeConnect 部分中的專案。 Google Cloud

  2. 指定使用者叢集 kubeconfig 檔案的路徑:

    export KUBECONFIG=PATH
    

    PATH 替換為使用者叢集 kubeconfig 檔案的路徑。

  3. 為 Binary Authorization API 存取服務帳戶選擇名稱:

    export SA_NAME=SERVICE_ACCOUNT_NAME
    

    SERVICE_ACCOUNT_NAME 替換為您選擇的服務帳戶名稱。二進位授權模組會使用這個服務帳戶存取 Binary Authorization API。

  4. 指定您稍後在本指南中下載的服務帳戶金鑰檔案路徑:

    export SA_JSON_PATH=SA_KEY_FILE_PATH
    

    SA_KEY_FILE_PATH 替換為服務帳戶的 JSON 金鑰檔案路徑。

在使用者叢集中安裝二進位授權模組

如要安裝 Binary Authorization 模組,請按照下列步驟操作:

使用 Workload Identity

有了 Fleet Workload Identity,叢集中的工作負載就能向 Google 進行驗證,不必下載、手動輪替及一般管理 Google Cloud 服務帳戶金鑰。如要進一步瞭解機群 Workload Identity 的運作方式和使用優勢,請參閱「使用機群 Workload Identity」。

  1. 在車隊主專案中,將 binaryauthorization.policyEvaluator 角色授予 Kubernetes 服務帳戶:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${PROJECT_ID}.svc.id.goog[binauthz-system/binauthz-admin]" \
        --role="roles/binaryauthorization.policyEvaluator"
    
  2. 建立工作目錄:

    1. 建立名為 binauthz 的目錄。

    2. 切換至該目錄。

  3. 下載 manifest-wi-0.2.6.yaml.tmpl 檔案,用於在使用者叢集中安裝 Binary Authorization Module:

    裸機

    gcloud storage cp gs://anthos-baremetal-release/binauthz/manifest-wi-0.2.6.yaml.tmpl .
    

    VMware

    gcloud storage cp gs://gke-on-prem-release/binauthz/manifest-wi-0.2.6.yaml.tmpl .
    
  4. 在範本中替換環境變數:

    envsubst < manifest-wi-0.2.6.yaml.tmpl > manifest-0.2.6.yaml
    
  5. 在使用者叢集中安裝二進位授權模組:

    kubectl apply -f manifest-0.2.6.yaml
    
  6. 確認 Deployment 已建立:

    kubectl get pod --namespace binauthz-system
    

    您會看到 Pod binauthz-module-deployment-* 列出 StatusRunning 和 1/1 個 Pod 已就緒,類似於以下輸出內容:

    NAME                                          READY   STATUS    RESTARTS   AGE
    binauthz-module-deployment-5fddf9594f-qjprz   1/1     Running   0          11s
    

使用服務帳戶金鑰

  1. 設定 Google Cloud CLI 的預設專案:

    gcloud config set project ${PROJECT_ID}
    
  2. 建立 Binary Authorization API 存取服務帳戶:

    gcloud iam service-accounts create ${SA_NAME}
    
  3. 在機群主專案中,將 binaryauthorization.policyEvaluator 角色授予 Binary Authorization API 存取服務帳戶:

    gcloud projects add-iam-policy-binding ${PROJECT_ID}\
        --member="serviceAccount:${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
        --role="roles/binaryauthorization.policyEvaluator"
    
  4. 建立工作目錄:

    1. 建立名為 binauthz 的目錄。

    2. 切換至該目錄。

  5. 下載 manifest-0.2.6.yaml 檔案,用於在使用者叢集中安裝 Binary Authorization Module:

    裸機

    gcloud storage cp gs://anthos-baremetal-release/binauthz/manifest-0.2.6.yaml .
    

    VMware

    gcloud storage cp gs://gke-on-prem-release/binauthz/manifest-0.2.6.yaml .
    
  6. binauthz-system 命名空間建立 YAML 檔案。

    將下列內容複製到名為 namespace.yaml 的檔案:

    apiVersion: v1
    kind: Namespace
    metadata:
      labels:
        control-plane: binauthz-controller
      name: binauthz-system
    
  7. 在使用者叢集中建立命名空間:

    kubectl apply -f namespace.yaml
    

    畫面會顯示類似以下內容的輸出:

    namespace/binauthz-system created
    
  8. 下載服務帳戶的 JSON 金鑰檔案:

    gcloud iam service-accounts keys create ${SA_JSON_PATH} --iam-account ${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
    
  9. 將服務帳戶金鑰儲存為使用者叢集中的 Kubernetes 密鑰:

    kubectl --namespace binauthz-system create secret generic binauthz-sa --from-file=key.json=${SA_JSON_PATH}
    
  10. 在使用者叢集中安裝二進位授權模組:

    kubectl apply -f manifest-0.2.6.yaml
    
  11. 確認 Deployment 已建立:

    kubectl get pod --namespace binauthz-system
    

    您會看到 Pod binauthz-module-deployment-* 列出 StatusRunning 和 1/1 個 Pod 已就緒,類似於以下輸出內容:

    NAME                                          READY   STATUS    RESTARTS   AGE
    binauthz-module-deployment-5fddf9594f-qjprz   1/1     Running   0          11s
    

設定及使用二進位授權政策

本節說明如何為地端叢集設定及使用 Binary Authorization 政策。

在每個範例中,您都會設定政策,然後嘗試在叢集中部署容器映像檔,藉此測試政策。

全部允許

本節將示範成功案例。您可設定二進位授權政策,確保容器映像檔符合政策規定並完成部署。

在 Google Cloud中執行下列操作:

控制台

  1. 前往 Google Cloud 控制台的「Binary Authorization」頁面。

    前往二進位授權

  2. 請務必選取車隊主專案 ID。

  3. 點選「編輯政策」

  4. 在「專案預設規則」下方,選取「允許所有圖片」。

  5. 點選 [儲存政策]

gcloud

  1. 為機群主專案設定 PROJECT_ID。您可以在使用者叢集設定檔的 gkeConnect 欄位中找到這個專案 ID。

    export PROJECT_ID=PROJECT_ID
    

    設定預設 Google Cloud 專案。

    gcloud config set project ${PROJECT_ID}
    
  2. 將政策 YAML 檔案匯出至本機系統:

    gcloud container binauthz policy export  > policy.yaml
    

    YAML 檔案如下所示:

    defaultAdmissionRule:
      enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
      evaluationMode: ALWAYS_ALLOW
    globalPolicyEvaluationMode: ENABLE
    name: projects/<var>PROJECT_ID</var>/policy
    
  3. 編輯 policy.yaml

  4. evaluationMode 設為 ALWAYS_ALLOW

  5. 如果檔案中有 requireAttestationsBy 區塊,請刪除這個區塊。

  6. 儲存檔案。

  7. 匯入 policy.yaml,如下所示:

    gcloud container binauthz policy import policy.yaml
    

如要將豁免圖片新增至允許清單,請在政策檔案中加入下列內容:

admissionWhitelistPatterns:
  - namePattern: EXEMPT_IMAGE_PATH

EXEMPT_IMAGE_PATH 替換為要排除的圖片路徑。如要豁免其他圖片,請新增其他 - namePattern 項目。進一步瞭解 admissionWhitelistPatterns

在管理員工作站上執行下列操作:

  1. 為 Pod 建立資訊清單檔案。

    請將以下內容儲存為 pod.yaml 檔案:

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      containers:
      - name: test-container
        image: us-docker.pkg.dev/google-samples/containers/gke/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4
    
  2. 建立 Pod:

    kubectl apply -f pod.yaml
    

    您會看到 Pod 部署成功的訊息。

  3. 刪除 Pod:

    kubectl delete -f pod.yaml
    

全部不允許

本節將示範失敗案例。在本節中,您將設定預設政策,禁止部署容器映像檔。

在 Google Cloud 中執行下列操作:

控制台

  1. 前往 Google Cloud 控制台的「Binary Authorization」頁面。

    前往二進位授權

  2. 確認已選取機群主專案。

  3. 點選「編輯政策」

  4. 在「專案預設規則」下方,選取「禁止所有圖片」

  5. 按一下 [Save Policy] (儲存政策)。

gcloud

  1. PROJECT_ID 設為車隊主專案 ID。

    export PROJECT_ID=PROJECT_ID
    
  2. 設定預設 Google Cloud 專案。

    gcloud config set project ${PROJECT_ID}
    
  3. 匯出政策 YAML 檔案:

    gcloud container binauthz policy export  > policy.yaml
    
  4. 編輯 policy.yaml

  5. evaluationMode 設為 ALWAYS_DENY

  6. 如果檔案中有 requireAttestationsBy 區塊,請刪除這個區塊。

  7. 儲存檔案。

  8. 匯入 policy.yaml,如下所示:

    gcloud container binauthz policy import policy.yaml
    

在管理員工作站上執行下列操作:

  1. 為 Pod 建立資訊清單檔案。

    請將以下內容儲存為 pod.yaml 檔案:

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      containers:
      - name: test-container
        image: us-docker.pkg.dev/google-samples/containers/gke/hello-app@sha256:c62ead5b8c15c231f9e786250b07909daf6c266d0fcddd93fea882eb722c3be4
    
  2. 建立 Pod:

    kubectl apply -f pod.yaml
    

    您會看到系統禁止部署 Pod。輸出內容如下所示:

    Error from server (VIOLATES_POLICY): error when creating "pod.yaml": admission webhook "binaryauthorization.googleapis.com" denied the request: Denied by default admission rule. Overridden by evaluation mode
    

取得使用者叢集資源 ID

本節說明如何為使用者叢集編寫叢集資源 ID。您可以在二進位授權政策中建立叢集專屬規則。您會將這些規則與叢集專屬資源 ID 建立關聯,而該 ID 是以叢集 ID 為準。

您會取得如下的資源 ID:

控制台

  1. 前往 Google Cloud 控制台的 GKE「Clusters」(叢集) 頁面。

    前往叢集

  2. 選取叢集的機群主專案 ID。 您可以在使用者叢集設定檔的gkeConnect 區段中找到這個專案 ID。

  3. 在叢集清單中,找出「名稱」欄下方的叢集 ID。

  4. 如要建立資源 ID,請在叢集 ID 中加入 global. 前置字元,讓資源 ID 採用下列格式:global.CLUSTER_ID

gcloud

  1. 使用 SSH 連線至管理工作站。

  2. 在管理員工作站上執行下列指令:

    kubectl get membership -o yaml
    
  3. 從輸出內容的 spec.owner.id 欄位取得叢集 ID。輸出內容範例如下:

    apiVersion: v1
    items:
    - apiVersion: hub.gke.io/v1
      kind: Membership
      ...
      spec:
        owner:
          id: //gkehub.googleapis.com/projects/PROJECT_NUMBER/locations/global/memberships/my-cluster-id
    

    在範例輸出內容中,叢集 ID 為 my-cluster-id

  4. 如要建立資源 ID,請在叢集 ID 中新增 global. 前置字串。在本範例中,資源 ID 為 global.my-cluster-id

定義叢集專屬規則時,您會使用這個資源 ID。瞭解如何使用Google Cloud 控制台gcloud CLI 設定叢集專屬規則。

更新失敗政策

您可以將二進位授權模組 Webhook 設為「開放失敗」或「封閉失敗」

結案 (未成交)

如要將失敗政策更新為「fail close」,請按照下列步驟操作:

  1. 編輯 manifest-0.2.6.yaml 檔案,並將 failurePolicy 設為 Fail

  2. 重新啟用 Webhook:

    kubectl apply -f manifest-0.2.6.yaml
    

    畫面會顯示類似以下內容的輸出:

    serviceaccount/binauthz-admin unchanged
    role.rbac.authorization.k8s.io/binauthz-role configured
    clusterrole.rbac.authorization.k8s.io/binauthz-role configured
    rolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged
    clusterrolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged
    secret/binauthz-tls unchanged
    service/binauthz unchanged
    deployment.apps/binauthz-module-deployment unchanged
    validatingwebhookconfiguration.admissionregistration.k8s.io/binauthz-validating-webhook-configuration configured
    

失敗時維持開放狀態

如要將失敗政策更新為「失敗時開放」,請按照下列步驟操作:

  1. 編輯 manifest-0.2.6.yaml 檔案,並將 failurePolicy 設為 Ignore

  2. 重新啟用 Webhook:

    kubectl apply -f manifest-0.2.6.yaml
    

    畫面會顯示類似以下內容的輸出:

    serviceaccount/binauthz-admin unchanged
    role.rbac.authorization.k8s.io/binauthz-role configured
    clusterrole.rbac.authorization.k8s.io/binauthz-role configured
    rolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged
    clusterrolebinding.rbac.authorization.k8s.io/binauthz-rolebinding unchanged
    secret/binauthz-tls unchanged
    service/binauthz unchanged
    deployment.apps/binauthz-module-deployment unchanged
    validatingwebhookconfiguration.admissionregistration.k8s.io/binauthz-validating-webhook-configuration configured
    

詳情請參閱網頁掛鉤失敗政策

清除所用資源

  1. 以下程式碼範例說明如何停用 Webhook:

    kubectl delete ValidatingWebhookConfiguration/binauthz-validating-webhook-configuration
    
  2. 以下程式碼範例說明如何重新啟用 Webhook:

    kubectl apply -f manifest-0.2.6.yaml
    
  3. 下列程式碼範例說明如何刪除與二進位授權相關的所有資源:

    kubectl delete -f manifest-0.2.6.yaml
    kubectl delete namespace binauthz-system
    

後續步驟