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

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

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

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

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

設定預設專案

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

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