使用 GKE 設定二進位授權政策
本快速入門導覽課程說明如何設定及測試二進位授權政策中的基本規則。
在本快速入門導覽課程中,您將查看及設定政策中的預設規則。預設規則允許部署所有映像檔。您可以在 Google Kubernetes Engine (GKE) 叢集上部署容器映像檔,藉此進行測試。接著,您將預設規則設為禁止部署所有映像檔,並嘗試部署映像檔。
事前準備
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Binary Authorization APIs.
-
Install the Google Cloud CLI.
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
如要初始化 gcloud CLI,請執行下列指令:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Binary Authorization APIs.
-
Install the Google Cloud CLI.
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
如要初始化 gcloud CLI,請執行下列指令:
gcloud init
- 安裝
kubectl
。 在 Google Cloud 控制台中,前往 GKE「Kubernetes clusters」(Kubernetes 叢集) 頁面:
點選「建立」。
在「建立 Autopilot 叢集」中,執行下列步驟:
在「Name」(名稱) 欄位中輸入
test-cluster
。在「Region」(區域) 選單中選取「
us-central1
」。展開「進階設定」部分。
按一下「安全性」連結,即可顯示「安全性」面板。
在「安全性」面板中,勾選「啟用二進位授權」核取方塊。
選取「僅限強制執行」。
依序點選「下一步」和「下一步:檢閱並建立」。
如要開始建立叢集,請按一下「建立」。
前往 Google Cloud 控制台的「Binary Authorization」(二進位授權) 頁面。
主控台會顯示政策的詳細資料。
按一下「編輯政策」。
「專案預設規則」中已選取「允許所有映像檔」選項。
前往Google Cloud 控制台中的 GKE「Clusters」(叢集) 頁面。
按一下 [Deploy] (部署)。
控制台會提示您輸入部署作業的詳細資料。
選取「現有容器映像檔」。
輸入
us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
做為容器映像檔路徑。按一下「繼續」。
在「Application Name」(應用程式名稱) 欄位中輸入
hello-server
。按一下 [Deploy] (部署)。
更新本機
kubeconfig
檔案:gcloud container clusters get-credentials \ --zone us-central1-a \ test-cluster
這會提供在 GKE 中存取叢集所需的憑證和端點資訊。
部署映像檔:
kubectl run hello-server --image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080
返回Google Cloud 控制台的 GKE「Workloads」(工作負載) 頁面。
選取
hello-server
工作負載。點選「刪除」。
返回 Google Cloud 控制台的「Binary Authorization」(二進位授權) 頁面。
按一下「編輯政策」。
選取「拒絕所有圖片」。
點選 [儲存政策]。
匯出政策 YAML 檔案:
gcloud container binauthz policy export > /tmp/policy.yaml
在文字編輯器中,將
evaluationMode
從ALWAYS_ALLOW
變更為ALWAYS_DENY
。政策 YAML 檔案應如下所示:
globalPolicyEvaluationMode: ENABLE defaultAdmissionRule: evaluationMode: ALWAYS_DENY enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG name: projects/PROJECT_ID/policy
將政策 YAML 檔案匯回二進位授權:
gcloud container binauthz policy import /tmp/policy.yaml
以 JSON 格式建立含有更新政策的文字檔:
cat > /tmp/policy.json << EOM { "name": "projects/${PROJECT_ID}/policy", "globalPolicyEvaluationMode": "ENABLE", "defaultAdmissionRule": { "evaluationMode": "ALWAYS_DENY", "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG" } } EOM
將更新後的政策傳送至 REST API:
curl -X PUT \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "x-goog-user-project: ${PROJECT_ID}" \ --data-binary @/tmp/policy.json \ "https://binaryauthorization.googleapis.com/v1/projects/${PROJECT_ID}/policy"
前往Google Cloud 控制台中的 GKE「Clusters」(叢集) 頁面。
按一下 [Deploy] (部署)。
控制台會提示您輸入部署作業的詳細資料。
選取「現有容器映像檔」。
輸入
us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
做為容器映像檔路徑。按一下「繼續」。
在「Application Name」(應用程式名稱) 欄位中輸入
hello-server
。按一下 [Deploy] (部署)。
- POD_NAME:Pod 的名稱。
- IMAGE_NAME:圖片名稱。
- ATTESTOR_NAME:驗證者名稱。
前往Google Cloud 控制台中的 GKE「Clusters」(叢集) 頁面。
選取
test-cluster
叢集,然後按一下「刪除」。- 使用
built-by-cloud-build
簽署者僅部署由 Cloud Build 建構的映像檔 (搶先版)。 - 如需有關要求認證的端對端教學課程,請參閱:
- 參閱DevOps相關資源,並探索 DevOps Research and Assessment (DORA) 研究計畫。
建立啟用二進位授權強制執行功能的叢集
現在,請建立啟用二進位授權的 GKE 叢集。這是要執行已部署容器映像檔的叢集。
二進位授權適用於 Autopilot 或 Standard 叢集。
Google Cloud 控制台
下列步驟會設定 Autopilot 叢集。
gcloud
執行 gcloud container clusters create
,並啟用 --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE
旗標。
gcloud container clusters create \ --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \ --zone us-central1-a \ test-cluster
建立叢集可能需要幾分鐘的時間。
預設政策
根據預設,二進位授權政策會允許部署所有容器映像檔。
Google Cloud 控制台
如要查看預設政策,請按照下列步驟操作:
gcloud
如要查看預設政策,請匯出政策 YAML 檔案,步驟如下:
gcloud container binauthz policy export
根據預設,檔案包含下列內容:
globalPolicyEvaluationMode: ENABLE defaultAdmissionRule: evaluationMode: ALWAYS_ALLOW enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG name: projects/PROJECT_ID/policy
REST API
如要查看預設政策,請以 JSON 格式擷取政策,方法如下:
curl \ -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \ -H "x-goog-user-project: ${PROJECT_ID}" \ "https://binaryauthorization.googleapis.com/v1/projects/${PROJECT_ID}/policy"
這項指令會產生下列輸出:
{ "name": "projects/PROJECT_ID/policy", "globalPolicyEvaluationMode": "ENABLE", "defaultAdmissionRule": { "evaluationMode": "ALWAYS_ALLOW", "enforcementMode": "ENFORCED_BLOCK_AND_AUDIT_LOG" } }
測試違規處置政策
您可以嘗試將範例容器映像檔部署至叢集,測試強制執行政策。
在本快速入門導覽課程中,您會使用位於 Artifact Registry us-docker.pkg.dev/google-samples/containers/gke/hello-app
路徑的範例容器映像檔。這是 Google 建立的公開容器映像檔,內含「Hello, World!」範例應用程式。
Google Cloud 控制台
如要測試政策,請按照下列步驟操作:
kubectl
如要測試政策,請按照下列步驟操作:
現在,請驗證二進位授權是否允許部署。
Google Cloud 控制台
如要確認映像檔已部署,請前往 Google Cloud 控制台的 GKE「Workloads」(工作負載) 頁面。
部署作業的工作負載會顯示綠色圖示,表示映像檔已成功部署。
kubectl
如要確認映像檔是否已部署,請執行下列操作:
kubectl get pods
指令會列印類似以下的訊息,表示部署作業已成功:
NAME READY STATUS RESTARTS AGE hello-server-579859fb5b-h2k8s 1/1 Running 0 1m
請務必刪除部署作業,才能繼續下一個步驟:
Google Cloud 控制台
如要刪除部署作業,請執行下列步驟:
kubectl
如要刪除部署作業,請執行下列步驟:
kubectl delete deployment hello-server
設定強制執行政策,禁止顯示所有圖片
現在,請修改政策,禁止部署所有圖片,而非允許。
Google Cloud 控制台
如要修改政策,請按照下列步驟操作:
gcloud
如要修改政策,請按照下列步驟操作:
REST API
如要修改政策,請按照下列步驟操作:
重新測試政策
再次將範例容器映像檔部署至叢集,測試政策。 這次,二進位授權會禁止部署映像檔。
Google Cloud 控制台
部署映像檔:
kubectl
部署映像檔:
kubectl run hello-server --image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080
現在可以確認政策是否遭到封鎖:
Google Cloud 控制台
如要確認映像檔未部署,請執行下列操作:
返回Google Cloud 控制台的 GKE「Workloads」(工作負載) 頁面。
容器映像檔的工作負載會顯示紅色圖示,表示映像檔部署失敗。
kubectl
如要確認映像檔未部署,請執行下列指令:
kubectl get pods
指令會列印下列訊息,指出映像檔未部署:
No resources found.
您可以取得部署作業的進一步詳細資料:
kubectl get event --template \ '{{range.items}}{{"\033[0;36m"}}{{.reason}}:{{"\033[0m"}}{{.message}}{{"\n"}}{{end}}'
你會看到類似以下的回應:
FailedCreate: Error creating: pods POD_NAME is forbidden: admission webhook "imagepolicywebhook.image-policy.k8s.io" denied the request: Image IMAGE_NAME denied by Binary Authorization default admission rule. Denied by always_deny admission rule
輸出內容如下:
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本頁所用資源的費用,請按照下列步驟操作。
刪除您在 GKE 中建立的叢集:
主控台
如要刪除叢集,請按照下列步驟操作:
gcloud
如要刪除叢集,請按照下列步驟操作:
gcloud container clusters delete \ --zone=us-central1-a \ test-cluster