本教學課程說明如何設定及測試需要認證的二進位授權政策。這類政策可定義哪些人可以在 Google Kubernetes Engine (GKE) 上部署容器映像檔,以及 GKE 允許部署哪些容器映像檔,藉此保護以容器為基礎的軟體供應鏈。
部署時,二進位授權會使用驗證者驗證認證中的數位簽章。認證是由簽署者在建構過程中建立。
在本教學課程中,GKE 叢集、認證和認證者都位於單一專案中。單一專案設定大多用於測試或實驗服務。如需更貼近實際情況的範例,請參閱多項專案的設定。
下列步驟說明如何從 Google Cloud 控制台執行工作,以及如何使用 gcloud
指令執行部分工作。如要使用 gcloud
執行這些步驟,請參閱「開始使用 Google Cloud CLI」。
目標
在本教學課程中,您將瞭解以下內容:
- 建立啟用二進位授權的 (GKE) 叢集
- 建立驗證者,供二進位授權執行者用來驗證認證上的簽章
- 設定需要認證的政策
- 建立加密金鑰組,用於簽署驗證和稍後驗證
- 簽署容器映像檔摘要,建立簽章
- 使用簽章建立認證
- 將容器映像檔部署至 GKE,測試政策
費用
在本文件中,您會使用 Google Cloud的下列計費元件:
如要根據預測用量估算費用,請使用 Pricing Calculator。
事前準備
- 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.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Container Registry, Artifact Analysis and Binary Authorization APIs.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Container Registry, Artifact Analysis and Binary Authorization APIs.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- 安裝
kubectl
。
設定預設專案
為方便後續指令操作,請將 Google Cloud 專案 ID 儲存於環境變數中,如下所示:
PROJECT_ID=PROJECT_ID
其中 PROJECT_ID 是專案名稱。
如果未選取預設專案,請立即設定:
gcloud config set project ${PROJECT_ID}
建立啟用二進位授權功能的叢集
建立叢集
現在您可以建立啟用二進位授權的 GKE 叢集。您將在 GKE 區域 us-central1-a
中建立名為 test-cluster
的叢集。
如要建立叢集,請按照下列步驟操作:
前往 Google Cloud 控制台的 GKE 選單。
點選「建立叢集」。
在「Name」(名稱) 欄位中輸入
test-cluster
。在「位置類型」選項中選取「區域」。
從「區域」下拉式清單中選取
us-central1-a
。按一下 [Availability, networking, security, and additional features] (可用性、網路、安全性和其他功能)。
在「安全性」專區中,選取「啟用二進位授權」。
選取「僅強制執行」。
點選「建立」。
設定 kubectl
您也必須更新 kubectl
安裝的本機 kubeconfig
檔案。這會提供在 GKE 中存取叢集所需的憑證和端點資訊。
如要更新本機 kubeconfig
檔案,請按照下列步驟操作:
gcloud container clusters get-credentials \ --zone us-central1-a \ test-cluster
查看預設政策
二進位授權中的政策是一組規則,可控管容器映像檔的部署作業。每個專案只能有一項政策。 根據預設,這項政策會允許部署所有容器映像檔。
如要查看預設政策,請按照下列步驟操作:
前往 Google Cloud 控制台的「二進位授權」頁面。
按一下「編輯政策」。
「專案預設規則」會顯示「允許所有圖片」選項。
點選 [儲存政策]。
建立驗證者
驗證者是驗證機構,二進位授權執行者會在部署時使用驗證者,決定是否允許 GKE 部署相應的已簽署容器映像檔。驗證者包含公開金鑰,通常由負責軟體供應鏈安全的人員管理。
如要建立驗證者,請完成下列步驟:
- 在二進位授權中建立驗證者
- 在「構件分析」中自動產生相關聯的驗證者附註,儲存授權程序中使用的可信驗證中繼資料
在本教學課程中,您有一個名為 test-attestor
的認證者。在實際情況中,您可以擁有任意數量的認證者,每個認證者代表參與圖片授權程序的當事人。
產生金鑰組
二進位授權會使用加密編譯金鑰,安全地驗證簽署者的身分。確保只有授權的容器映像檔可以部署。金鑰組包含私密金鑰和公開金鑰。簽署者會使用私密金鑰簽署容器映像檔摘要,產生簽章並儲存在認證中。公開金鑰會儲存在認證者中。在部署時,二進位授權執行者會使用驗證者的公開金鑰,驗證認證中的簽章,然後允許部署容器。
在本教學課程中,您會使用公開金鑰基礎架構 (X.509) (PKIX) 格式的加密金鑰。本教學課程使用建議的橢圓曲線數位簽章演算法 (ECDSA),產生 PKIX 金鑰組。您也可以使用 RSA 或 PGP 金鑰簽署。如要進一步瞭解簽署演算法,請參閱金鑰用途與演算法一文。
Cloud Key Management Service (Cloud KMS) 產生及儲存的金鑰符合 PKIX 標準。如要進一步瞭解如何使用 PKIX 金鑰和 Cloud KMS,請參閱「使用 CLI 建立驗證者」。
如要產生 PKIX 金鑰組,請按照下列步驟操作:
建立私密金鑰:
PRIVATE_KEY_FILE="/tmp/ec_private.pem" openssl ecparam -genkey -name prime256v1 -noout -out ${PRIVATE_KEY_FILE}
從私密金鑰中擷取公開金鑰:
PUBLIC_KEY_FILE="/tmp/ec_public.pem" openssl ec -in ${PRIVATE_KEY_FILE} -pubout -out ${PUBLIC_KEY_FILE}
建立驗證者
現在您可以在 Binary Authorization 中建立驗證者,並關聯您建立的公開金鑰。
如要建立驗證者,請執行下列操作:
返回 Google Cloud 控制台的「Binary Authorization」(二進位授權) 頁面。
在「Attestors」分頁中,按一下「Create」。
按照下方指示填入欄位:
在「Attestor name」(認證者名稱) 欄位中輸入
test-attestor
。確認已勾選「Automatically create a Artifact Analysis note」(自動建立構件分析附註)。
按一下「新增 PKIX 公開金鑰」。
在文字編輯器中開啟
/tmp/ec_public.pem
。這是您在上一個步驟中建立的公開金鑰檔案。將檔案內容複製到「公開金鑰內容」文字方塊。按一下「簽章演算法」下拉式選單中的
Elliptic Curve P-256 - SHA256 Digest
。按一下 [完成]。
按一下「建立」來建立認證者。
儲存公開金鑰 ID。
將驗證者公開金鑰 ID 新增至驗證者後,請使用
gcloud container binauthz attestors describe ${ATTESTOR_NAME}
查看。如要建立環境變數來儲存公開金鑰 ID,請執行下列指令:ATTESTOR_NAME=test-attestor PUBLIC_KEY_ID=$(gcloud container binauthz attestors describe ${ATTESTOR_NAME}\ --format='value(userOwnedGrafeasNote.publicKeys[0].id)')
設定政策
現在可以設定政策:
返回 Google Cloud 控制台的「二進位授權」頁面。
在「政策」分頁中,按一下「編輯政策」。
選取「僅接受下列驗證者均核准的映像檔」。
按一下「新增認證者」。
按一下「依專案和驗證者名稱新增」。
在「Project name」(專案名稱) 欄位中輸入 PROJECT_ID。
在「Attestor name」(認證者名稱) 欄位中輸入
test-attestor
。按一下「新增 1 位認證者」。
點選 [儲存政策]。
詳情請參閱「使用控制台設定政策」。
測試政策
您可以嘗試將範例容器映像檔部署到叢集,測試上述設定的政策。由於未進行必要的認證,政策會禁止部署作業。
在本教學課程中,您可以使用 Artifact Registry 中的範例圖片。Artifact Registry 中的映像檔位於 us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
路徑。路徑包含 Google 建立的公開映像檔,其中含有「Hello, World!」範例應用程式。
如要嘗試部署映像檔,請執行下列指令:
kubectl run hello-server --image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 --port 8080
現在,請驗證二進位授權是否封鎖了部署作業:
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. Image IMAGE_NAME denied by ATTESTOR_NAME: No attestations found
輸出內容如下:
- POD_NAME:Pod 的名稱。
- IMAGE_NAME:圖片名稱。
- ATTESTOR_NAME:驗證者名稱。
請務必刪除部署作業,才能繼續執行下一個步驟:
kubectl delete deployment hello-server
建立認證
認證是由簽署人建立的數位文件,可證明 GKE 有權部署相關聯的容器映像檔。建立認證的程序有時稱為「簽署映像檔」。
在本教學課程中,您會為 Artifact Registry 中的範例映像檔建立認證。
如要建立認證,請執行下列步驟:
設定變數,儲存映像檔的登錄路徑和摘要,以及驗證者名稱:
Artifact Registry
IMAGE_PATH="us-docker.pkg.dev/google-samples/containers/gke/hello-app" IMAGE_DIGEST="sha256:37e5287945774f27b418ce567cd77f4bbc9ef44a1bcd1a2312369f31f9cce567" ATTESTOR="test-attestor" IMAGE_TO_ATTEST=${IMAGE_PATH}@${IMAGE_DIGEST}
產生認證酬載:
Artifact Registry
gcloud container binauthz create-signature-payload \ --artifact-url=${IMAGE_PATH}@${IMAGE_DIGEST} > /tmp/generated_payload.json
酬載 JSON 檔案包含下列內容:
{ "critical": { "identity": { "docker-reference": "us-docker.pkg.dev/google-samples/containers/gke/hello-app" }, "image": { "docker-manifest-digest": "sha256:37e5287945774f27b418ce567cd77f4bbc9ef44a1bcd1a2312369f31f9cce567" }, "type": "Google cloud binauthz container signature" } }
使用 PKIX 私密金鑰簽署酬載,並輸出簽章檔案:
openssl dgst -sha256 -sign ${PRIVATE_KEY_FILE} /tmp/generated_payload.json > /tmp/ec_signature
簽章檔案是您在上方建立的酬載 JSON 檔案的數位簽章版本。
建立及驗證認證:
gcloud container binauthz attestations create \ --project="${PROJECT_ID}" \ --artifact-url="${IMAGE_TO_ATTEST}" \ --attestor="projects/${PROJECT_ID}/attestors/${ATTESTOR_NAME}" \ --signature-file=/tmp/ec_signature \ --public-key-id="${PUBLIC_KEY_ID}" \ --validate
其中
PUBLIC_KEY_ID
是您在上方「產生 PKIX 金鑰組」中找到的公開金鑰 ID。validate
旗標會檢查您在政策中設定的認證者是否可驗證認證。確認認證是否已建立:
gcloud container binauthz attestations list \ --attestor=$ATTESTOR_NAME --attestor-project=$PROJECT_ID
如要進一步瞭解如何建立認證,請參閱建立認證。
重新測試政策
再次將範例容器映像檔部署到叢集,測試政策。
這次您必須使用摘要 (而非 1.0
或 latest
等標記) 部署映像檔,因為二進位授權會使用摘要來查詢認證。在此,二進位授權允許部署映像檔,因為已完成必要的認證。
如要部署映像檔,請執行下列指令:
kubectl run hello-server --image ${IMAGE_PATH}@${IMAGE_DIGEST} --port 8080
如要確認映像檔是否已部署,請執行下列指令:
kubectl get pods
指令會列印類似以下的訊息,表示部署作業已成功:
NAME READY STATUS RESTARTS AGE hello-server-579859fb5b-h2k8s 1/1 Running 0 1m
如要刪除 Pod,請執行下列指令:
kubectl delete pod hello-server
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本教學課程中所用資源的相關費用,請刪除含有該項資源的專案,或者保留專案但刪除個別資源。
刪除您在 GKE 中建立的叢集:
gcloud container clusters delete \ --zone=us-central1-a \ test-cluster
後續步驟
- 進一步瞭解二進位授權
- 瞭解二進位授權使用的重要概念
- 使用
built-by-cloud-build
簽署者只部署 Cloud Build 建構的映像檔。 - 瞭解如何在 Kubernetes 資訊清單中使用映像檔摘要
- 啟用模擬測試模式以停用強制執行