保護 Cloud Run 和 Google Kubernetes Engine 的映像檔部署作業

本頁說明如何使用 Cloud Build,保護部署至 Cloud Run 和 Google Kubernetes Engine 的映像檔。

瞭解如何設定二進位授權,檢查建構認證並封鎖非由 Cloud Build 產生的映像檔部署作業。這個程序可降低部署未經授權軟體的風險。

事前準備

  1. 啟用 Cloud Build、二進位授權和 Artifact Registry API。

    啟用 API 時所需的角色

    如要啟用 API,您需要服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

    啟用 API

  2. 如要使用本指南提供的指令列範例,請安裝及設定 Google Cloud SDK

  3. 為平台設定二進位授權

使用二進位授權控管部署作業

二進位授權的政策是一組規則,可控管映像檔的部署作業。您可以設定規則,要求提供數位簽署的認證

Cloud Build 會在建構時產生並簽署認證。透過二進位授權,您可以使用built-by-cloud-build attestor 驗證認證,並只部署 Cloud Build 建構的映像檔。

如要在專案中建立 built-by-cloud-build 驗證者,請在該專案中執行建構作業。

如要只允許部署 Cloud Build 建構的映像檔,請執行下列步驟:

控制台

  1. 前往 Google Cloud 控制台的「Binary Authorization」(二進位授權) 頁面:

    前往二進位授權

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

  3. 在「編輯政策」對話方塊中,選取「僅接受下列所有驗證者均核准的映像檔」

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

  5. 在「新增認證者」對話方塊中,執行下列操作:

    1. 選取「依專案和驗證者名稱新增」,然後執行下列步驟:
      1. 在「專案名稱」欄位中,輸入您執行 Cloud Build 的專案。
      2. 按一下「認證者名稱」欄位,並注意 built-by-cloud-build 認證者是否可用。
      3. 按一下「built-by-cloud-build」。
    2. 或者,選取「依驗證者資源 ID 新增」。 在「驗證者資源 ID」中輸入

      projects/PROJECT_ID/attestors/built-by-cloud-build
      

      PROJECT_ID 替換為執行 Cloud Build 的專案。

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

  7. 點選 [儲存政策]

gcloud

  1. 使用下列指令,將現有政策匯出至檔案:

    gcloud container binauthz policy export > /tmp/policy.yaml
    
  2. 編輯政策檔案。

  3. 編輯下列任一規則:

    • defaultAdmissionRule
    • clusterAdmissionRules
    • istioServiceIdentityAdmissionRules
    • kubernetesServiceAccountAdmissionRules
  4. 如果規則中沒有 requireAttestationsBy 區塊,請新增一個。

  5. requireAttestationsBy 區塊中,新增

    projects/PROJECT_ID/attestors/built-by-cloud-build
    

    PROJECT_ID 替換為執行 Cloud Build 的專案。

  6. 儲存政策檔案。

  7. 匯入政策檔案。

    gcloud container binauthz policy import /tmp/policy.yaml
    

    以下是政策檔案範例,其中包含對 built-by-cloud-build-attestor 的參照:

    defaultAdmissionRule:
      evaluationMode: REQUIRE_ATTESTATION
      enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
      requireAttestationsBy:
        - projects/PROJECT_ID/attestors/built-by-cloud-build
    name: projects/PROJECT_ID/policy
    

    PROJECT_ID 替換為執行 Cloud Build 的專案 ID。

您可以在 GKECloud Run 的二進位授權記錄訊息中查看政策錯誤

使用模擬測試模式

在模擬測試模式下,二進位授權會檢查是否符合政策規定,但實際上不會封鎖部署作業。政策遵循狀態訊息會改為記錄至 Cloud Logging。您可以根據這些記錄檔判斷封鎖政策是否正常運作,並找出誤報。

如要啟用模擬測試,請按照下列步驟操作:

