本頁說明如何使用 Cloud Build,保護部署至 Cloud Run 和 Google Kubernetes Engine 的映像檔。
瞭解如何設定二進位授權,檢查建構認證並封鎖非由 Cloud Build 產生的映像檔部署作業。這個程序可降低部署未經授權軟體的風險。
事前準備
啟用 Cloud Build、二進位授權和 Artifact Registry API。
啟用 API 時所需的角色
如要啟用 API,您需要服務使用情形管理員 IAM 角色 (
roles/serviceusage.serviceUsageAdmin),其中包含serviceusage.services.enable權限。瞭解如何授予角色。如要使用本指南提供的指令列範例,請安裝及設定 Google Cloud SDK。
使用二進位授權控管部署作業
二進位授權的政策是一組規則,可控管映像檔的部署作業。您可以設定規則,要求提供數位簽署的認證。
Cloud Build 會在建構時產生並簽署認證。透過二進位授權,您可以使用built-by-cloud-build attestor 驗證認證,並只部署 Cloud Build 建構的映像檔。
如要在專案中建立 built-by-cloud-build 驗證者,請在該專案中執行建構作業。
如要只允許部署 Cloud Build 建構的映像檔,請執行下列步驟:
控制台
前往 Google Cloud 控制台的「Binary Authorization」(二進位授權) 頁面:
在「政策」分頁中,按一下「編輯政策」。
在「編輯政策」對話方塊中,選取「僅接受下列所有驗證者均核准的映像檔」。
按一下「新增認證者」。
在「新增認證者」對話方塊中,執行下列操作:
- 選取「依專案和驗證者名稱新增」,然後執行下列步驟:
- 在「專案名稱」欄位中,輸入您執行 Cloud Build 的專案。
- 按一下「認證者名稱」欄位,並注意
built-by-cloud-build認證者是否可用。 - 按一下「
built-by-cloud-build」。
或者,選取「依驗證者資源 ID 新增」。 在「驗證者資源 ID」中輸入
projects/PROJECT_ID/attestors/built-by-cloud-build將
PROJECT_ID替換為執行 Cloud Build 的專案。
- 選取「依專案和驗證者名稱新增」,然後執行下列步驟:
按一下「新增 1 位認證者」。
點選 [儲存政策]。
gcloud
使用下列指令,將現有政策匯出至檔案:
gcloud container binauthz policy export > /tmp/policy.yaml編輯政策檔案。
編輯下列任一規則:
defaultAdmissionRuleclusterAdmissionRulesistioServiceIdentityAdmissionRuleskubernetesServiceAccountAdmissionRules
如果規則中沒有
requireAttestationsBy區塊,請新增一個。在
requireAttestationsBy區塊中,新增projects/PROJECT_ID/attestors/built-by-cloud-build將
PROJECT_ID替換為執行 Cloud Build 的專案。儲存政策檔案。
匯入政策檔案。
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。
您可以在 GKE 或 Cloud Run 的二進位授權記錄訊息中查看政策錯誤
使用模擬測試模式
在模擬測試模式下,二進位授權會檢查是否符合政策規定,但實際上不會封鎖部署作業。政策遵循狀態訊息會改為記錄至 Cloud Logging。您可以根據這些記錄檔判斷封鎖政策是否正常運作,並找出誤報。
如要啟用模擬測試,請按照下列步驟操作:
控制台
前往 Google Cloud 控制台的「二進位授權」頁面。
點選「編輯政策」。
在「預設規則」或特定規則中,選取「模擬測試模式」。
點選 [儲存政策]。
gcloud
將二進位授權政策匯出為 YAML 檔案:
gcloud container binauthz policy export > /tmp/policy.yaml在文字編輯器中,將
enforcementMode設為DRYRUN_AUDIT_LOG_ONLY,然後儲存檔案。如要更新政策,請執行下列指令匯入檔案:
gcloud container binauthz policy import /tmp/policy.yaml
您可以在 GKE 或 Cloud 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"
後續步驟
- 瞭解二進位授權。