開始使用 Google Cloud 控制台 (GKE)


本教學課程說明如何設定及測試需要認證的二進位授權政策。這類政策可定義哪些人可以在 Google Kubernetes Engine (GKE) 上部署容器映像檔,以及 GKE 允許部署哪些容器映像檔,藉此保護以容器為基礎的軟體供應鏈。

部署時,二進位授權會使用驗證者驗證認證中的數位簽章。認證是由簽署者在建構過程中建立。

在本教學課程中,GKE 叢集、認證和認證者都位於單一專案中。單一專案設定大多用於測試或實驗服務。如需更貼近實際情況的範例,請參閱多項專案的設定

下列步驟說明如何從 Google Cloud 控制台執行工作,以及如何使用 gcloud 指令執行部分工作。如要使用 gcloud 執行這些步驟,請參閱「開始使用 Google Cloud CLI」。

目標

在本教學課程中,您將瞭解以下內容:

  • 建立啟用二進位授權的 (GKE) 叢集
  • 建立驗證者,供二進位授權執行者用來驗證認證上的簽章
  • 設定需要認證的政策
  • 建立加密金鑰組,用於簽署驗證和稍後驗證
  • 簽署容器映像檔摘要,建立簽章
  • 使用簽章建立認證
  • 將容器映像檔部署至 GKE,測試政策

費用

在本文件中,您會使用 Google Cloud的下列計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用資格。

事前準備

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Container Registry, Artifact Analysis and Binary Authorization APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  7. To initialize the gcloud CLI, run the following command:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  9. Make sure that billing is enabled for your Google Cloud project.

  10. Enable the Container Registry, Artifact Analysis and Binary Authorization APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  13. To initialize the gcloud CLI, run the following command:

    gcloud init
  14. 安裝 kubectl

設定預設專案

為方便後續指令操作,請將 Google Cloud 專案 ID 儲存於環境變數中,如下所示:

PROJECT_ID=PROJECT_ID

其中 PROJECT_ID 是專案名稱。

如果未選取預設專案,請立即設定:

gcloud config set project ${PROJECT_ID}

建立啟用二進位授權功能的叢集

建立叢集

現在您可以建立啟用二進位授權的 GKE 叢集。您將在 GKE 區域 us-central1-a 中建立名為 test-cluster 的叢集。

如要建立叢集,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的 GKE 選單。

    前往 GKE

  2. 點選「建立叢集」

  3. 在「Name」(名稱) 欄位中輸入 test-cluster

  4. 在「位置類型」選項中選取「區域」

  5. 從「區域」下拉式清單中選取 us-central1-a

  6. 按一下 [Availability, networking, security, and additional features] (可用性、網路、安全性和其他功能)

  7. 在「安全性」專區中,選取「啟用二進位授權」

  8. 選取「僅強制執行」

  9. 點選「建立」

設定 kubectl

您也必須更新 kubectl 安裝的本機 kubeconfig 檔案。這會提供在 GKE 中存取叢集所需的憑證和端點資訊。

如要更新本機 kubeconfig 檔案,請按照下列步驟操作:

gcloud container clusters get-credentials \
    --zone us-central1-a \
    test-cluster

查看預設政策

二進位授權中的政策是一組規則,可控管容器映像檔的部署作業。每個專案只能有一項政策。 根據預設,這項政策會允許部署所有容器映像檔。

如要查看預設政策,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「二進位授權」頁面。

    前往二進位授權

  2. 按一下「編輯政策」

  3. 「專案預設規則」會顯示「允許所有圖片」選項。

  4. 點選 [儲存政策]

建立驗證者

驗證者是驗證機構,二進位授權執行者會在部署時使用驗證者,決定是否允許 GKE 部署相應的已簽署容器映像檔。驗證者包含公開金鑰,通常由負責軟體供應鏈安全的人員管理。

如要建立驗證者,請完成下列步驟:

  • 在二進位授權中建立驗證者
  • 在「構件分析」中自動產生相關聯的驗證者附註,儲存授權程序中使用的可信驗證中繼資料

在本教學課程中,您有一個名為 test-attestor 的認證者。在實際情況中,您可以擁有任意數量的認證者,每個認證者代表參與圖片授權程序的當事人。

產生金鑰組

二進位授權會使用加密編譯金鑰,安全地驗證簽署者的身分。確保只有授權的容器映像檔可以部署。金鑰組包含私密金鑰和公開金鑰。簽署者會使用私密金鑰簽署容器映像檔摘要,產生簽章並儲存在認證中。公開金鑰會儲存在認證者中。在部署時,二進位授權執行者會使用驗證者的公開金鑰,驗證認證中的簽章,然後允許部署容器。