控制台

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

    前往二進位授權

  2. 點選「編輯政策」

  3. 在「預設規則」或特定規則中,選取「模擬測試模式」

  4. 點選 [儲存政策]

gcloud

  1. 將二進位授權政策匯出為 YAML 檔案:

    gcloud container binauthz policy export  > /tmp/policy.yaml
    
  2. 在文字編輯器中,將 enforcementMode 設為 DRYRUN_AUDIT_LOG_ONLY,然後儲存檔案。

  3. 如要更新政策,請執行下列指令匯入檔案:

    gcloud container binauthz policy import /tmp/policy.yaml
    

您可以在 GKECloud Run 的二進位授權記錄訊息中查看政策錯誤

限制

  • Cloud Build 和 Binary Authorization 必須位於相同專案中。 如果您在其他專案中執行部署平台,請為多專案設定設定 IAM 角色,並在 Binary Authorization 中新增 built-by-cloud-build 簽署者時,參照 Cloud Build 專案。

  • 使用明確的 docker push 建構步驟將映像檔推送至 Artifact Registry 時,Cloud Build 不會產生認證。請務必使用 docker build 建構步驟中的 images 欄位,將映像檔推送至 Artifact Registry。如要進一步瞭解 images,請參閱「在 Artifact Registry 中儲存映像檔的各種方式」。

  • 您必須為建構管道和部署管道使用不同的建構設定檔。這是因為 Cloud Build 只會在建構管道順利完成後,才會產生驗證。二進位授權會先檢查認證,再部署映像檔。

在私人集區中啟用認證

根據預設,Cloud Build 不會為私人集區中的建構作業產生二進位授權驗證。如要產生認證,請將 requestedVerifyOption: VERIFIED 選項新增至建構設定檔

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: [ 'build', '-t', 'us-central1-docker.pkg.dev/$PROJECT_ID/quickstart-docker-repo/quickstart-image:tag1', '.' ]
images:
- 'us-central1-docker.pkg.dev/$PROJECT_ID/quickstart-docker-repo/quickstart-image:tag1'
options:
  requestedVerifyOption: VERIFIED

新增 requestedVerifyOption 後,Cloud Build 會為映像檔啟用驗證產生功能和出處中繼資料

查看驗證者中繼資料

首次在專案中執行建構作業時,系統會建立驗證者。驗證者 ID 的格式為 projects/PROJECT_ID/attestors/built-by-cloud-build,其中 PROJECT_ID 是您的專案 ID。

您可以使用下列指令檢查建構認證者中繼資料:

curl -X GET -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://binaryauthorization.googleapis.com/v1beta1/projects/PROJECT_ID/attestors/built-by-cloud-build

PROJECT_ID 替換為您執行 Cloud Build 的專案。

輸出內容會包含認證者和相應公開金鑰的資訊。例如:

name": "projects/PROJECT_ID/attestors/built-by-cloud-build",
  "userOwnedDrydockNote": {
    "noteReference": "projects/PROJECT_ID/notes/built-by-cloud-build",
    "publicKeys": [
      {
        "id": "//cloudkms.googleapis.com/v1/projects/verified-builder/locations/asia/keyRings/attestor/cryptoKeys/builtByGCB/cryptoKeyVersions/1",
        "pkixPublicKey": {
          "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEMMvFxZLgIiWOLIXsaTkjTmOKcaK7\neIZrgpWHpHziTFGg8qyEI4S8O2/2wh1Eru7+sj0Sh1QxytN/KE5j3mTvYA==\n-----END PUBLIC KEY-----\n",
          "signatureAlgorithm": "ECDSA_P256_SHA256"
        }
      },
...
      }
    ],
    "delegationServiceAccountEmail": "service-942118413832@gcp-binaryauthorization.iam.gserviceaccount.com"
  },
  "updateTime": "2021-09-24T15:26:44.808914Z",
  "description": "Attestor autogenerated by build ID fab07092-30f4-4f70-caf7-4545cbc404d6"

後續步驟