保護 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 attestor 驗證認證,並只部署 Cloud Build 建構的映像檔。

如要在專案中建立 built-by-cloud-build 簽署人,請在該專案中執行建構作業。

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

控制台

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

    前往二進位授權

  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 不會為私人集區中的建構作業產生 Binary Authorization 驗證。如要產生認證,請將 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"

後續步驟