在本教學課程中,您會使用公開金鑰基礎架構 (X.509) (PKIX) 格式的加密金鑰。本教學課程使用建議的橢圓曲線數位簽章演算法 (ECDSA),產生 PKIX 金鑰組。您也可以使用 RSA 或 PGP 金鑰簽署。如要進一步瞭解簽署演算法,請參閱金鑰用途與演算法一文。

Cloud Key Management Service (Cloud KMS) 產生及儲存的金鑰符合 PKIX 標準。如要進一步瞭解如何使用 PKIX 金鑰和 Cloud KMS,請參閱「使用 CLI 建立驗證者」。

如要產生 PKIX 金鑰組,請按照下列步驟操作:

  1. 建立私密金鑰:

    PRIVATE_KEY_FILE="/tmp/ec_private.pem"
    openssl ecparam -genkey -name prime256v1 -noout -out ${PRIVATE_KEY_FILE}
    
  2. 從私密金鑰中擷取公開金鑰:

    PUBLIC_KEY_FILE="/tmp/ec_public.pem"
    openssl ec -in ${PRIVATE_KEY_FILE} -pubout -out ${PUBLIC_KEY_FILE}
    

建立驗證者

現在您可以在 Binary Authorization 中建立驗證者,並關聯您建立的公開金鑰。

如要建立驗證者,請執行下列操作:

  1. 返回 Google Cloud 控制台的「Binary Authorization」(二進位授權) 頁面。

    返回二進位授權

  2. 在「Attestors」分頁中,按一下「Create」

    「政策」分頁的螢幕截圖,顯示預設規則

  3. 按照下方指示填入欄位:

    1. 在「Attestor name」(認證者名稱) 欄位中輸入 test-attestor

    2. 確認已勾選「Automatically create a Artifact Analysis note」(自動建立構件分析附註)

    3. 按一下「新增 PKIX 公開金鑰」

    4. 在文字編輯器中開啟 /tmp/ec_public.pem。這是您在上一個步驟中建立的公開金鑰檔案。將檔案內容複製到「公開金鑰內容」文字方塊。

    5. 按一下「簽章演算法」下拉式選單中的 Elliptic Curve P-256 - SHA256 Digest

    6. 按一下 [完成]

  4. 按一下「建立」來建立認證者。

  5. 儲存公開金鑰 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)')
    

設定政策

現在可以設定政策:

  1. 返回 Google Cloud 控制台的「二進位授權」頁面。

  2. 在「政策」分頁中,按一下「編輯政策」

  3. 選取「僅接受下列驗證者均核准的映像檔」

  4. 按一下「新增認證者」

  5. 按一下「依專案和驗證者名稱新增」

  6. 在「Project name」(專案名稱) 欄位中輸入 PROJECT_ID

  7. 在「Attestor name」(認證者名稱) 欄位中輸入 test-attestor

  8. 按一下「新增 1 位認證者」

  9. 點選 [儲存政策]

詳情請參閱「使用控制台設定政策」。

測試政策

您可以嘗試將範例容器映像檔部署到叢集,測試上述設定的政策。由於未進行必要的認證,政策會禁止部署作業。

在本教學課程中,您可以使用 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 中的範例映像檔建立認證。

如要建立認證,請執行下列步驟:

  1. 設定變數,儲存映像檔的登錄路徑和摘要,以及驗證者名稱:

    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}
    
  2. 產生認證酬載:

    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"
    }
    }
    
  3. 使用 PKIX 私密金鑰簽署酬載,並輸出簽章檔案:

    openssl dgst -sha256 -sign ${PRIVATE_KEY_FILE} /tmp/generated_payload.json > /tmp/ec_signature
    

    簽章檔案是您在上方建立的酬載 JSON 檔案的數位簽章版本。

  4. 建立及驗證認證:

    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 旗標會檢查您在政策中設定的認證者是否可驗證認證。

  5. 確認認證是否已建立:

    gcloud container binauthz attestations list \
        --attestor=$ATTESTOR_NAME --attestor-project=$PROJECT_ID
    

如要進一步瞭解如何建立認證,請參閱建立認證

重新測試政策

再次將範例容器映像檔部署到叢集,測試政策。 這次您必須使用摘要 (而非 1.0latest 等標記) 部署映像檔,因為二進位授權會使用摘要來查詢認證。在此,二進位授權允許部署映像檔,因為已完成必要的認證。

如要部署映像檔,請執行下列指令:

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

後續步驟