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

本頁面提供使用 Cloud Build 將映像檔部署至 Cloud Run 和 Google Kubernetes Engine 的安全性指示。

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

事前準備

  1. Enable the Cloud Build, Binary Authorization, and Artifact Registry APIs.

    Enable the APIs

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

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

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

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

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

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

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

控制台

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

    前往「二進位授權」

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

  3. 在「Edit Policy」對話方塊中,選取「Allow only images that have been approved by all of the following attestors」

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

  5. 在「Add attestors」對話方塊中,執行下列操作:

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

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

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

  6. 按一下「Add 1 attestor」

  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 控制台的「Binary Authorization」(二進位授權) 頁面。

    前往「二進位授權」

  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 和二進位授權必須位於同一個專案中。如果您在其他專案中執行部署平台,請為多專案設定設定 IAM 角色,並在二進位授權中新增 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"

後續步驟