設定內部部署叢集

本文說明如何為 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 稽核記錄。

    VMware

    Google Distributed Cloud 中設定 Cloud 稽核記錄。

  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-* 列出 Status of Running,且 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-* 列出 Status of Running,且 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 控制台中,前往「二進位授權」頁面。

    前往二進位授權

  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 控制台中,前往「二進位授權」頁面。

    前往二進位授權

  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」(叢集) 頁面。

    前往「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

如要將失敗政策更新為「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
    

後續步驟