本文說明如何為 Google Distributed Cloud 建立的地端叢集設定 Binary Authorization。然後說明如何設定二進位授權政策範例。
事前準備
確認叢集使用支援的 Google Distributed Cloud 版本。Binary Authorization 支援下列環境。
裸機
Google Distributed Cloud 1.14 或 1.15。如果是 1.16 以上版本,您可以在建立或更新叢集時設定二進位授權。
VMware
Distributed Cloud for VMware (Google Distributed Cloud) 1.4 以上版本。
Binary Authorization 服務會使用可透過一般網際網路連線存取的外部 IP 位址。設定 HTTPS 的 防火牆規則 ,讓使用者叢集存取端點
binaryauthorization.googleapis.com
。裸機
VMware
如要使用集中式 Cloud 稽核記錄查看稽核記錄項目,包括來自 Google Cloud外部叢集的二進位授權項目,您必須在叢集設定中設定 Cloud 稽核記錄。
裸機
在 Google Distributed Cloud 中設定 Cloud 稽核記錄。
VMware
在 Google Distributed Cloud 中設定 Cloud 稽核記錄。
您必須啟用 Binary Authorization API,方法如下:
前往 Google Cloud 控制台。
在專案下拉式清單中,選取車隊主專案。您可以在使用者叢集設定檔的
gkeConnect
區段中找到這個值。這是將使用者叢集連結至 Google Cloud的 Google Cloud 專案 。
設定二進位授權
在本節中,您將在內部部署叢集中設定二進位授權。
指定安裝環境變數
如要指定環境變數,請執行下列操作:
使用 Workload Identity
指定機群主專案:
export PROJECT_ID=PROJECT_ID
將機群成員 ID 設為叢集 ID:
執行
gcloud container fleet memberships list
指令時,會員 ID 會列在NAME
欄中。export MEMBERSHIP_ID=CLUSTER_NAME
使用服務帳戶金鑰
指定機群主專案:
export PROJECT_ID=PROJECT_ID
將 PROJECT_ID 替換為使用者叢集設定檔
gkeConnect
部分中的專案。 Google Cloud指定使用者叢集 kubeconfig 檔案的路徑:
export KUBECONFIG=PATH
將 PATH 替換為使用者叢集 kubeconfig 檔案的路徑。
為 Binary Authorization API 存取服務帳戶選擇名稱:
export SA_NAME=SERVICE_ACCOUNT_NAME
將 SERVICE_ACCOUNT_NAME 改成您選擇的服務帳戶名稱。二進位授權模組會使用這個服務帳戶存取 Binary Authorization API。
指定您稍後在本指南中下載的服務帳戶金鑰檔案路徑:
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」。
在車隊主專案中,將
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"
建立工作目錄:
建立名為
binauthz
的目錄。切換至該目錄。
下載
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 .
在範本中替換環境變數:
envsubst < manifest-wi-0.2.6.yaml.tmpl > manifest-0.2.6.yaml
在使用者叢集中安裝二進位授權模組:
kubectl apply -f manifest-0.2.6.yaml
確認 Deployment 已建立:
kubectl get pod --namespace binauthz-system
您會看到 Pod
binauthz-module-deployment-*
列出Status
ofRunning
,且 1/1 個 Pod 已就緒,類似於以下輸出內容:NAME READY STATUS RESTARTS AGE binauthz-module-deployment-5fddf9594f-qjprz 1/1 Running 0 11s
使用服務帳戶金鑰
設定 Google Cloud CLI 的預設專案:
gcloud config set project ${PROJECT_ID}
建立 Binary Authorization API 存取服務帳戶:
gcloud iam service-accounts create ${SA_NAME}
在機群主專案中,將
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"
建立工作目錄:
建立名為
binauthz
的目錄。切換至該目錄。
下載
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 .
建立
binauthz-system
命名空間的 YAML 檔案。將下列內容複製到名為
namespace.yaml
的檔案:apiVersion: v1 kind: Namespace metadata: labels: control-plane: binauthz-controller name: binauthz-system
在使用者叢集中建立命名空間:
kubectl apply -f namespace.yaml
畫面會顯示類似以下內容的輸出:
namespace/binauthz-system created
下載服務帳戶的 JSON 金鑰檔案:
gcloud iam service-accounts keys create ${SA_JSON_PATH} --iam-account ${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
將服務帳戶金鑰儲存為使用者叢集中的 Kubernetes 密鑰:
kubectl --namespace binauthz-system create secret generic binauthz-sa --from-file=key.json=${SA_JSON_PATH}
在使用者叢集中安裝二進位授權模組:
kubectl apply -f manifest-0.2.6.yaml
確認 Deployment 已建立:
kubectl get pod --namespace binauthz-system
您會看到 Pod
binauthz-module-deployment-*
列出Status
ofRunning
,且 1/1 個 Pod 已就緒,類似於以下輸出內容:NAME READY STATUS RESTARTS AGE binauthz-module-deployment-5fddf9594f-qjprz 1/1 Running 0 11s
設定及使用二進位授權政策
本節說明如何為地端叢集設定及使用 Binary Authorization 政策。
在每個範例中,您都會設定政策,然後嘗試在叢集中部署容器映像檔,藉此測試政策。
全部允許
本節將示範成功案例。您可設定二進位授權政策,確保容器映像檔符合政策規定並完成部署。
在 Google Cloud中執行下列操作:
主控台
在 Google Cloud 控制台中,前往「二進位授權」頁面。
請務必選取車隊主專案 ID。
按一下「編輯政策」。
在「專案預設規則」下方,選取「允許所有圖片」。
點選 [儲存政策]。
gcloud
為機群主專案設定
PROJECT_ID
。您可以在使用者叢集設定檔的gkeConnect
欄位中找到這個專案 ID。export PROJECT_ID=PROJECT_ID
設定預設 Google Cloud 專案。
gcloud config set project ${PROJECT_ID}
將政策 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
編輯
policy.yaml
。將
evaluationMode
設為ALWAYS_ALLOW
。如果檔案中有
requireAttestationsBy
區塊,請刪除這個區塊。儲存檔案。
匯入
policy.yaml
,如下所示:gcloud container binauthz policy import policy.yaml
如要將豁免圖片加入許可清單,請在政策檔案中新增下列內容:
admissionWhitelistPatterns: - namePattern: EXEMPT_IMAGE_PATH
將 EXEMPT_IMAGE_PATH
替換為要排除的圖片路徑。如要排除其他圖片,請新增其他 - namePattern
項目。進一步瞭解 admissionWhitelistPatterns
。
在管理員工作站上執行下列操作:
為 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
建立 Pod:
kubectl apply -f pod.yaml
您會看到 Pod 部署成功的訊息。
刪除 Pod:
kubectl delete -f pod.yaml
全部不允許
本節將示範失敗案例。在本節中,您會設定預設政策,禁止部署容器映像檔。
在 Google Cloud 中執行下列操作:
主控台
在 Google Cloud 控制台中,前往「二進位授權」頁面。
確認已選取機群主專案。
按一下「編輯政策」。
在「專案預設規則」下方,選取「禁止所有圖片」。
按一下 [Save Policy] (儲存政策)。
gcloud
將
PROJECT_ID
設為車隊主專案 ID。export PROJECT_ID=PROJECT_ID
設定預設 Google Cloud 專案。
gcloud config set project ${PROJECT_ID}
匯出政策 YAML 檔案:
gcloud container binauthz policy export > policy.yaml
編輯
policy.yaml
。將
evaluationMode
設為ALWAYS_DENY
。如果檔案中有
requireAttestationsBy
區塊,請刪除這個區塊。儲存檔案。
匯入
policy.yaml
,如下所示:gcloud container binauthz policy import policy.yaml
在管理員工作站上執行下列操作:
為 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
建立 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:
主控台
前往 Google Cloud 控制台的 GKE「Clusters」(叢集) 頁面。
選取叢集的機群主專案 ID。 您可以在使用者叢集設定檔的
gkeConnect
區段中找到這個專案 ID。在叢集清單中,找出「名稱」欄下方的叢集 ID。
如要建立資源 ID,請在叢集 ID 中加入
global.
前置字元,讓資源 ID 採用下列格式:global.CLUSTER_ID
。
gcloud
使用 SSH 連線至管理工作站。
在管理員工作站上執行下列指令:
kubectl get membership -o yaml
從輸出內容的
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
。如要建立資源 ID,請在叢集 ID 中新增
global.
前置字串。在本範例中,資源 ID 為global.my-cluster-id
。
定義叢集專屬規則時,您會使用這個資源 ID。瞭解如何使用Google Cloud 控制台或 gcloud CLI 設定叢集專屬規則。
更新失敗政策
您可以將二進位授權模組 Webhook 設為「開放失敗」或「封閉失敗」。
Fail close
如要將失敗政策更新為「fail close」,請執行下列步驟:
編輯 manifest-0.2.6.yaml 檔案,並將 failurePolicy 設為
Fail
重新啟用 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
失敗時維持開放狀態
如要將失敗政策更新為「失敗開放」,請執行下列步驟:
編輯 manifest-0.2.6.yaml 檔案,並將 failurePolicy 設為
Ignore
重新啟用 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
詳情請參閱網頁掛鉤失敗政策。
清除所用資源
以下程式碼範例說明如何停用 Webhook:
kubectl delete ValidatingWebhookConfiguration/binauthz-validating-webhook-configuration
以下程式碼範例說明如何重新啟用 Webhook:
kubectl apply -f manifest-0.2.6.yaml
下列程式碼範例說明如何刪除與二進位授權相關的所有資源:
kubectl delete -f manifest-0.2.6.yaml kubectl delete namespace binauthz-system
後續步驟
- 如要在建立 Pod 時檢查是否符合政策規定,但實際上不會阻止建立 Pod,請參閱「啟用模擬測試」。
- 如要強制建立 Pod,但二進位授權強制執行程式會封鎖該 Pod,請參閱「使用緊急措施」。
- 使用
built-by-cloud-build
簽署者只部署 Cloud Build 建構的映像檔。 - 如要實作以驗證者為準的二進位授權政策,請參閱下列文章:
- 使用 Google Cloud 控制台或指令列工具設定政策。設定預設或叢集專屬規則,要求認證。
- 使用Google Cloud 控制台或指令列工具建立驗證者。
- 建立認證。
- 如要查看與 Distributed Cloud 適用的 Binary Authorization 相關的記錄事件,請參閱「查看 Cloud 稽核記錄事件」。
- 監控指標。